投稿時間:2022-05-16 00:19:04 RSSフィード2022-05-16 00:00 分まとめ(23件)

カテゴリー等 サイト名等 記事タイトル・トレンドワード等 リンクURL 頻出ワード・要約等/検索ボリューム 登録日
IT 気になる、記になる… 「iOS 16」では複数の純正アプリが刷新される?? − 著名記者が報告 https://taisy0.com/2022/05/15/156984.html apple 2022-05-15 14:55:54
python Pythonタグが付けられた新着投稿 - Qiita This version of ChromeDriver only supports Chrome version ◯◯な時、君はどうする!? https://qiita.com/tat_mae084/items/b2d06a6dfbcdbc6e8174 iumcommonexceptionsse 2022-05-15 23:38:23
python Pythonタグが付けられた新着投稿 - Qiita pytorchによる複数の物体検知とその追跡 https://qiita.com/grapefruit_0514/items/f0a61b09b9670f6c8c9e classification 2022-05-15 23:03:00
AWS AWSタグが付けられた新着投稿 - Qiita AWS Control Towerで設定されたAWS Configの料金が高騰したのでどうにかした話 https://qiita.com/leonis_sk/items/45949b268dfa43fac5f6 awsconfig 2022-05-15 23:42:50
Linux CentOSタグが付けられた新着投稿 - Qiita CentOS7でLAMP環境構築 Linux, Apache, MariaDB(MySQL), PHP(Laravel) https://qiita.com/sakamoto051eng/items/0ace43310bdc3f94417c localhostuseraddsakamoto 2022-05-15 23:32:25
技術ブログ Developers.IO CDKでAWS Backupを使用してEC2のバックアップをしてみた。 https://dev.classmethod.jp/articles/ec2-backup-using-aws-backup-with-cdk/ awsbackup 2022-05-15 14:01:38
海外TECH MakeUseOf 6 Practical and Real-World Applications of Linux https://www.makeuseof.com/practical-applications-of-linux/ applications 2022-05-15 15:00:13
海外TECH MakeUseOf 11 Must-Have Apps for Book Lovers https://www.makeuseof.com/tag/mobile-apps-book-lovers/ books 2022-05-15 14:45:13
海外TECH MakeUseOf 5 Reasons Soundboks Bluetooth Speakers Are Perfect for Powering Your Party https://www.makeuseof.com/soundboks-bluetooth-speakers-party/ concert 2022-05-15 14:30:13
海外TECH DEV Community Some Motivation! https://dev.to/koladev/some-motivation-3k9i Some Motivation Not writing something technical today I am working on learning more about markdoc from Stripe but also how to use React Native and RevenueCAT extension for Firebase But I ll just add a simple motivation image for people learning to program struggling with life and other stuff Stay strong 2022-05-15 14:34:42
海外TECH DEV Community How I Built a Music Player to Showcase my own Tracks 🎵😍 https://dev.to/madza/how-i-built-a-music-player-to-showcase-my-own-tracks-3268 How I Built a Music Player to Showcase my own Tracks A while ago I built my portfolio and I wrote a custom audio player to showcase my tracks Since then quite a few people have been interested in its technical implementation I ve always replied I might write a full length tutorial for it yet the strict deadline for it was never set In April I saw a Writeathon being announced by Hashnode and one of the entrance categories being Web applications I knew this was a perfect opportunity to enter and finally get the job done I m glad I stumbled upon it since it really motivated me This article would be beneficial not only for the practical end result you will get but also for educational purposes for people that are looking to switch careers to app development or explore the React ecosystem due to the following couple of reasons I will show the full app creation cycle from feature planning wireframing and designing to creating components implementing logic adding responsiveness and deploying the app It will teach you how to think in React which is quite a big transition when switching from Vanilla JavaScript for example You will learn how to set up and structure React app as well as some of the best practices and thinking patterns of the library Here is the deployed preview and use of the music player on my portfolio to get you an insight into what we will be building in this tutorial The source code of the audio player is open source I have also made an NPM package out of it so you can easily set it up in your existing projects as well Planning the featuresThe most basic audio players usually come with a minimal set of features like a play pause button volume or progress controls which might be a good solution if you want to play a single track and do not have to match the player to the design of the site Though if you care for some extra functionality and the experience of your end users chances are you will want some advanced solution In this tutorial we will be focusing on a more complex case where you have multiple tracks to showcase need to implement a way to quickly find or filter them and want to control the behavior of the play order The full list of features we will implement include Play and Pause audio Next and Previous tracks Repeat the track Shuffle track order Progress slider Time left Total time Volume slider Search track Filter tracks by genre Playlist items Creating a wireframeThe audio player will use a straightforward user interface with different functionalities divided into separate components This will make the audio player intuitive and improve the overall user experience when interacting with it The whole wireframe of the app will look like this We will use Template components as the main containers for the children If the children include other elements themselves they will be wrapped in Box components The whole app will be wrapped into the PageTemplate wrapper which will include the children components TagsTemplate Search PlayerTemplate and PlaylistTemplate TagsTemplate will further include the children TagItem PlayerTemplate will include TitleAndTimeBox Progress and ButtonsAndVolumeBox while the PlaylistTemplate will include PlaylistItem component Even further the TitleAndTimeBox component will include Title and Time components while ButtonsAndVolumeBox will include ButtonsBox and Volume components Finally ButtonsBox will include all the Button components for user controls Designing the appThe design of the audio player will be based on maximum accessibility so that all of the information is easy to read and all action buttons are easy to distinguish from the background panels of the player To achieve that the following color scheme will be used The tags will have a purple background color to give them an accent to the main color scheme used in the rest of the audio player This will give a great notice to the user about the included genres of the tracks To further improve the user experience they will change the background color to green on the hover event The search will have a dark background with the grey placeholder text displayed on it The placeholder text color will be less accented from the rest of the text purposely in order to notify the user that the input value is expected Once typed in the input text will be displayed in white The player itself will have a dark background color and all the included text for the track title and time will be white to give maximum contrast Further all the icons in the player will be in white as well so they stand out from the dark background For the progress bar and volume slider the used progress will be in white while the left progress will be in a darker shade The slider knobs will use the same background color as the tags so the user is notified that they can interact with them Finally all the playlist items will have a dark background as well To give the accent to the currently played track it will have a white color while the rest of the inactive tracks in the playlist will have the same color as the search placeholder FontsThree different font families will be used for the audio player Down below I will describe which elements will use what font families and give a preview with some sample text The tag text and the current total time components will use Varela round font The track title search placeholder value and the active playlist items will use Quicksand font The inactive playlist items will use the Poppins font If you want to use any other font families feel free to choose some alternatives in Google fonts There are tons of fonts to choose from just make sure to replace them in the style sheets where they will be used in the project Setting up React appTo get started with a boilerplate we will use Create React App which is an officially supported CLI tool that lets you create a new ReactJS project within a minute or less Open your terminal and run the following command npx create react app latest audio player Wait a couple of minutes and the terminal wizard should finish installing the necessary dependencies for the project Then change your current working directory into the newly created project folder by running cd audio player and run npm start to start the development server Now open your browser navigate to http localhost and you should be presented with the ReactJS app template which looks like this Switch back to the project and see the files folder tree Navigate to the src directory and remove all the files from it currently since we are be creating everything from scratch Set the basis of the appWe will first create the root file of the app that will render the whole application To do that navigate to the src folder and create a new file index js Make sure to include the following code import React from react import ReactDOM from react dom client import index css import Player from App const tracks url title Madza Chords of Life tags house url title Madza Late Night Drive tags dnb url title Madza Persistence tags dubstep const root ReactDOM createRoot document getElementById root root render lt React StrictMode gt lt Player trackList tracks gt lt React StrictMode gt First we imported React and ReactDOM so we are able to create a render function in the file We also imported the stylesheet file which we will create after we are done creating this file as well as already included the Player component where our app logic will live For each track we will need its source title and tags so we already created an array of objects consisting of three sample tracks that will be passed in the Player component as a prop The audio source is from my deployed example project so you don t have to search for audio tracks online Alternatively you can upload some local files into the project and link to them Next while in src folder create a new file index css and include these style rules import url Round amp display swap import url wght amp display swap import url display swap padding margin box sizing border box body background color root tagsBackground f tagsText ffffff tagsBackgroundHoverActive cca tagsTextHoverActive ffffff searchBackground f searchText ffffff searchPlaceHolder a playerBackground f titleColor ffffff timeColor ffffff progressSlider f progressUsed ffffff progressLeft volumeSlider f volumeUsed ffffff volumeLeft playlistBackground f playlistText a playlistBackgroundHoverActive f playlistTextHoverActive ffffff First we imported Varela Round Quicksand and Poppins fonts from Google fonts Then we reset the rules for all elements on the app to make sure all the elements look the same on every browser We removed the padding and margin as well as configured the box sizing to include padding and margin in the width and height Finally we set the body background color and created a global color scheme that we will use throughout the entire app Thanks to the root selector each of the colors can later be accessed via var property Downloading iconsIn order to deliver a great user experience for audio controls we will use PNG icons for play pause loop shuffle playlist order and switch to previous and next tracks In order to keep track of the states for loop and shuffle buttons the white icon will be used for inactive while the grey one will be used for the active state I have compiled a downloadable pack with all the icons which you can download here Make sure extract the folder and include it in the src directory Alternatively you can download your own icons on websites like flaticon com or icons com Just make sure you rename them the same as in the download pack above Creating the ComponentsIn our audio player we will use components For most of the components we will create separate JS and CSS module files You can create them manually though I would recommend running the following command that will create everything you need in seconds mkdir components amp amp cd components amp amp touch PageTemplate js TagsTemplate js TagsTemplate module css TagItem js TagItem module css Search js Search module css PlayerTemplate js PlayerTemplate module css TitleAndTimeBox js TitleAndTimeBox module css Title js Title module css Time js Time module css Progress js Progress module css ButtonsAndVolumeBox js ButtonsAndVolumeBox module css ButtonsBox js ButtonsBox module css Loop js Loop module css Previous js Previous module css Play js Play module css Pause js Pause module css Next js Next module css Shuffle js Shuffle module css Volume js Volume module css PlaylistTemplate js PlaylistTemplate module css PlaylistItem js PlaylistItem module css Once all the components are created let s populate each of them with code and style rules Open PageTemplate js and include the following code export const PageTemplate children gt return lt div gt children lt div gt This is a main wrapper component for the app that will include all the children components we will create in the upcoming steps Open TagsTemplate js and include the following code import styles from TagsTemplate module css export const TagsTemplate children gt return lt div className styles wrapper gt children lt div gt This will be a wrapper component for all the tags we will use and will make sure they follow a proper layout Open the TagsTemplate module css and include the following style rules wrapper width margin px auto height auto color var primaryText display inline block text align center We first set the width to take all the available width in the wrapper added some margin to the top and bottom set the color to be used in the tag s text align it to the center and made sure the tags will be shown as inline elements horizontally Open TagItem js and include the following code import styles from TagItem module css export const TagItem status onClick tag gt return lt div className styles tag status active styles active onClick onClick gt tag lt div gt These will be the tag components themselves Each will receive the status prop to control which of the tag is active via custom styling rules the onClick prop that will describe what happens when the tags are being clicked on and the tag prop to give a title for each tag Open the TagItem module css and include the following style rules tag background color var tagsBackground color var tagsText height px min width px display inline grid place items center margin px px transition transform s padding px font family Varela Round sans serif border radius px font size px active background color var tagsBackgroundHoverActive color var tagsTextHoverActive tag hover background color var tagsBackgroundHoverActive color var tagsTextHoverActive cursor pointer transform scale We set the background and text color defined the height and width centered the content added some margin and padding set the font size and added some rounded corners for the playlist items For the active tags we set different backgrounds and text colors For the hovered tags we also set a different color for background and text as well as added some size scaling and changed the cursor to the pointer Open Search js and include the following code import styles from Search module css export const Search onChange value placeholder gt return lt input type text className styles search onChange onChange value value placeholder placeholder gt The search component will have an onChange prop that will describe the behavior when the input value is being changed the value prop to track the value being entered and the placeholder prop to display the placeholder text when there is no input in the search bar Open the Search module css and include the following style rules search font family Quicksand sans serif height px border none font size px width margin auto px auto background color var searchBackground color var searchText padding left px border radius px search placeholder color var searchPlaceHolder We set the font family font size and color for the text and specific height of the bar and made sure it uses all the available width of the parent We also added some margin to the bottom and the padding to the left as well as removed the default border and set rounded corners For the placeholder value we set the text color Open PlayerTemplate js and include the following code import styles from PlayerTemplate module css export const PlayerTemplate children gt return lt div className styles wrapper gt children lt div gt This will be the main wrapper for the player component that will include all of the children and sub children components Open the PlayerTemplate module css and include the following style rules wrapper border radius px padding px background color var playerBackground overflow auto font family Quicksand sans serif In the style rules we made sure the wrapper has some left and right padding dark background color specific font family nice rounded corners and auto overflow behavior Open TitleAndTimeBox js and include the following code import styles from TitleAndTimeBox module css export const TitleAndTimeBox children gt return lt div className styles wrapper gt children lt div gt This is the first children component for the player wrapper and will include the title and time components Open the TitleAndTimeBox module css and include the following style rules wrapper display grid grid template columns auto px margin px px We made sure the wrapper uses the grid layout splitting the available with into two columns where the left column is calculated from the available space subtracting the width from the right column which is set to be px We also made sure there is some top and bottom margin for the wrapper Open Title js and include the following code import styles from Title module css export const Title title gt return lt h className styles title gt title lt h gt The title component will include the title prop which will display the name of the track Open the Title module css and include the following style rules title color var titleColor font size px We set the color for the title and set the specific font size for it Open Time js and include the following code import styles from Time module css export const Time time gt return lt h className styles time gt time lt h gt The time component will receive the time prop that will display the played and the total time of the track Open the Time module css and include the following style rules time font family Varela Round sans serif color var timeColor text align right font size px We set the font family size and color for the text and aligned it to the right Open Progress js and include the following code import styles from Progress module css export const Progress value onChange onMouseUp onTouchEnd gt return lt div className styles container gt lt input type range min max step value value className styles slider id myRange onChange onChange onMouseUp onMouseUp onTouchEnd onTouchEnd style background linear gradient deg var progressUsed Math floor value var progressLeft Math floor value gt lt div gt The progress component will receive the value prop to get the current value of the range the onChange prop to control the behavior when the slider knob is dragged the onMouseUp prop to pass the event when the user releases a mouse button and the onTouchEnd prop for events when one or more touchpoints are removed from the touch surface for touchscreen devices We also set the minimum value of the range to be and the maximum to be with the increase step of To make the used progress and left progress in different colors we set custom styling and included a linear gradient background with a degree angle Open the Progress module css and include the following style rules container display grid place items center margin bottom px slider webkit appearance none width height px border radius px slider webkit slider thumb webkit appearance none width px height px border radius background var progressSlider cursor pointer slider moz range thumb width px height px border radius background var progressSlider cursor pointer We wrapped the progress bar component and centered it in the grid layout also setting some bottom margin to separate the progress bar from the below components We set the slider bar itself to take all of the available width of the parent set its height removed the default styling and added some border radius to both ends of the bar For the slider knob itself we removed its default styling set its background color to be the same as the tags added a fixed width and height made the knob a circle and set the cursor to be a pointer when interacting with it Open ButtonsAndVolumeBox js and include the following code import styles from ButtonsAndVolumeBox module css export const ButtonsAndVolumeBox children gt return lt div className styles wrapper gt children lt div gt This will be a wrapper component that will include the button box and volume bar Open the ButtonsAndVolumeBox module css and include the following style rules wrapper display grid grid template columns auto margin bottom px We made sure the wrapper uses the grid layout and separated it into two columns where the one on the right is percent while the other one on the left takes the rest of the available space We also set some margin to the bottom to separate it from the components below Open ButtonsBox js and include the following code import styles from ButtonsBox module css export const ButtonsBox children gt return lt div className styles wrapper gt children lt div gt This component will include all the buttons for audio controls as children Open the ButtonsBox module css and include the following style rules wrapper display grid grid template columns repeat auto place items center We made sure we use the grid layout and separated the available space into five columns that are equal in their width We also centered the items in the columns Open Loop js and include the following code import styles from Loop module css export const Loop src onClick gt return lt img className styles loop src src onClick onClick gt The loop component will be used to loop the current track after it s finished playing It will receive the src prop that will provide the source for the loop icon and the onClick prop that will receive the action function when it gets clicked Open the Loop module css and include the following style rules loop width px height px transition transform s loop hover cursor pointer transform scale We set the specific width and height for the icon and added a nice transition effect so that when the user hovers over the icon it gets zoomed in a bit Also when the user hovers over the icon the cursor will change to a pointer Open Previous js and include the following code import styles from Previous module css export const Previous src onClick gt return lt img className styles previous src src onClick onClick gt This component will allow us to switch to the previous track It will receive the src prop for the source of the icon and the onClick prop for the action when it gets clicked Open the Previous module css and include the following style rules previous width px height px transition transform s previous hover cursor pointer transform scale We set a bigger width and height size than the loop component We also added the size transition on hover as well as the pointer for the cursor Open Play js and include the following code import styles from Play module css export const Play src onClick gt return lt img className styles play src src onClick onClick gt The play component will allow us to play the tracks It will receive the src prop for the source of the icon as well as the onClick prop for the action when it gets clicked Open the Play module css and include the following style rules play width px height px transition transform s play hover cursor pointer transform scale We set an even bigger size for the width and height of the icon to accent it more Same as before we added the size increase and cursor change on hover Open Pause js and include the following code import styles from Pause module css export const Pause src onClick gt return lt img className styles pause src src onClick onClick gt The pause component will let us stop the audio It will receive the src prop for the icon source and the onClick prop for the action when it gets clicked Open the Pause module css and include the following style rules pause width px height px transition transform s pause hover cursor pointer transform scale We set the same width and height as for the play component as well as included the size increase and pointer for the cursor on hover Open Next js and include the following code import styles from Next module css export const Next src onClick gt return lt img className styles next src src onClick onClick gt This component will allow us to switch to the next tracks It will receive the src prop for the icon source and the onClick prop for the action when it gets clicked Open the Next module css and include the following style rules next width px height px transition transform s next hover cursor pointer transform scale We set the same width and height as for the component that lets us switch to previous tracks Also we added the size increase of the icon and cursor change on the hover Open Shuffle js and include the following code import styles from Shuffle module css export const Shuffle src onClick gt return lt img className styles shuffle src src onClick onClick gt The final button component will be the shuffle which will allow us to mix the order of the playlist tracks The src prop will be for the icon source and the onClick prop will receive an action when it gets clicked Open the Shuffle module css and include the following style rules shuffle width px height px transition transform s shuffle hover cursor pointer transform scale We set the width and the height for the icon to be the same as for the loop component Finally we added the size increase effect and changed the cursor to the pointer on hover Open Volume js and include the following code import styles from Volume module css export const Volume onChange value gt return lt div className styles wrapper gt lt input type range min max defaultValue className styles slider id myRange onChange onChange style background linear gradient deg var volumeUsed value var volumeLeft value gt lt div gt The volume component will allow us to change the volume of the audio being played It will receive the onChange prop that will allow us to pass the action when the slider is being changed as well as the value prop that will let us track its current value of it It will use the input range with the minimal value of and the maximum of with the increase and decrease of the step of Similarly as for the progress component earlier in order to display the used and left part of the range in a different color we used the linear gradient Open the Volume module css and include the following style rules wrapper display grid place items center min height px slider webkit appearance none width height px border radius px background var volumeSlider slider webkit slider thumb webkit appearance none width px height px border radius background var volumeSlider cursor pointer slider moz range thumb width px height px border radius background var volumeSlider cursor pointer We wrapped the volume bar into the container with a grid layout and centered it We also set the height for it to fit in the parent layout For the slider itself we first removed the default styling then set it to use the percent of the available space and set the specific height We also added a border radius for rounded corners of the slider and set the background color For the slider knob we removed the custom styling and set the same background as for the progress component We also made it round though made it smaller than the one in the progress component Finally we will use a pointer effect for the cursor on hover Open PlaylistTemplate js and include the following code import styles from PlaylistTemplate module css export const PlaylistTemplate children gt return lt div className styles wrapper gt children lt div gt This component will be the wrapper for all the playlist items Open the PlaylistTemplate module css and include the following style rules wrapper margin px auto max height px min height px overflow x hidden padding right px font family Quicksand sans serif wrapper webkit scrollbar width px wrapper webkit scrollbar track border radius px wrapper webkit scrollbar thumb background var primaryText border radius px We made sure we set some margin to the top and the bottom set the height set the overflow on the x axis to be hidden added some padding to the left and set the font family for the text of the included playlist items The user will be allowed to scroll if some of the playlist items are outside the height of the playlist wrapper For that we created a custom scrollbar We set its width border radius and background color Open PlaylistItem js and include the following code import styles from PlaylistItem module css export const PlaylistItem status data key src title onClick gt return lt p className styles item status active styles active data key data key src src title title onClick onClick gt title lt p gt This is the actual playlist item that will receive the status prop to control the active item the data key prop so we can later identify it the src prop for the audio source the title prop to display the title of the audio and the onClick prop to control the behavior on the click Open the PlaylistItem module css and include the following style rules item background color var playlistBackground color var playlistText text align center margin px padding px border radius px font size px font family Poppins sans serif active color var playlistTextHoverActive font family Quicksand sans serif font size px item hover color var playlistTextHoverActive cursor pointer We set custom background and text color aligned the text to be displayed in the center set some margin and padding set font size and family as well as added some rounded corners For the active items we changed the text color as well as font size and family We also set different text colors for the items on hover and changed the cursor to a pointer Putting the logic togetherNow navigate back to the src folder and create the App js which will be the main file where our music player logic will live Include the following code import useState useEffect useRef from react import PageTemplate from components PageTemplate import TagsTemplate from components TagsTemplate import TagItem from components TagItem import Search from components Search import PlayerTemplate from components PlayerTemplate import TitleAndTimeBox from components TitleAndTimeBox import Title from components Title import Time from components Time import Progress from components Progress import ButtonsAndVolumeBox from components ButtonsAndVolumeBox import ButtonsBox from components ButtonsBox import Loop from components Loop import Previous from components Previous import Play from components Play import Pause from components Pause import Next from components Next import Shuffle from components Shuffle import Volume from components Volume import PlaylistTemplate from components PlaylistTemplate import PlaylistItem from components PlaylistItem import loopCurrentBtn from icons loop current png import loopNoneBtn from icons loop none png import previousBtn from icons previous png import playBtn from icons play png import pauseBtn from icons pause png import nextBtn from icons next png import shuffleAllBtn from icons shuffle all png import shuffleNoneBtn from icons shuffle none png const fmtMSS s gt new Date s toISOString substr export const Player trackList gt const audio setAudio useState null const isPlaying setIsPlaying useState false const hasEnded setHasEnded useState false const title setTitle useState const length setLength useState const time setTime useState const slider setSlider useState const drag setDrag useState const volume setVolume useState const shuffled setShuffled useState false const looped setLooped useState false let playlist const filter setFilter useState let curTrack setCurTrack useState const query updateQuery useState const tags trackList forEach track gt track tags forEach tag gt if tags includes tag tags push tag useEffect gt const audio new Audio trackList curTrack url const setAudioData gt setLength audio duration setTime audio currentTime const setAudioTime gt const curTime audio currentTime setTime curTime setSlider curTime curTime audio duration toFixed const setAudioVolume gt setVolume audio volume const setAudioEnd gt setHasEnded hasEnded audio addEventListener loadeddata setAudioData audio addEventListener timeupdate setAudioTime audio addEventListener volumechange setAudioVolume audio addEventListener ended setAudioEnd setAudio audio setTitle trackList curTrack title return gt audio pause useEffect gt if audio null audio src trackList curTrack url setTitle trackList curTrack title play curTrack useEffect gt if audio null if shuffled playlist shufflePlaylist playlist looped next play hasEnded useEffect gt if audio null audio volume volume volume useEffect gt if audio null pause const val Math round drag audio duration audio currentTime val drag useEffect gt if playlist includes curTrack setCurTrack curTrack playlist filter const loop gt setLooped looped const previous gt const index playlist indexOf curTrack index setCurTrack curTrack playlist index setCurTrack curTrack playlist playlist length const play gt setIsPlaying true audio play const pause gt setIsPlaying false audio pause const next gt const index playlist indexOf curTrack index playlist length setCurTrack curTrack playlist index setCurTrack curTrack playlist const shuffle gt setShuffled shuffled const shufflePlaylist arr gt if arr length return arr const rand Math floor Math random arr length return arr rand shufflePlaylist arr filter i gt i rand const tagClickHandler e gt const tag e currentTarget innerHTML if filter includes tag setFilter filter tag else const filteredArray filter filter item gt item tag setFilter filteredArray const playlistItemClickHandler e gt const num Number e currentTarget getAttribute data key const index playlist indexOf num setCurTrack curTrack playlist index play return lt PageTemplate gt lt TagsTemplate gt tags map tag index gt return lt TagItem key index status filter length amp amp filter includes tag active tag tag onClick tagClickHandler gt lt TagsTemplate gt lt Search value query onChange e gt updateQuery e target value toLowerCase placeholder Search trackList length tracks gt lt PlayerTemplate gt lt TitleAndTimeBox gt lt Title title title gt lt Time time time fmtMSS time length fmtMSS length gt lt TitleAndTimeBox gt lt Progress value slider onChange e gt setSlider e target value setDrag e target value onMouseUp play onTouchEnd play gt lt ButtonsAndVolumeBox gt lt ButtonsBox gt lt Loop src looped loopCurrentBtn loopNoneBtn onClick loop gt lt Previous src previousBtn onClick previous gt isPlaying lt Pause src pauseBtn onClick pause gt lt Play src playBtn onClick play gt lt Next src nextBtn onClick next gt lt Shuffle src shuffled shuffleAllBtn shuffleNoneBtn onClick shuffle gt lt ButtonsBox gt lt Volume value volume onChange e gt setVolume e target value gt lt ButtonsAndVolumeBox gt lt PlayerTemplate gt lt PlaylistTemplate gt trackList sort a b gt a title gt b title map el index gt if filter length filter some filter gt el tags includes filter if el title toLowerCase includes query toLowerCase playlist push index return lt PlaylistItem status curTrack index active key index data key index title el title src el url onClick playlistItemClickHandler gt lt PlaylistTemplate gt lt PageTemplate gt First we imported useState useEffect and useRef hooks that we will use to track the states and perform the side effects on certain actions Next we imported all the components we created in the previous step of the tutorial and also imported the icons that you downloaded so we can use them in our components as source files The music player will use the M SS format to display the current and total time of the track so we created the converter function for the time component Then we set the state for all of the variables we will be using in the app We also looped through all of the tags from the playlist object we received from the index js and pushed them into an array so we can display them at the top of the player On the initial load we created a new audio object and set event listeners for loadeddata timeupdate volumechange and ended so that when any of those happen the specific function is being triggered We also used side effects to set up the source for the active track when it is being changed configured whether the track should be looped or the playlist should be shuffled when the current track ends and set up the track progress and volume level when the progress and volume knobs are dragged as well as filtered the tracks when any of the tags are selected Next we created separate functions for the click events on the loop previous play pause next and shuffle icons These are all straight forward and the functionality is intuitive by the function names Finally we put all of the imported components in the return block in the same order as we designed in the wireframe and passed in all of the props that were expected once we created each of the components individually Adding responsivenessOne last step for us to do is to add the responsiveness We will be creating some CSS media rules for the following components PlayerTemplate TitleAndTimeBox Title Time Progress ButtonsAndVolumeBox ButtonsBox Loop and Shuffle Media rules are usually added at the bottom of the stylesheets so we will go through the styling files and add the following rules under the existing rules we wrote earlier Open the PlayerTemplate module css and include the following style rules media only screen and max width px wrapper padding px We made sure that the player has some padding on the sides when used on the mobile devices Open the TitleAndTimeBox module css and include the following style rules media only screen and max width px wrapper grid template columns fr We set the title and time components to be displayed directly above each other on devices smaller than px Open the Title module css and include the following style rules media only screen and max width px title width text align center We set the title to take all the available space and is centered for the mobile devices Open the Time module css and include the following style rules media only screen and max width px time text align center We centered the text of the time component for the mobile devices Open the Progress module css and include the following style rules media only screen and max width px container margin px We set the top and bottom margins for the progress component on the mobile devices Open the ButtonsAndVolumeBox module css and include the following style rules media only screen and max width px wrapper grid template columns fr We set the bottom box and volume components to be displayed directly below each other on the screens smaller than px Open the ButtonsBox module css and include the following style rules media only screen and max width px wrapper grid template columns repeat auto We made sure the button box uses the three column layout with equal width for the mobile devices Open the Loop module css and include the following style rules media only screen and max width px loop display none We hide the loop button on mobile devices to simplify the user interface Open the Shuffle module css and include the following style rules media only screen and max width px shuffle display none We hide the shuffle button on mobile devices to simplify the user interface After the addition of the media rules we added the audio player should be fully responsible To test it see if your dev server is still running in the terminal if it is not run npm start again then open the browser on port http localhost and press F to open the dev tools Try to resize the active view to see the player adjusting to different screen widths Deployment of the appIn order to make our app available to the public first we will need to push all the code to GitHub First create a new GitHub accout if you do not already have one and Log In Select create a new repository from the menu choose a Repository name could be audio player or anything else you want and click Create repository To push the app to the newly created repository switch back to your terminal code editor and run the following commands replace lt username gt with your GitHub username and lt reponame gt with the name of your repository git remote add origin username gt lt reponame gt gitgit branch M maingit push u origin mainThen switch back to your GitHub and check if the files of your project have appeared in the repository you created If so you have successfully committed your code The final step is to deploy the app online For that we will use Vercel Head to Vercel Create a new account if you dont have one yet and Log in Then create a New project You will need to install Vercel for GitHub access rights so Vercel can view your Github repositories Now import your project from the Import Git Repository panel Vercel will detect the project name build commands and root automatically so you don t have to worry about that The build process should not take longer than a minute Now go back to the Overview tab of your project and click the Visit button which will open the live URL of your project Congratulations you have successfully deployed your music player From now on every time you will push an update to GitHub it will be automatically re deployed on the Vercel meaning your audio player will be in sync with the code on the GitHub ConclusionIn this tutorial we first defined the idea and functionality we would like to include in our audio player Then we created a wireframe and put all of the features in the UI The last step for the design was to pick a proper color scheme and find an appropriate font for the text to look good Then we went on and prepared the basis for our app to build upon First we set up the React app Then we created some custom base files to render the player properly Finally we imported all the icons we used to control the audio playback In the technical implementation of the player we first wrote all the individual components Then we created the main app file of the player imported all the components and wrote the logic for the audio player To improve the UI we also included some media rules for the player to look great on mobile devices as well Finally we pushed all the code to Github and from there deployed on Vercel so it can be accessed from any device that has an internet connection During the process I hope you got an insight into how the React apps are being built and what are some of the ways you can construct your file structure Next time you will need to showcase some audio tracks on your website you will know how to do it Writing has always been my passion and it gives me pleasure to help and inspire people If you have any questions feel free to reach out Connect me on Twitter LinkedIn and GitHub Visit my Blog for more articles like this 2022-05-15 14:32:22
海外TECH DEV Community Developing a RESTful API with Go https://dev.to/kevwan/developing-a-restful-api-with-go-3jo5 Developing a RESTful API with Go Why we still need monoliths in the era of microservicesFor most startups we should focus more on delivering the products in the early stage of business The monolithic services have the advantages of simple architecture easy deployment and better development productivity which can help us achieve the product requirements quickly While we use monolithic services to deliver products quickly we also need to reserve the possibility for business incresement so we usually split different business modules clearly in monolithic services Shopping mall monolithic service architectureWe take the mall as an example to build a monolithic service The mall service is generally relatively complex and consists of multiple modules the more important modules include account product and order modules etc Each module will have its own independent business logic and each module will also depend on some others For example the order module and the product module will depend on the account module In the monolithic application this kind of dependency is usually accomplished by method calls between modules Monolithic services generally share storage resources such as MySQL and Redis The overall architecture of monolithic services is relatively simple which is also the advantage of monolithic services Customer requests are parsed through DNS and forwarded to the mall s backend services through Nginx Mall services are deployed on cloud hosts In order to achieve greater throughput and high availability the service will generally deployed with multiple copies This simple architecture can carry high throughput if well optimized For example a request for order details interface order detail is routed to the order module which relies on the account module and the product module to compose the complete order details back to the user and multiple modules in a single service generally share the database and cache Monolithic ServiceThe next section describes how to quickly implement a mall monolithic service based on go zero Devs who have used go zero know that we provide an API format file to describe the Restful API and then we can generate the corresponding code by goctl with one command we just need to fill in the corresponding business logic in the logic files The mall service contains several modules and in order to make the modules independent from each other different modules are defined by separate APIs but all the APIs are defined for the same service mall api Create user api order api product api and mall api in the api directory where mall api is the aggregated api file Other api files are imported via import directives api mall api order api product api user api Mall API Definitionmall api is defined as follows where syntax v means that this is the v syntax of zero api syntax v import user api import order api import product api Account module API definitionView user detailsGet all orders for a usersyntax v type UserRequest ID int path id UserReply ID int json id Name string json name Balance float json balance UserOrdersRequest ID int path id UserOrdersReply ID string json id State uint json state CreateAt string json create at service mall api handler UserHandler get user id UserRequest returns UserReply handler UserOrdersHandler get user id orders UserOrdersRequest returns UserOrdersReply Order module API definitionGet order detailsGenerate orderssyntax v type OrderRequest ID string path id OrderReply ID string json id State uint json state CreateAt string json create at OrderCreateRequest ProductID int json product id OrderCreateReply Code int json code service mall api handler OrderHandler get order id OrderRequest returns OrderReply handler OrderCreateHandler post order create OrderCreateRequest returns OrderCreateReply Product module API definitionView product detailssyntax v type ProductRequest ID int path id type ProductReply ID int json id Name string json name Price float json price Count int json count service mall api handler ProductHandler get product id ProductRequest returns ProductReply Generating the monolithic serviceWith the API already defined generating a service with the API becomes very simple we use goctl to generate the monolithic service code goctl api go api api mall api dir The generated code is structured as follows ├ー api│ ├ー mall api│ ├ー order api│ ├ー product api│ └ー user api├ー etc│ └ー mall api yaml├ー internal│ ├ー config│ │ └ー config go│ ├ー handler│ │ ├ー ordercreatehandler go│ │ ├ー orderhandler go│ │ ├ー producthandler go│ │ ├ー routes go│ │ ├ー userhandler go│ │ └ー userordershandler go│ ├ー logic│ │ ├ー ordercreatelogic go│ │ ├ー orderlogic go│ │ ├ー productlogic go│ │ ├ー userlogic go│ │ └ー userorderslogic go│ ├ー svc│ │ └ー servicecontext go│ └ー types│ └ー types go└ー mall goLet s explain the generated files api holds the API description fileetc used to define the project configuration all configuration items can be written in mall api yamlinternal config the configuration definition of the serviceinternal handler the implementation of the handler corresponding to the routes defined in the API fileinternal logic used to put the business logic corresponding to each route the reason for the distinction between handler and logic is to make the business processing part as less dependent as possible to separate HTTP requests from the logic processing code and to facilitate the subsequent splitting into RPC serviceinternal svc used to define the dependencies of the business logic processing we can create the dependent resources in the main function and pass them to handler and logic via ServiceContextinternal types defines the API request and response data structuresmall go the file where the main function is located with the same name as the service in the API definition minus the api suffixThe generated service can be run without any modification go run mall goStarting server at Implementing the business logicNext let s implement the business logic The logic will be simple for demonstration purposes not real business logic First let s implement the logic of getting all orders for users Since there is no order related information in the user module we need to rely on the order module to query the orders of users so we add a dependency on OrderLogic in UserOrdersLogic type UserOrdersLogic struct logx Logger ctx context Context svcCtx svc ServiceContext orderLogic OrderLogic func NewUserOrdersLogic ctx context Context svcCtx svc ServiceContext UserOrdersLogic return amp UserOrdersLogic Logger logx WithContext ctx ctx ctx svcCtx svcCtx orderLogic NewOrderLogic ctx svcCtx Implement a method in OrderLogic to query all orders based on user idfunc l OrderLogic ordersByUser uid int types OrderReply error if uid It should actually be queried from database or cache return types OrderReply ID State CreateAt ID State CreateAt nil return nil nil Call the ordersByUser method in the UserOrders method of UserOrdersLogic func l UserOrdersLogic UserOrders req types UserOrdersRequest types UserOrdersReply error orders err l orderLogic ordersByUser req ID if err nil return nil err return amp types UserOrdersReply Orders orders nil At this point we restart the mall api service and request all the user s orders in the browser http localhost user ordersThe return result is as follows as we expected orders id state create at id state create at Next we ll implement the logic for creating an order To create an order we first need to see if the item in stock is enough so we need to rely on the item module in the order module type OrderCreateLogic struct logx Logger ctx context Context svcCtx svc ServiceContext productLogic ProductLogic productLogic ProductLogic func NewOrderCreateLogic ctx context Context svcCtx svc ServiceContext OrderCreateLogic return amp OrderCreateLogic Logger logx WithContext ctx ctx ctx svcCtx svcCtx productLogic NewProductLogic ctx svcCtx The logic for creating an order is as follows const success failure func l OrderCreateLogic OrderCreate req types OrderCreateRequest types OrderCreateReply error product err l productLogic productByID req ProductID if err nil return nil err if product Count gt return amp types OrderCreateReply Code success nil return amp types OrderCreateReply Code failure nil The logic of the dependent product module is as follows func l ProductLogic Product req types ProductRequest types ProductReply error return l productByID req ID func l ProductLogic productByID id int types ProductReply error return amp types ProductReply ID id Name apple watch Price Count nil The above shows that using go zero to develop a monolithic service is very simple which helps us to develop quickly And we also separated modules which also provides the possibility of changing to microservices later SummaryThe above example shows that it is very simple to use go zero to develop monolithic services You only need to define the api file and then the goctl tool can automatically generate the project code We only need to fill in the business logic code in the logic package In this article we just demonstrated how to quickly develop monolithic services based on go zero which does not involve databases In fact goctl can also generate CRUD and cache code with one command And for different business scenarios customization can also be achieved through customizing templates And customized templates can be shared within the team through remote git repositories which can be very efficient for team collaboration Project addressWelcome to use go zero and star to support us 2022-05-15 14:29:19
海外TECH DEV Community Pitch me on Ruby https://dev.to/ben/pitch-me-on-ruby-31co Pitch me on RubyPart of a new series Feel welcome to dip in and weigh in on a past question Let s say I ve never used Ruby before Can anyone give the run down of what the language does and why you prefer it Feel free to touch on drawbacks as well 2022-05-15 14:25:32
海外TECH DEV Community Do You Need Docker Desktop For Linux? https://dev.to/schukai/do-you-need-docker-desktop-for-linux-17ja Do You Need Docker Desktop For Linux I read with interest Docker s announcement that Docker for Linux is coming or rather it is already there now Docker docker Yesterday we announced the general availability of Docker Desktop for Linux ーproviding developers that use Linux desktop environments the exact same Docker Desktop experience Here s the what why where and what s next for DDL dockr ly LDlx PM May But do we really need it What is the target audience Linux containers cgroups and namespaces have been around for a while but docker has made it usable for the mass market I think it s great what docker has done here in the last few years even if it never paid off financially Whether Mirantis does it better But I digress Back to docker desktop for linux With Podman and the Docker Tools we have had working engines on Linux for a very long time Many IDE like VC Code or IntelliJ also have interfaces for Docker in the bag There are also already a number of simple UI for docker like lazydocker or dockstationI celebrate the fact that vendors now offer their software for Linux as well making professional tools with commercial support available However I have yet to see any advantage of Docker Desktop What does the manufacturer write about this A unified Docker experience across all major OS sOk this is important for those who are switching or working in multiple worlds Those who use Linux at home and macOS in the office are probably grateful for the integration Immediate access to new features such as Docker Extensions that have historically only been available on Desktop for Windows and MacI don t understand the point it s a bit meaningless The seamless Kubernetes integration that Docker Desktop providesDoes it matter i deploy kubernetes via a ci cd pipeline rather than from the developer machine The Docker Desktop UI that makes it so much easier to manage volumes containers and images as well as providing insights in to the Docker processes running locally on your machineThis is certainly an advantage for developers who are not familiar with the command line A good UI can be really helpful What i like is that there are packages for it and you don t have to use snap or flatpak apt get install docker desktopLet s see if it becomes a good product and finds its way to the developers i m curious Are any of you using it and if so what advantage does the product offer you 2022-05-15 14:05:16
Apple AppleInsider - Frontpage News iOS 16 will have refreshed Apple apps but look the same as iOS 15 https://appleinsider.com/articles/22/05/15/ios-16-will-have-refreshed-apple-apps-but-look-the-same?utm_medium=rss iOS will have refreshed Apple apps but look the same as iOS Apple s shift to iOS will introduce many major changes to the mobile operating system a report claims but it will still apparently look a lot like iOS in terms of design Apple is preparing to unveil its next generation of operating systems during the WWDC keynote on June prompting rumors as to what will be unveiled In speculation ahead of the developer conference Apple is thought to be gearing up for big changes but with a familiar appearance Major changes across the system will be introduced according to Mark Gurman in the Power On newsletter for Bloomberg The changes will include new ways of interacting and some fresh Apple apps but Gurman stops short in saying what will actually change Read more 2022-05-15 14:55:22
海外TECH Engadget Hitting the Books: Why we need to treat the robots of tomorrow like tools https://www.engadget.com/hitting-the-books-digital-mindset-paul-leonardi-tsedal-neeley-harvard-business-review-press-140058242.html?src=rss Hitting the Books Why we need to treat the robots of tomorrow like toolsDo not be swayed by the dulcet dial tones of tomorrow s AIs and their siren songs of the singularity No matter how closely artificial intelligences and androids may come to look and act like humans they ll never actually be humans argue Paul Leonardi Duca Family Professor of Technology Management at University of California Santa Barbara and Tsedal Neeley Naylor Fitzhugh Professor of Business Administration at the Harvard Business School in their new book The Digital Mindset What It Really Takes to Thrive in the Age of Data Algorithms and AI nbsp ーand therefore should not be treated like humans The pair contends in the excerpt below that in doing so such hinders interaction with advanced technology and hampers its further development Harvard Business Review PressReprinted by permission of Harvard Business Review Press Excerpted from THE DIGITAL MINDSET What It Really Takes to Thrive in the Age of Data Algorithms and AI by Paul Leonardi and Tsedal Neeley Copyright Harvard Business School Publishing Corporation All rights reserved Treat AI Like a Machine Even If It Seems to Act Like a HumanWe are accustomed to interacting with a computer in a visual way buttons dropdown lists sliders and other features allow us to give the computer commands However advances in AI are moving our interaction with digital tools to more natural feeling and human like interactions What s called a conversational user interface UI gives people the ability to act with digital tools through writing or talking that s much more the way we interact with other people like Burt Swanson s “conversation with Amy the assistant When you say “Hey Siri “Hello Alexa and “OK Google that s a conversational UI The growth of tools controlled by conversational UIs is staggering Every time you call an number and are asked to spell your name answer “Yes or say the last four numbers of your social security number you are interacting with an AI that uses conversational UI Conversational bots have become ubiquitous in part because they make good business sense and in part because they allow us to access services more efficiently and more conveniently For example if you ve booked a train trip through Amtrak you ve probably interacted with an AI chatbot Its name is Julie and it answers more than million questions annually from more than million passengers You can book rail travel with Julie just by saying where you re going and when Julie can pre fill forms on Amtrak s scheduling tool and provide guidance through the rest of the booking process Amtrak has seen an percent return on their investment in Julie Amtrak saves more than million in customer service expenses each year by using Julie to field low level predictable questions Bookings have increased by percent and bookings done through Julie generate percent more revenue than bookings made through the website because Julie is good at upselling customers One reason for Julie s success is that Amtrak makes it clear to users that Julie is an AI agent and they tell you why they ve decided to use AI rather than connect you directly with a human That means that people orient to it as a machine not mistakenly as a human They don t expect too much from it and they tend to ask questions in ways that elicit helpful answers Amtrak s decision may sound counterintuitive since many companies try to pass off their chatbots as real people and it would seem that interacting with a machine as though it were a human should be precisely how to get the best results A digital mindset requires a shift in how we think about our relationship to machines Even as they become more humanish we need to think about them as machinesーrequiring explicit instructions and focused on narrow tasks x ai the company that made meeting scheduler Amy enables you to schedule a meeting at work or invite a friend to your kids basketball game by simply emailing Amy or her counterpart Andrew with your request as though they were a live personal assistant Yet Dennis Mortensen the company s CEO observes that more than percent of the inquiries that the company s help desk receives are related to the fact that people are trying to use natural language with the bots and struggling to get good results Perhaps that was why scheduling a simple meeting with a new acquaintance became so annoying to Professor Swanson who kept trying to use colloquialisms and conventions from informal conversation In addition to the way he talked he made many perfectly valid assumptions about his interaction with Amy He assumed Amy could understand his scheduling constraints and that “she would be able to discern what his preferences were from the context of the conversation Swanson was informal and casualーthe bot doesn t get that It doesn t understand that when asking for another person s time especially if they are doing you a favor it s not effective to frequently or suddenly change the meeting logistics It turns out it s harder than we think to interact casually with an intelligent robot Researchers have validated the idea that treating machines like machines works better than trying to be human with them Stanford professor Clifford Nass and Harvard Business School professor Youngme Moon conducted a series of studies in which people interacted with anthropomorphic computer interfaces Anthropomorphism or assigning human attributes to inanimate objects is a major issue in AI research They found that individuals tend to overuse human social categories applying gender stereotypes to computers and ethnically identifying with computer agents Their findings also showed that people exhibit over learned social behaviors such as politeness and reciprocity toward computers Importantly people tend to engage in these behaviors ーtreating robots and other intelligent agents as though they were people ーeven when they know they are interacting with computers rather than humans It seems that our collective impulse to relate with people often creeps into our interaction with machines This problem of mistaking computers for humans is compounded when interacting with artificial agents via conversational UIs Take for example a study we conducted with two companies who used AI assistants that provided answers to routine business queries One used an anthropomorphized AI that was human like The other wasn t Workers at the company who used the anthropomorphic agent routinely got mad at the agent when the agent did not return useful answers They routinely said things like “He sucks or “I would expect him to do better when referring to the results given by the machine Most importantly their strategies to improve relations with the machine mirrored strategies they would use with other people in the office They would ask their question more politely they would rephrase into different words or they would try to strategically time their questions for when they thought the agent would be in one person s terms “not so busy None of these strategies was particularly successful In contrast workers at the other company reported much greater satisfaction with their experience They typed in search terms as though it were a computer and spelled things out in great detail to make sure that an AI who could not “read between the lines and pick up on nuance would heed their preferences The second group routinely remarked at how surprised they were when their queries were returned with useful or even surprising information and they chalked up any problems that arose to typical bugs with a computer For the foreseeable future the data are clear treating technologies ーno matter how human like or intelligent they appear ーlike technologies is key to success when interacting with machines A big part of the problem is they set the expectations for users that they will respond in human like ways and they make us assume that they can infer our intentions when they can do neither Interacting successfully with a conversational UI requires a digital mindset that understands we are still some ways away from effective human like interaction with the technology Recognizing that an AI agent cannot accurately infer your intentions means that it s important to spell out each step of the process and be clear about what you want to accomplish 2022-05-15 14:00:58
海外TECH CodeProject Latest Articles Emulating SD Reader Card Change Detection When You Don't Have It https://www.codeproject.com/Tips/5331981/Emulating-SD-Reader-Card-Change-Detection-When-You detection 2022-05-15 14:09:00
金融 ニュース - 保険市場TIMES 明治安田生命、「みんなにやさしい保険アクセス」を展開 金融包摂へ https://www.hokende.com/news/blog/entry/2022/05/16/000000 明治安田生命、「みんなにやさしい保険アクセス」を展開金融包摂へ全ての人の手続不便を解消明治安田生命は月日、「みんなにやさしい保険アクセス」を年より展開し、金融包摂に取り組んでいると発表した。 2022-05-16 00:00:00
ニュース BBC News - Home 'Bodies everywhere' - Witnesses tell of US attack https://www.bbc.co.uk/news/world-us-canada-61454989?at_medium=RSS&at_campaign=KARANGA attackeyewitnesses 2022-05-15 14:28:21
ニュース BBC News - Home NI protocol: Unilateral action by UK government 'could erode peace' https://www.bbc.co.uk/news/uk-northern-ireland-61455541?at_medium=RSS&at_campaign=KARANGA coveney 2022-05-15 14:43:16
ニュース BBC News - Home Cost of living: Labour to call vote on windfall tax for oil and gas companies https://www.bbc.co.uk/news/uk-politics-61456268?at_medium=RSS&at_campaign=KARANGA miliband 2022-05-15 14:07:52
ニュース BBC News - Home Grantham: Margaret Thatcher statue lowered into place https://www.bbc.co.uk/news/uk-england-lincolnshire-61455387?at_medium=RSS&at_campaign=KARANGA grantham 2022-05-15 14:18:17
ニュース BBC News - Home Women's FA Cup final: Lauren Hemp stunner puts Man City level https://www.bbc.co.uk/sport/av/football/61458523?at_medium=RSS&at_campaign=KARANGA Women x s FA Cup final Lauren Hemp stunner puts Man City levelLauren Hemp scores a beautiful equalising goal for Manchester City in the FA Cup final getting the ball on the left she twists she turns and twists again before curling sumptuously into the far corner 2022-05-15 14:30:49

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

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

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