IT |
ITmedia 総合記事一覧 |
[ITmedia News] Photoshop、生成AI搭載へ 塗りつぶし機能に“革命” β版を公開 |
https://www.itmedia.co.jp/news/articles/2305/23/news203.html
|
adobe |
2023-05-23 21:30:00 |
python |
Pythonタグが付けられた新着投稿 - Qiita |
バウアーの投球のクセ?をネタにpython勉強(備忘録) |
https://qiita.com/ussu_ussu_ussu/items/213cfc02d12e0c436a5c
|
自分 |
2023-05-23 21:46:00 |
Ruby |
Rubyタグが付けられた新着投稿 - Qiita |
RubyでAtCoder ABC256(A, B, C, D)を解いてみた |
https://qiita.com/shoya15/items/22877e1d8b38c3896f04
|
atcoder |
2023-05-23 21:26:07 |
Git |
Gitタグが付けられた新着投稿 - Qiita |
GitHubでYowza, that’s a lot of files.とエラーが出た時の解決方法 |
https://qiita.com/kouz496/items/bbc35abad6ea07524817
|
yowzathatsalotoffiles |
2023-05-23 21:10:40 |
Ruby |
Railsタグが付けられた新着投稿 - Qiita |
JPGとJPEGの違いとは? |
https://qiita.com/Bjp8kHYYPFq8MrI/items/4a23cb265b1c75d67769
|
違い |
2023-05-23 21:40:05 |
海外TECH |
MakeUseOf |
9 Ways to Find the IMEI Number on Your iPhone or iPad |
https://www.makeuseof.com/ways-to-find-the-imei-number-on-iphone-ipad/
|
different |
2023-05-23 12:45:18 |
海外TECH |
MakeUseOf |
The 10 Best Free AI Art Generators to Create Image From Text |
https://www.makeuseof.com/ai-text-to-art-generators/
|
painting |
2023-05-23 12:30:18 |
海外TECH |
MakeUseOf |
Hotmail Is Dead! Microsoft Outlook Email Services Explained |
https://www.makeuseof.com/tag/hotmail-no-microsoft-outlook-email-services-explained/
|
online |
2023-05-23 12:15:18 |
海外TECH |
MakeUseOf |
Keep Your Mac Clean and Running Fast With This Mac Washing Machine |
https://www.makeuseof.com/intego-mac-washing-machine/
|
intego |
2023-05-23 12:01:18 |
海外TECH |
DEV Community |
Yet Another Newsletter LOL: Baseline |
https://dev.to/nickytonline/yet-another-newsletter-lol-baseline-3cfl
|
Yet Another Newsletter LOL BaselineAnother week another newsletter Let s get to it Around the WebA fantastic list of curated data viz resources care of Colin Megill Introduction to Data Visualization for the Web Big ups to Ken Wheeler for putting it on my radarGet better clarity on browser support with Baseline Introducing Baseline a unified view of stable web featuresLooking for accessible design components thanks to Radix UI while leveraging Tailwind Say hello to ui shadcn com Fun Stuff PicturesFoIder on TwitterWords of Wisdom for the WeekBe consistent Motivation may ignite the spark but it s consistency that fuels the flame of success ーAddy Osmani on LinkedInShameless PlugsThis week I got to hang with BekahHW We discussed optimizing your open source contributions and started to work on an issue for the OpenSauced browser extension The recording will be up on my YouTube next week sometime In the meantime check out the back catalogue and subscribe if you aren t already I m hanging with two incredible people on my Twitch stream this week On Wednesday I m hanging with Colby Fayock We re going to build out something fun with Cloudinary And on Thursday I m hanging with Erin Mikail Staples Erin will teach us all about open source data labelling and why it s important JobsSentry is looking for someone to come work on their NET SDKs ー Seattle Washington I post jobs in the iamdeveloper com community plus all other kinds of content as do others If you re looking for another friendly nook of the internet head to discord iamdeveloper com If you liked this newsletter you can subscribe or if RSS is your jam you can also subscribe via RSS |
2023-05-23 12:48:26 |
海外TECH |
DEV Community |
Getting started with gRPC in Rust |
https://dev.to/malomz/getting-started-with-grpc-in-rust-39nm
|
Getting started with gRPC in RustMicroservices architecture is one of the preferred methods of building scalable and robust applications It involves breaking large applications into smaller components that are well defined performs a specific task and uses sets of application programming interface API for their communication Communication is an essential part of microservices it plays an important role in letting services talk to each other within the larger application context Some examples of protocol microservices use to communicate with each other includes HTTP gRPC message brokers etc In this article we will explore what gRPC is and how to get started by building a user management service using gRPC MongoDB and Rust What is gRPC gRPC is a modern communication framework that can run in any environment and helps connect services efficiently It was introduced in and governed by the Cloud Native Computing Platform CNCF Beyond efficiently connecting services across a distributed system mobile applications frontend to backend etc it supports health checking load balancing tracing and authentication gRPC offers a fresh perspective to developers building medium to complex applications as it can generate client and server bindings for multiple languages The following are some of its benefits Service definitiongRPC uses Protocol Buffers as its interface description language similar to JSON and provides features like authentication cancellation timeouts etc Lightweight and performantgRPC definitions are percent smaller than JSON definitions and are to times faster than a traditional REST API Multiple platform supportgRPC is language agnostic and has automated code generation for client and server supported languages ScalableFrom the developer s environment to production gRPC is designed to scale millions ler seconds requests Getting startedNow that we understand gRPC s importance in building scalable applications let s build a user management service with gRPC MongoDB and Rust The project source code can be found here PrerequisitesTo fully grasp the concepts presented in this tutorial the following are required Basic understanding of Rust Basic understanding of Protocol Buffer Protocol Buffer compiler installed A MongoDB account to host the database Signup is completely free Postman or any gRPC testing application Project and Dependencies setupTo get started we need to navigate to the desired directory and run the command below in our terminal cargo new grpc rust amp amp cd grpc rustThis command creates a Rust project called grpc rust and navigates into the project directory Next we install the required dependencies by modifying the dependencies section of the Cargo toml file as shown below other code section goes here dependencies tokio version features macros rt multi thread serde versiom features derive dotenv tonic prost futures dependencies mongodb version build dependencies tonic build tokio version features macros rt multi thread is a runtime that enables asynchronous programming in Rust serde versiom features derive is a framework for serializing and deserializing Rust data structures dotenv is a library for managing environment variables tonic is a Rust implementation of gRPC prost is a Protocol Buffers implementation in Rust and generates simple idiomatic Rust code from proto and proto files futures is a library for doing asynchronous programming with MongoDB driver dependencies mongodb is a driver for connecting to MongoDB It also specifies the required version and the feature type Asynchronous API build dependencies specifies tonic build as a dependency It compiles proto files into Rust code Defining the user management Protocol Buffer and compilationTo get started we need to define a Protocol Buffer to represent all the operations and responses involved in the user management service To do this first we need to create a proto folder in the root directory and in this folder create a user proto file and add the snippet below syntax proto package user service UserService rpc GetUser UserRequest returns UserResponse rpc CreateUser CreateUserRequest returns CreateUserResponse rpc UpdateUser UpdateUserRequest returns UpdateUserResponse rpc DeleteUser DeleteUserRequest returns DeleteUserResponse rpc GetAllUsers Empty returns GetAllUsersResponse message UserRequest string id message UserResponse string id string name string location string title message CreateUserRequest string name string location string title message CreateUserResponse string data message UpdateUserRequest string id string name string location string title message UpdateUserResponse string data message DeleteUserRequest string id message DeleteUserResponse string data message Empty message GetAllUsersResponse repeated UserResponse users The snippet above does the following Specifies the use of proto syntax Declares user as the package name Creates a service to Create Read Edit and Delete CRUD a user and their corresponding responses as messages Secondly we need to create a build file that instructs tonic build dependency to compile our user proto file into a Rust code To do this we need to create a build rs file in the root directory and add the snippet below fn main gt Result lt Box lt dyn std error Error gt gt tonic build compile protos proto user proto Ok Lastly we need to compile the user proto file using the build rs instruction we specified earlier by running the command below in our terminal cargo build Using the generated code from gRPC in our applicationWith the build process done we can start using the generated code in our application Database setup and integrationFirst we need to set up a database and a collection on MongoDB as shown below We also need to get our database connection string by clicking on the Connect button and changing the Driver to Rust Secondly we must modify the copied connection string with the user s password we created earlier and change the database name To do this we need to create a env file in the root directory and add the snippet copied MONGOURI mongodb srv lt YOUR USERNAME HERE gt lt YOUR PASSWORD HERE gt cluster eakf mongodb net lt DATABASE NAME gt retryWrites true amp w majoritySample of a properly filled connection string below MONGOURI mongodb srv malomz malomzPassword cluster eakf mongodb net rustDB retryWrites true amp w majorityLastly we need to navigate to the src folder create a mongo connection rs file to implement our database logic and add the snippet below use std env io Error use dotenv dotenv use futures TryStreamExt use mongodb bson doc use mongodb bson oid ObjectId use mongodb results DeleteResult InsertOneResult UpdateResult use mongodb Client Collection use serde Deserialize Serialize derive Debug Serialize Deserialize pub struct User serde rename id skip serializing if Option is none pub id Option lt ObjectId gt pub name String pub location String pub title String pub struct DBMongo col Collection lt User gt impl DBMongo pub async fn init gt Self dotenv ok let uri match env var MONGOURI Ok v gt v to string Err gt format Error loading env variable let client Client with uri str uri await expect error connecting to database let col client database rustDB collection User DBMongo col pub async fn create user new user User gt Result lt InsertOneResult Error gt let db DBMongo init await let new doc User id None name new user name location new user location title new user title let user db col insert one new doc None await ok expect Error creating user Ok user pub async fn get user id String gt Result lt User Error gt let db DBMongo init await let obj id ObjectId parse str id unwrap let filter doc id obj id let user detail db col find one filter None await ok expect Error getting user s detail Ok user detail unwrap pub async fn update user id String new user User gt Result lt UpdateResult Error gt let db DBMongo init await let obj id ObjectId parse str id unwrap let filter doc id obj id let new doc doc set id new user id name new user name location new user location title new user title let updated doc db col update one filter new doc None await ok expect Error updating user Ok updated doc pub async fn delete user id String gt Result lt DeleteResult Error gt let db DBMongo init await let obj id ObjectId parse str id unwrap let filter doc id obj id let user detail db col delete one filter None await ok expect Error deleting user Ok user detail pub async fn get all users gt Result lt Vec lt User gt Error gt let db DBMongo init await let mut cursors db col find None None await ok expect Error getting list of users let mut users Vec lt User gt Vec new while let Some user cursors try next await ok expect Error mapping through cursor users push user Ok users The snippet above does the following Line Imports the required dependencies Line Creates a User struct with required properties We also added field attributes to the id property to rename and ignore the field if it is empty Line Creates a DBMongo struct with a col field to access MongoDB collection Line Creates an implementation block that adds methods to the MongoRepo struct to initialize the database with its corresponding CRUD operation Integrating the database logic with gRPC generated codeWith our database logic setup we can use the methods to create our application handlers To do this we need to create a service rs file inside the same src folder and add the snippet below use mongodb bson oid ObjectId use tonic Request Response Status use user user service server UserService CreateUserRequest CreateUserResponse DeleteUserRequest DeleteUserResponse Empty GetAllUsersResponse UpdateUserRequest UpdateUserResponse use crate mongo connection self DBMongo use self user UserRequest UserResponse pub mod user tonic include proto user derive Debug Default pub struct User tonic async trait impl UserService for User async fn create user amp self request Request lt CreateUserRequest gt gt Result lt Response lt CreateUserResponse gt Status gt let req request into inner let new user mongo connection User id None name req name location req location title req title let db DBMongo create user new user await match db Ok resp gt let user CreateUserResponse data resp inserted id to string Ok Response new user Err error gt Err Status aborted format error async fn get user amp self request Request lt UserRequest gt gt Result lt Response lt UserResponse gt Status gt let req request into inner let db DBMongo get user req id await match db Ok resp gt let user UserResponse id resp id unwrap to string name resp name location resp location title resp title Ok Response new user Err error gt Err Status aborted format error async fn update user amp self request Request lt UpdateUserRequest gt gt Result lt Response lt UpdateUserResponse gt Status gt let req request into inner let new user mongo connection User id Some ObjectId parse str req id clone unwrap name req name location req location title req title let db DBMongo update user req id clone new user await match db Ok gt let user UpdateUserResponse data String from User details updated successfully Ok Response new user Err error gt Err Status aborted format error async fn delete user amp self request Request lt DeleteUserRequest gt gt Result lt Response lt DeleteUserResponse gt Status gt let req request into inner let db DBMongo delete user req id await match db Ok gt let user DeleteUserResponse data String from User details deleted successfully Ok Response new user Err error gt Err Status aborted format error async fn get all users amp self Request lt Empty gt gt Result lt Response lt GetAllUsersResponse gt Status gt let db DBMongo get all users await match db Ok resp gt let mut user list Vec lt UserResponse gt Vec new for data in resp let mapped user UserResponse id data id unwrap to string name data name location data location title data title user list push mapped user let user GetAllUsersResponse users user list Ok Response new user Err error gt Err Status aborted format error The snippet above does the following Line Imports the required dependencies including the gRPC generated Line Declares user struct to bring into scope our gRPC generated code using tonic include proto user Line Creates a User struct to represent our application model Line Implements the UserService traits from the gRPC generated code for the User struct by creating required methods and returning appropriate responses as generated by gRPCCreating the serverWith that done we can create the application gRPC server by modifying the main rs file as shown below use std net SocketAddr use service user user service server UserServiceServer User use tonic transport Server mod mongo connection mod service tokio main async fn main gt Result lt Box lt dyn std error Error gt gt let address SocketAddr parse unwrap let user User default Server builder add service UserServiceServer new user serve address await Ok The snippet above does the following Imports the required dependencies and adds the mongo connection and service as a module Creates a server using Server builder method and adds the UserServiceServer as a service With that done we can test our application by running the command below in our terminal cargo run Testing with PostmanWith our server up and running we can test our application by creating a new gRPC Request Input grpc as the URL select the Import a proto file option and upload the user proto file we created earlier With that done the corresponding method will be populated and we can test them accordingly We can also validate that our gRPC server works by checking our MongoDB collection ConclusionThis post discussed what gRPC is its role in building scalable applications and how to get started by building a user management service with Rust and MongoDB Beyond what was discussed above gRPC offers robust techniques around authentication error handling performance etc These resources might be helpful Tonic Tokio runtime MongoDB Rust driver Serde Serializing and Deserializing library |
2023-05-23 12:48:14 |
海外TECH |
DEV Community |
Getting started with gRPC in Golang |
https://dev.to/malomz/getting-started-with-grpc-in-golang-151m
|
Getting started with gRPC in GolangMicroservices architecture is one of the preferred methods of building scalable and robust applications It involves breaking large applications into smaller components that are well defined performs a specific task and uses sets of application programming interface API for their communication Communication is an essential part of microservices it plays an important role in letting services talk to each other within the larger application context Some examples of protocol microservices use to communicate with each other includes HTTP gRPC message brokers etc In this article we will explore what gRPC is and how to get started by building a user management service using gRPC MongoDB and Golang What is gRPC gRPC is a modern communication framework that can run in any environment and helps connect services efficiently It was introduced in and governed by the Cloud Native Computing Platform CNCF Beyond efficiently connecting services across a distributed system mobile applications frontend to backend etc it supports health checking load balancing tracing and authentication gRPC offers a fresh perspective to developers building medium to complex applications as it can generate client and server bindings for multiple languages The following are some of its benefits Service definitiongRPC uses Protocol Buffers as its interface description language similar to JSON and provides features like authentication cancellation timeouts etc Lightweight and performantgRPC definitions are percent smaller than JSON definitions and are to times faster than a traditional REST API Multiple platform supportgRPC is language agnostic and has automated code generation for client and server supported languages ScalableFrom the developer s environment to production gRPC is designed to scale millions ler seconds requests Getting startedNow that we understand gRPC s importance in building scalable applications let s build a user management service with gRPC MongoDB and Golang The project source code can be found here PrerequisitesTo fully grasp the concepts presented in this tutorial the following are required Basic understanding of Golang Basic understanding of Protocol Buffer Protocol Buffer compiler installed A MongoDB account to host the database Signup is completely free Postman or any gRPC testing application Project and Dependencies setupTo get started we need to navigate to the desired directory and run the command below in our terminal cargo new grpc go amp amp cd grpc goThis command creates a Golang project called grpc go and navigates into the project directory Next we need to initialize a Go module to manage project dependencies by running the command below go mod init grpc goThis command will create a go mod file for tracking project dependencies We proceed to install the required dependencies with go get google golang org grpc go mongodb org mongo driver mongo github com joho godotenv google golang org protobufgoogle golang org grpc is the Golang implementation of gRPC go mongodb org mongo driver mongo is a driver for connecting to MongoDB github com joho godotenv is a library for managing environment variables google golang org protobuf is the Golang implementation of Protocol Buffers Defining the user management Protocol Buffer and compilationTo get started we need to define a Protocol Buffer to represent all the operations and responses involved in the user management service To do this first we need to create a proto folder in the root directory and in this folder create a user proto file and add the snippet below syntax proto package user option go package grpc go proto service UserService rpc GetUser UserRequest returns UserResponse rpc CreateUser CreateUserRequest returns CreateUserResponse rpc UpdateUser UpdateUserRequest returns UpdateUserResponse rpc DeleteUser DeleteUserRequest returns DeleteUserResponse rpc GetAllUsers Empty returns GetAllUsersResponse message UserRequest string id message UserResponse string id string name string location string title message CreateUserRequest string name string location string title message CreateUserResponse string data message UpdateUserRequest string id string name string location string title message UpdateUserResponse string data message DeleteUserRequest string id message DeleteUserResponse string data message Empty message GetAllUsersResponse repeated UserResponse users The snippet above does the following Specifies the use of proto syntax Declares user as the package name Uses the go package option to define the import path of the package and where the generated code will be stored Creates a service to Create Read Edit and Delete CRUD a user and their corresponding responses as messages Lastly we need to compile the user proto file using the command below protoc go out go opt paths source relative go grpc out go grpc opt paths source relative proto user protoThe command above uses the Protocol Buffer compiler to generate Golang server and client code by specifying the relative part and using the user proto file To avoid errors we must ensure we add Golang to the path On successful compilation we should see user grpc pb go and user pb go files added to the proto folder These files contain the gRPC generated server and client code In this article we will only use the server code Using the generated code from gRPC in our applicationWith the compilation process done we can start using the generated code in our application Database setup and integrationFirst we need to set up a database and a collection on MongoDB as shown below We also need to get our database connection string by clicking on the Connect button and changing the Driver to Go Secondly we must modify the copied connection string with the user s password we created earlier and change the database name To do this we need to create a env file in the root directory and add the snippet copied MONGOURI mongodb srv lt YOUR USERNAME HERE gt lt YOUR PASSWORD HERE gt cluster eakf mongodb net lt DATABASE NAME gt retryWrites true amp w majoritySample of a properly filled connection string below MONGOURI mongodb srv malomz malomzPassword cluster eakf mongodb net projectMngt retryWrites true amp w majorityThirdly we need to create a helper function to load the environment variable using the github com joho godotenv library To do this we need to create a configs folder in the root directory here create an env go file and add the snippet below package configsimport log os github com joho godotenv func EnvMongoURI string err godotenv Load if err nil log Fatal Error loading env file return os Getenv MONGOURI Fourthly we need to create a model to represent our application data To do this we need to create user model go file in the same configs folder and add the snippet below package configsimport go mongodb org mongo driver bson primitive type User struct Id primitive ObjectID json id omitempty Name string json name omitempty validate required Location string json location omitempty validate required Title string json title omitempty validate required Lastly we need to create a db go file to implement our database logic in the same configs folder and add the snippet below package configsimport context fmt log time go mongodb org mongo driver bson go mongodb org mongo driver bson primitive go mongodb org mongo driver mongo go mongodb org mongo driver mongo options type dbHandler interface GetUser id string User error CreateUser user User mongo InsertOneResult error UpdateUser id string user User mongo UpdateResult error DeleteUser id string mongo DeleteResult error GetAllUsers User error type DB struct client mongo Client func NewDBHandler dbHandler client err mongo NewClient options Client ApplyURI EnvMongoURI if err nil log Fatal err ctx context WithTimeout context Background time Second err client Connect ctx if err nil log Fatal err ping the database err client Ping ctx nil if err nil log Fatal err fmt Println Connected to MongoDB return amp DB client client func colHelper db DB mongo Collection return db client Database projectMngt Collection User func db DB CreateUser user User mongo InsertOneResult error col colHelper db ctx cancel context WithTimeout context Background time Second defer cancel newUser User Id primitive NewObjectID Name user Name Location user Location Title user Title res err col InsertOne ctx newUser if err nil return nil err return res err func db DB GetUser id string User error col colHelper db var user User ctx cancel context WithTimeout context Background time Second defer cancel objId primitive ObjectIDFromHex id err col FindOne ctx bson M id objId Decode amp user if err nil return nil err return amp user err func db DB UpdateUser id string user User mongo UpdateResult error col colHelper db ctx cancel context WithTimeout context Background time Second defer cancel objId primitive ObjectIDFromHex id update bson M name user Name location user Location title user Title result err col UpdateOne ctx bson M id objId bson M set update if err nil return nil err return result err func db DB DeleteUser id string mongo DeleteResult error col colHelper db ctx cancel context WithTimeout context Background time Second defer cancel objId primitive ObjectIDFromHex id result err col DeleteOne ctx bson M id objId if err nil return nil err return result err func db DB GetAllUsers User error col colHelper db var users User ctx cancel context WithTimeout context Background time Second defer cancel results err col Find ctx bson M if err nil return nil err for results Next ctx var singleUser User if err results Decode amp singleUser err nil return nil err users append users singleUser return users err The snippet above does the following Imports the required dependencies Line Defines a dbHandler interface that describes all the associated functions in our user management service Line Creates a DB struct with col property that will implement the dbHandler interface Line Creates a NewDBHandler constructor function that ties the DB struct and the dbHandler interface it implements by initializing the database connection to MongoDB and returning the appropriate response Line Creates a colHelper function that accepts the database connection by specifying the database name and associated collection Line Creates the required methods CreateUser GetUser UpdateUser DeleteUser and GetAllUsers with a DB pointer receiver and returns the appropriate responses The methods also use the appropriate methods from MongoDB to perform the required operationsIntegrating the database logic with gRPC generated codeWith our database logic setup we can use the methods to create our application handlers To do this we need to create a service folder here create a user service go file and add the snippet below package servicesimport context grpc go configs pb grpc go proto var db configs NewDBHandler type UserServiceServer struct pb UnimplementedUserServiceServer func service UserServiceServer GetUser ctx context Context req pb UserRequest pb UserResponse error resp err db GetUser req Id if err nil return nil err return amp pb UserResponse Id resp Id String Name resp Name Location resp Location Title resp Title nil func service UserServiceServer CreateUser ctx context Context req pb CreateUserRequest pb CreateUserResponse error newUser configs User Name req Name Location req Location Title req Title err db CreateUser newUser if err nil return nil err return amp pb CreateUserResponse Data User created successfully nil func service UserServiceServer UpdateUser ctx context Context req pb UpdateUserRequest pb UpdateUserResponse error newUser configs User Name req Name Location req Location Title req Title err db UpdateUser req Id newUser if err nil return nil err return amp pb UpdateUserResponse Data User updated successfully nil func service UserServiceServer DeleteUser ctx context Context req pb DeleteUserRequest pb DeleteUserResponse error err db DeleteUser req Id if err nil return nil err return amp pb DeleteUserResponse Data User details deleted successfully nil func service UserServiceServer GetAllUsers context Context pb Empty pb GetAllUsersResponse error resp err db GetAllUsers var users pb UserResponse if err nil return nil err for v range resp var singleUser amp pb UserResponse Id v Id String Name v Name Location v Location Title v Title users append users singleUser return amp pb GetAllUsersResponse Users users nil The snippet above does the following Imports the required dependencies Initializes the database using the NewDBHandler constructor function Creates a UserServiceServer that implements the gRPC generated UserServiceServer interface inside the user grpc pb go file Creates the required methods by passing the UserServiceServer struct as a pointer and returning the appropriate responses as generated by gRPCCreating the serverWith that done we can create the application gRPC server by creating a main go file in the root directory and add the snippet below package mainimport log net pb grpc go proto grpc go services google golang org grpc func main lis err net Listen tcp if err nil log Fatalf failed to listen v err grpcServer grpc NewServer service amp services UserServiceServer pb RegisterUserServiceServer grpcServer service err grpcServer Serve lis if err nil log Fatalf Error strating server v err The snippet above does the following Imports the required dependencies Specifies the application port using the in built net package Creates an instance of gRPC server using the NewServer method and specifies the associated service using the UserServiceServer struct Register the service implementation with the gRPC server Starts the server using the Serve method by passing the required port and handling errors appropriatelyWith that done we can test our application by running the command below in our terminal go run main go Testing with PostmanWith our server up and running we can test our application by creating a new gRPC Request Input grpc as the URL select the Import a proto file option and upload the user proto file we created earlier With that done the corresponding method will be populated and we can test them accordingly We can also validate that our gRPC server works by checking our MongoDB collection ConclusionThis post discussed what gRPC is its role in building scalable applications and how to get started by building a user management service with Golang and MongoDB Beyond what was discussed above gRPC offers robust techniques around authentication error handling performance etc These resources might be helpful Golang gRPC implementation Golang Protocol Buffer implementation MongoDB Golang driver |
2023-05-23 12:44:33 |
海外TECH |
DEV Community |
Converting Jupyter Notebooks to Markdown Made Easy with nbconvert |
https://dev.to/coderatul/converting-jupyter-notebooks-to-markdown-made-easy-with-nbconvert-8dl
|
Converting Jupyter Notebooks to Markdown Made Easy with nbconvert Introduction As a contributor to an open source project I recently found myself tasked with documenting a showcase using Jupyter Notebooks The challenge was to convert the showcase ipynb file into a Markdown format that could be easily shared and accessed by project collaborators and users After trying out various tools and methods I came across a powerful and reliable solution that stood out from the rest nbconvert a tool developed by the Jupyter community In this article I ll share my experience using nbconvert to convert Jupyter Notebooks to Markdown and explain why it became my go to tool for this task Why Convert Jupyter Notebooks to Markdown Jupyter Notebooks are a popular choice for interactive data exploration analysis and documentation They allow you to combine code text and visualizations making them an excellent medium for showcasing your work However when it comes to sharing your notebooks with others or integrating them into documentation pipelines Markdown offers a more accessible and widely supported format Markdown is a lightweight markup language that can be easily converted into HTML PDF or other formats By converting Jupyter Notebooks to Markdown you can maintain the narrative flow include code snippets and preserve visualizations while making the content more portable and readable Discovering nbconvert During my search for a reliable tool to convert Jupyter Notebooks to Markdown I stumbled upon nbconvert an official Jupyter community project hosted on GitHub nbconvert provides a command line interface CLI and a Python API for converting notebooks to various output formats including Markdown Here s why I found nbconvert to be an excellent choice Comprehensive Conversion Capabilities nbconvert offers a wide range of conversion options allowing you to customize the output according to your requirements It supports converting notebooks to HTML LaTeX PDF Reveal js slides and more Additionally it provides advanced options for controlling template selection syntax highlighting and code execution during the conversion process Simple Command Line Interface Using nbconvert from the command line is straightforward With a single command you can convert a notebook to Markdown specifying the input and output files This simplicity makes it easy to integrate nbconvert into your documentation workflows or automation scripts Extensibility and Customization nbconvert s architecture is designed to be extensible allowing you to customize the conversion process by creating your own templates and pre or post processing hooks This flexibility enables you to tailor the output to match your project s branding or specific documentation requirements Converting showcase ipynb to Markdown Once I discovered nbconvert converting my showcase ipynb to Markdown became a breeze I followed these simple steps Install nbconvert pip install nbconvertConvert the notebook to Markdown jupyter nbconvert to markdown showcase ipynbVoilà The showcase ipynb file was successfully converted to showcase md ready to be shared and integrated into the project s documentation Conclusion Converting Jupyter Notebooks to Markdown is a valuable skill for open source contributors and anyone involved in data science or documentation workflows Among the various tools available nbconvert stands out as a reliable and feature rich solution for this task By leveraging nbconvert s comprehensive conversion capabilities user friendly command line interface and extensibility I was able to seamlessly convert my showcase ipynb to Markdown With the resulting Markdown file I could share my work more effectively collaborate with fellow contributors and integrate it into the project s documentation pipeline If you re looking for a powerful and versatile tool to convert your Jupyter Notebooks to Markdown I highly |
2023-05-23 12:13:52 |
海外TECH |
DEV Community |
Building a bidding system with NextJS 🚀 |
https://dev.to/novu/building-a-bidding-system-with-nextjs-cg1
|
Building a bidding system with NextJS TL DRNextJS introduced its new server actions components and I had to test them out to see what is all the fuss about I have built a simple app where you can register to the system add a new product and bid on it Once the bid is in it will notify the other bidders that they have been outbid It will also inform the seller of a new bid in the system Novu the open source notification infrastructureJust a quick background about us Novu is the first open source notification infrastructure We basically help to manage all the product notifications It can be In App the bell icon like you have in the Dev Community Websockets Emails SMSs etc I would be super happy if you could give us a star It will help me to make more articles every week Installing the projectWe will start the project by initiating a new NextJS project npx create next app latestAnd mark the following detailsWhat is your project named …new projWould you like to use TypeScript with this project …No YesWould you like to use ESLint with this project …No YesWould you like to use Tailwind CSS with this project …No YesWould you like to use src directory with this project …No YesUse App Router recommended …No YesWould you like to customize the default import alias …No YesLet s go into the foldercd new projAnd modify our next config js to look like this type import next NextConfig const nextConfig experimental serverActions true module exports nextConfig We are adding the ability to use the server actions as it s currently still in the beta stage This will allow us to call the server directly from the client Creating a databaseFor our project we are going to use Postgres Feel free to host it yourself use docker neon tech supabase or equivalent For our example we will use Vercel Postgres You can start by going to Vercel Storage area and creating a new database We will start by adding our bid table It will contain the product s name the product the owner of the product and the current amount of bids Click on the query tab and run the following querycreate table bids id SERIAL PRIMARY KEY name varchar owner varchar total bids int default not null Click on env local tab and copy everything Open a new file in our project named env and paste everything inside Then install Vercel Postgres by running npm install vercel postgres Building the Login pageWe don t want people to have access to any page without logging in in any path For that let s work on the main layout and put our login logic there Edit layout tsx and replace it with the following code import globals css import cookies from next headers import Login from biddingnew components login export default async function RootLayout children children React ReactNode const login cookies get login return lt html lang en gt lt body gt login children lt Login gt lt body gt lt html gt Very simple react component We are getting the login cookie from the user If the cookie exists let Next JS render any route If not show the login page Let s look at a few things here Our component is async which is required when using the new App router directory We are taking the cookie without any useState as this is not a client only component and the state doesn t exist If you are unsure about the App router s new capabilities please watch the video at the bottom as I explain everything Let s build the login componentThis is a very simple login component just the person s name no password or email use client import FC useCallback useState from react const Login FC lt setLogin value string gt void gt props gt const setLogin props const username setUsername useState const submitForm useCallback async e gt setLogin username e preventDefault return false username return lt div className w full flex justify center items center h screen gt lt form className bg white w shadow md rounded px pt pb mb onSubmit submitForm gt lt div className mb gt lt label className block text gray text sm font bold mb htmlFor username gt Username lt label gt lt input onChange event gt setUsername event target value className shadow appearance none border rounded w full py px text gray leading tight focus outline none focus shadow outline id username type text placeholder Enter your username gt lt div gt lt div className flex items center justify between gt lt button className bg blue hover bg blue text white font bold py px rounded focus outline none focus shadow outline type submit gt Sign In lt button gt lt div gt lt form gt lt div gt export default Login Let s take a few notes here We are using use client which means this component will run over the client As a result you can see that we have the useState available to us To clarify you can use client components inside server components but not vice versa We have added a requirement for a parameter called setLogin it means once somebody clicks on the submit function it will trigger the login function Let s build the setLogin over the main layout page This is where the magic happens 🪄We will create a function using the new Next JS server actions method The method will be written in the client However it will run over the server In the background Next JS actually sends an HTTP request import globals css import cookies from next headers import Login from biddingnew components login export default async function RootLayout children children React ReactNode const loginFunction async user string gt use server cookies set login user return true const login cookies get login return lt html lang en gt lt body className inter className gt login children lt Login setLogin loginFunction gt lt body gt lt html gt As you can see there is a new function called loginFunction and at the start there is a use server This tells the function to run over the server It will get the user name from the setLogin and set a new cookie called login Once done the function will re render and we will see the rest of the routes Building the bidding pageLet s start by editing our page tsx fileWe will start by adding a simple code for getting all the bids from our database const rows await sql SELECT FROM bids ORDER BY id DESC Let s also add our login cookie informationconst login cookies get login The entire content of the page import Image from next image import sql from vercel postgres import cookies from next headers export default async function Home const rows await sql SELECT FROM bids ORDER BY id DESC const login cookies get login return lt div className text black container mx auto p border l border white border r min h vh gt lt div className flex gt lt h className flex text xl font bold mb text white gt Product Listing login value lt h gt lt div gt lt div className grid grid cols gap gt rows map product gt lt div key product id className bg white border border gray p gt lt div className text lg mb gt lt strong gt Product Name lt strong gt product name lt div gt lt div className text lg mb gt lt strong gt Owner lt strong gt product owner lt div gt lt div className text lg gt lt strong gt Current Bid lt strong gt product total bids lt div gt lt div gt lt div gt lt div gt Very simple component We get all the bids from the database iterate and display them Now let s create a simple component to add new products Create a new component named new product tsx use client import FC useCallback useState from react export const NewProduct FC lt addProduct name string gt void gt props gt const addProduct props const name setName useState const addProductFunc useCallback gt setName addProduct name name return lt div className flex mb gt lt input value name placeholder Product Name name name className w onChange e gt setName e target value gt lt button type button onClick addProductFunc className w bg blue hover bg blue text white font bold py px rounded gt New Product lt button gt lt div gt The component looks almost exactly like our login component Not the moment the user adds a new product we will trigger a function that will do that for us const addProduct async product string gt use server const login cookies get login const rows await sql INSERT INTO bids name owner total bids VALUES product login value RETURNING id revalidatePath We use SQL here directly from the client You can also see that the SQL function takes care of any XSS or SQL injections I haven t used any bindings We insert into the database a new product You can see that we use the owner by using the name saved in the cookie We also set the bidding to In the end we must tell the app to revalidate the path If not we will not see the new product The final page will look like this import sql from vercel postgres import cookies from next headers import NewProduct from biddingnew components new product import revalidatePath from next cache export default async function Home const addProduct async product string gt use server const login cookies get login const rows await sql INSERT INTO bids name owner total bids VALUES product login value RETURNING id revalidatePath const rows await sql SELECT FROM bids ORDER BY id DESC const login cookies get login return lt div className text black container mx auto p border l border white border r min h vh gt lt div className flex gt lt h className flex text xl font bold mb text white gt Product Listing login value lt h gt lt div gt lt NewProduct addProduct addProduct gt lt div className grid grid cols gap gt rows map product gt lt div key product id className bg white border border gray p gt lt div className text lg mb gt lt strong gt Product Name lt strong gt product name lt div gt lt div className text lg mb gt lt strong gt Owner lt strong gt product owner lt div gt lt div className text lg gt lt strong gt Current Bid lt strong gt product total bids lt div gt lt div gt lt div gt lt div gt Now let s create a new component for adding a bid to a product Create a new file called bid input tsx and add the following code use client import FC useCallback useState from react export const BidInput FC lt id number addBid id number num number gt void gt props gt const id addBid props const input setInput useState const updateBid useCallback gt addBid id input setInput input return lt div className flex pt gt lt input placeholder Place bid className flex border border black p value input onChange e gt setInput e target value gt lt button type button className bg black text white p onClick updateBid gt Add Bid lt button gt lt div gt The component is almost the same as the product component The only difference is that it also gets an ID parameter of the current product to tell the server which bid to update Now let s add the bidding logic const addBid async id number bid number gt use server const login cookies get login await sql UPDATE bids SET total bids total bids bid WHERE id id revalidatePath A very simple function that gets the bid id and increases the total The full page code should look like this import sql from vercel postgres import cookies from next headers import NewProduct from biddingnew components new product import revalidatePath from next cache import BidInput from biddingnew components bid input export default async function Home const addBid async id number bid number gt use server const login cookies get login await sql UPDATE bids SET total bids total bids bid WHERE id id revalidatePath const addProduct async product string gt use server const login cookies get login const rows await sql INSERT INTO bids name owner total bids VALUES product login value RETURNING id revalidatePath const rows await sql SELECT FROM bids ORDER BY id DESC const login cookies get login return lt div className text black container mx auto p border l border white border r min h vh gt lt div className flex gt lt h className flex text xl font bold mb text white gt Product Listing login value lt h gt lt div gt lt NewProduct addProduct addProduct gt lt div className grid grid cols gap gt rows map product gt lt div key product id className bg white border border gray p gt lt div className text lg mb gt lt strong gt Product Name lt strong gt product name lt div gt lt div className text lg mb gt lt strong gt Owner lt strong gt product owner lt div gt lt div className text lg gt lt strong gt Current Bid lt strong gt product total bids lt div gt lt div gt lt BidInput addBid addBid id product id gt lt div gt lt div gt lt div gt lt div gt We have a fully functional bidding system The only thing left is to send notifications to the users where there is a new bid Let s do it Adding notificationsWe will show a nice bell icon on the right to send notifications between users on a new bid Go ahead and register for Novu Once done enter the Settings page move to the API Keys tab and copy the Application Identifier Let s install Novu in our projectnpm install novu notification centerNow let s create a new component called novu tsx and add the notification center code use client import NotificationBell NovuProvider PopoverNotificationCenter from novu notification center import FC from react export const NovuComponent FC lt user string gt props gt const user props return lt gt lt NovuProvider subscriberId user applicationIdentifier APPLICATION IDENTIFIER gt lt PopoverNotificationCenter onNotificationClick gt window location reload gt unseenCount gt lt NotificationBell unseenCount unseenCount gt lt PopoverNotificationCenter gt lt NovuProvider gt lt gt The component is pretty simple Just ensure you update the application identifier with the one you have on the Novu dashboard You can find the full reference of the notification component over Novu Documentation As for the subscriberId it can be anything that you choose For our case we use the name from the cookie so each time we send a notification we will send it to the name from the cookie This is not a safe method and you should send an encrypted id in the future But it s ok for the example Now let s add it to our code The full page code should look something like this import Image from next image import sql from vercel postgres import cookies from next headers import NovuComponent from biddingnew components novu component import NewProduct from biddingnew components new product import revalidatePath from next cache import BidInput from biddingnew components bid input export default async function Home const addBid async id number bid number gt use server const login cookies get login await sql UPDATE bids SET total bids total bids bid WHERE id id const rows await sql SELECT FROM bids WHERE id id revalidatePath const addProduct async product string gt use server const login cookies get login const rows await sql INSERT INTO bids name owner total bids VALUES product login value RETURNING id revalidatePath const rows await sql SELECT FROM bids ORDER BY id DESC const login cookies get login return lt div className text black container mx auto p border l border white border r min h vh gt lt div className flex gt lt h className flex text xl font bold mb text white gt Product Listing login value lt h gt lt div gt lt NovuComponent user login value gt lt div gt lt div gt lt NewProduct addProduct addProduct gt lt div className grid grid cols gap gt rows map product gt lt div key product id className bg white border border gray p gt lt div className text lg mb gt lt strong gt Product Name lt strong gt product name lt div gt lt div className text lg mb gt lt strong gt Owner lt strong gt product owner lt div gt lt div className text lg gt lt strong gt Current Bid lt strong gt product total bids lt div gt lt div gt lt BidInput addBid addBid id product id gt lt div gt lt div gt lt div gt lt div gt We can see the Novu notification bell icon however we are not sending any notifications yet So let s do it Every time somebody creates a new product we will create a new topic for it Then on each notification to the same product we will register subscribers to it Let s take an example The host creates a new product a topic is created User adds a new bid registers himself to the topic and sends everybody registered to the topic that there is a new bid currently nobody is registered User adds a new bid registers himself to the topic and sends everybody registered to the topic that there is a new bid User gets a notification User adds a new bid registers himself to the topic and sends everybody registered to the topic that there is a new bid User gets a notification and User gets a notification User adds a new bid to the same topic and sends everybody registered to the topic that there is a new bid User gets a notification and User gets a notification Now let s go over to the Novu dashboard and add a new templateLet s create a new template and call it New bid in the system let s drag a new In App channel and add the following content name just added a bid of bid Once done enter the Settings page move to the API Keys tab and copy the API KEY Let s add Novu to our project npm install novu nodeAnd let s add it to the top of our file and change the API KEY with our API KEY from the Novu dashboard import Novu from novu node const novu new Novu API KEY Now when the host creates a new product let s create a new topic so let s modify our addProduct Function to look like this const addProduct async product string gt use server const login cookies get login const rows await sql INSERT INTO bids name owner total bids VALUES product login value RETURNING id await novu topics create key bid rows id name People inside of a bid revalidatePath We have added a new novu topics create function which creates a new topic The topic key must be unique We used the created ID of the bid to create the topic The name is anything that you want to understand what it is in the future So we have created a new topic On a new bid the only thing left is to register the user to the topic and notify everybody about it Let s modify addBid and add the new logic const addBid async id number bid number gt use server const login cookies get login await sql UPDATE bids SET total bids total bids bid WHERE id id await novu topics addSubscribers bid id subscribers login value await novu trigger new bid in the system to type Topic topicKey bid id payload name login value bid bid actor subscriberId login value as ITriggerPayloadOptions revalidatePath As you can see we use novu topics addSubscribers to add the new user to the topic And then we trigger the notification to the topic with novu trigger to notify everybody about the new bid We also have the actor parameter since we are already registered to the topic we don t want to send a notification to ourselves We can pass our identifier to the actor parameter to avoid that Only one thing is missing The host is clueless about what s going on The host is not registered to the topic and not getting any notifications We should send the host a notification on any bid So let s create a new template for that Now let s go over to the Novu dashboard and add a new templateLet s create a new template and call it Host bid Let s drag a new In App channel and add the following content Congratulation name just added a bid of bid Now the only thing left is to call the trigger every time to ensure the host gets the notification Here is the new code of addBidconst addBid async id number bid number gt use server ts ignore const login cookies get login await sql UPDATE bids SET total bids total bids bid WHERE id id const rows await sql SELECT FROM bids WHERE id id await novu trigger host bid to subscriberId rows owner payload name login value bid bid await novu topics addSubscribers bid id subscribers login value await novu trigger new bid in the system to type Topic topicKey bid id payload name login value bid bid actor subscriberId login value as ITriggerPayloadOptions revalidatePath Here is the full code of the page import Image from next image import sql from vercel postgres import cookies from next headers import NovuComponent from biddingnew components novu component import NewProduct from biddingnew components new product import revalidatePath from next cache import BidInput from biddingnew components bid input import ITriggerPayloadOptions from novu node build main lib events events interface import Novu from novu node const novu new Novu API KEY export default async function Home const addBid async id number bid number gt use server ts ignore const login cookies get login await sql UPDATE bids SET total bids total bids bid WHERE id id const rows await sql SELECT FROM bids WHERE id id await novu trigger host inform bid to subscriberId rows owner payload name login value bid bid await novu topics addSubscribers bid id subscribers login value await novu trigger new bid in the system to type Topic topicKey bid id payload name login value bid bid actor subscriberId login value as ITriggerPayloadOptions revalidatePath const addProduct async product string gt use server ts ignore const login cookies get login const rows await sql INSERT INTO bids name owner total bids VALUES product login value RETURNING id await novu topics create key bid rows id name People inside of a bid revalidatePath const rows await sql SELECT FROM bids ORDER BY id DESC ts ignore const login cookies get login return lt div className text black container mx auto p border l border white border r min h vh gt lt div className flex gt lt h className flex text xl font bold mb text white gt Product Listing login value lt h gt lt div gt lt NovuComponent user login value gt lt div gt lt div gt lt NewProduct addProduct addProduct gt lt div className grid grid cols gap gt rows map product gt lt div key product id className bg white border border gray p gt lt div className text lg mb gt lt strong gt Product Name lt strong gt product name lt div gt lt div className text lg mb gt lt strong gt Owner lt strong gt product owner lt div gt lt div className text lg gt lt strong gt Current Bid lt strong gt product total bids lt div gt lt div gt lt BidInput addBid addBid id product id gt lt div gt lt div gt lt div gt lt div gt And you are done You can find the full source code of the project here You can watch the full video of the same tutorial here Novu Hackathon is live The ConnectNovu Hackathon is live This is your time to showcase your skills meet new team members and grab awesome prizes If you love notifications this Hackathon is for you You can create any system that requires notifications using Novu SMS Emails In App Push anything you choose We have also prepared a list of topics you can choose from just in case you don t know what to do Some fantastic prizes are waiting for you Such as GitHub sponsorships of Novu s Swag Pluralsight subscription and excellent Novu benefits |
2023-05-23 12:04:06 |
Apple |
AppleInsider - Frontpage News |
Samsung's new display tech could return Touch ID to the iPhone |
https://appleinsider.com/articles/23/05/23/samsungs-new-display-tech-could-return-touch-id-to-the-iphone?utm_medium=rss
|
Samsung x s new display tech could return Touch ID to the iPhoneSamsung s new OLED display panels have integrated fingerprint and health sensors potentially paving the way for the return of Touch ID in future iPhone models iPhone Touch IDThe Sensor OLED Display can measure a person s heart rate blood pressure and stress level with a touch of two fingers on the screen In contrast to the conventional approach of incorporating fingerprint sensors as separate modules beneath the panel Samsung Display has integrated the light sensing organic photodiode OPD directly within the panel structure Read more |
2023-05-23 12:49:42 |
海外TECH |
Engadget |
Samsung's new Sensor OLED display can read fingerprints anywhere on the screen |
https://www.engadget.com/samsungs-new-sensor-oled-display-can-read-fingerprints-anywhere-on-the-screen-121346659.html?src=rss
|
Samsung x s new Sensor OLED display can read fingerprints anywhere on the screenSamsung has unveiled a new display technology that could lead to new biometric and health related capabilities in future phones and tablets The tech giant has debuted what it calls the Sensor OLED Display that can read your fingerprints regardless of what part of the screen you touch at this year s SID Display Week in LA While most smartphones now have fingerprint readers on the screen their sensors are attached under the panel as a separate module that only works within a small designated area For Sensor OLED Samsung said it embedded the fingerprint sensor into the panel itself nbsp Since the display technology can read fingerprints anywhere on the screen it can also be used to monitor your heart rate and blood pressure The company said it can even return more accurate readings than available wearables can To measure your blood pressure you d need to place two fingers on the screen OLED light is apparently reflected differently depending on your blood vessels contraction and relaxation After that information is returned to the panel the sensor converts it into health metrics Samsung explained in its press release quot To accurately measure a person s blood pressure it is necessary to measure the blood pressure of both arms The Sensor OLED display can simultaneously sense the fingers of both hands providing more accurate health information than existing wearable devices quot The company has yet to announce if it s planning to use this new technology on devices it s releasing in the future but the exhibit at SID Display already shows it being able to read blood pressure and heart rate nbsp In addition to Sensor OLED Samsung has also showcased the Rollable Flex screen that can expand more than five times in length when unrolled Meanwhile its Flex In amp Out phone concept shows a Galaxy Fold like device that you can vertically fold inward or outward It eliminates the need for an external display which could lead to thinner foldable phones nbsp SamsungThis article originally appeared on Engadget at |
2023-05-23 12:13:46 |
海外TECH |
Engadget |
Skullcandy's latest cheap earbuds cost just $20 |
https://www.engadget.com/skullcandys-latest-cheap-earbuds-cost-just-20-120031703.html?src=rss
|
Skullcandy x s latest cheap earbuds cost just Skullcandy is well known for offering decent affordable audio gear and the brand s latest earbuds are even less expensive than the Dime from The Smokin Buds True Wireless Earbuds will set you back just The company is promising plenty of bells and whistles with these earbuds such as clear full range sound backed by impressive bass depth In addition Skullcandy says users can expect expertly tuned drivers There are EQ modes designed to help you get the most out of music movies and podcasts Each earbud has a microphone so you can wear either one at a time There are touch controls for volume calls and EQ modes and you ll be able to activate a voice assistant by tapping either earbud Skullcandy says the Smokin Buds have a comfortable noise isolating fit thanks to an ergonomic oval design IPX sweat and water resistance should help make them durable What s more Skullcandy claims you ll get up to eight hours of use on a single charge and an extra hours from the charging case The brand also says a rapid charging feature can add two hours of playtime after just minutes of charging Bluetooth support should help the earbuds to pair with devices swiftly too SkullcandyOn top of all of that Skullcandy says the Smokin Buds are environmentally conscious They re made with percent certified recycled plastics a consolidated part count and smaller more efficient batteries while the packaging is completely recyclable “With percent of earbud sales happening in the under price range we aimed to provide a better option that would mitigate the environmental impact of this popular high volume category Jason Luthman Skullcandy s director of global product management said Given the price it s hard to imagine that the Smokin Buds will truly compete against the very best earbuds on the market in terms of audio quality Still they check a lot of the right boxes at this price range don t go expecting active noise cancellation for bucks and they could be a handy backup pair or a viable option for workouts instead of using fancier earbuds when you re working up a sweat This article originally appeared on Engadget at |
2023-05-23 12:00:31 |
Cisco |
Cisco Blog |
Using digital to create better healthcare and more resilient communities |
https://feedpress.me/link/23532/16142684/using-digital-to-create-better-healthcare-and-more-resilient-communities
|
Using digital to create better healthcare and more resilient communitiesRead the findings of a recent forum on the important role of technology innovation in healthcare and need for greater collaboration to improve healthcare outcomes |
2023-05-23 12:58:14 |
金融 |
金融庁ホームページ |
「記述情報の開示の充実に向けた解説動画」を配信しています。 |
https://www.fsa.go.jp/news/r4/singi/20230523/00.html
|
解説動画 |
2023-05-23 13:00:00 |
ニュース |
BBC News - Home |
Rolf Harris: Serial abuser and ex-entertainer dies aged 93 |
https://www.bbc.co.uk/news/uk-60393842?at_medium=RSS&at_campaign=KARANGA
|
assaults |
2023-05-23 12:12:10 |
ニュース |
BBC News - Home |
Ukraine war: Fleeing Belgorod residents told to stay away |
https://www.bbc.co.uk/news/world-europe-65683374?at_medium=RSS&at_campaign=KARANGA
|
border |
2023-05-23 12:30:44 |
ニュース |
BBC News - Home |
Immigration curbs on families of foreign students |
https://www.bbc.co.uk/news/uk-politics-65683046?at_medium=RSS&at_campaign=KARANGA
|
levels |
2023-05-23 12:22:02 |
ニュース |
BBC News - Home |
Wayne Couzens: Ex-Met PC in flashing case found guilty of gross misconduct |
https://www.bbc.co.uk/news/uk-england-london-65671361?at_medium=RSS&at_campaign=KARANGA
|
couzens |
2023-05-23 12:41:28 |
ニュース |
BBC News - Home |
IMF expects UK economy to avoid recession |
https://www.bbc.co.uk/news/business-65669399?at_medium=RSS&at_campaign=KARANGA
|
inflation |
2023-05-23 12:09:46 |
ニュース |
BBC News - Home |
Paris 2024 Olympics: France to deploy 35,000 security personnel with fears over possible drone attacks |
https://www.bbc.co.uk/sport/olympics/65685179?at_medium=RSS&at_campaign=KARANGA
|
Paris Olympics France to deploy security personnel with fears over possible drone attacksFrance will deploy security and military personnel to protect the Paris Olympic Games opening ceremony from threats including drone attacks |
2023-05-23 12:32:13 |
コメント
コメントを投稿