投稿時間:2022-04-18 06:17:59 RSSフィード2022-04-18 06:00 分まとめ(19件)

カテゴリー等 サイト名等 記事タイトル・トレンドワード等 リンクURL 頻出ワード・要約等/検索ボリューム 登録日
js JavaScriptタグが付けられた新着投稿 - Qiita jQueryで指定文字以上でボタンを非活性にする https://qiita.com/chakiryou/items/43932ac6d41f1becdcc2 jquery 2022-04-18 05:54:18
海外TECH DEV Community A suspicion for a long time about Time-Travel? https://dev.to/elsa/a-suspicion-for-a-long-time-about-time-travel-1pkd A suspicion for a long time about Time Travel I have had a suspicion for a long time Please HELP me If an object goes much faster than light it will go to the past I now have a picture for example It has ball A in the center and ball B Circling it Assume that ball B is orbiting ball A fast at a very large interval In which the large ball A in the middle passes from the center faster i e faster than light Now that ball A travels past the same speed but it goes straight without changing direction Then that little ball B comes straight to ball A Now the question is Now ball A travels past past ball B is not in the opposite direction only then comes closer This is the past tense of Ball A But in real time the ball A collides directly with the ball BIs coming this is the present tense event of ball B Now will ball A collide with ball B What is the past like in such a conflict 2022-04-17 20:43:59
海外TECH DEV Community Cloud workstations: the future of remote work https://dev.to/isaacdlyman/cloud-workstations-the-future-of-remote-work-5e8p Cloud workstations the future of remote workApplication streaming is one of the emerging technologies I m most bullish on So far its full potential has flown under the radar but there are companies doing impressive things with it Xbox Cloud Gaming currently in beta streams Xbox games from cloud servers with low latency even on an LTE connection It s powered by Rainway whose streaming offering has pivoted from video games to fully interactive streamed apps of every kind Google Stadia is a similar service with a library of games you can buy and then play exclusively through the cloud Amazon AppStream offers non persistent desktops and apps in the cloud It interfaces with identity and storage solutions to provide secure work environments for enterprise customers Workspot was the first cloud workstation company They began offering cloud Linux desktops in but shut down in the aftermath of the dotcom crash Their domain and name were purchased by a company that now offers cloud Windows desktops including high end GPU solutions for graphics intensive work Shadow PC is a BC offering of persistent high end cloud PCs originally marketed to gamers At per user per month it also has compelling potential for enterprise customers Remote Desktop tools while clearly behind the forefront of technology have long been popular for work that must occur in a particular location or on a particular operating system Amazon AppStream Workspot and Shadow PC fall under the umbrella of Desktop as a Service or DaaS DaaS allows powerful workstations to be provisioned in the cloud and used for professional performance sensitive work via an endpoint that is any device with a screen The advantages to using a cloud workstation instead of traditional hardware are strong enough that I predict it will eventually become a major player in enterprise work There are some barriers to be crossed though Most people would probably say they prefer to have their computing power inside their computer rather than connecting to a remote workstation every time they need to do something more demanding than sending an email It s true that there are several potential downsides to remote computing as a way of life Performance Most people s experience with remote computing is limited to Remote Desktop on Windows Remote Desktop is an awful experience characterized by an ultralow frame rate and ms or more of latency as a baseline When running a CPU heavy process it quickly becomes unusable If this is your only point of reference a knee jerk reaction against the category is completely understandable Internet dependence If your ISP isn t dependable any blip in your connection could mean temporarily losing the ability to work Internet dependence also makes travel more difficult A connection that dips in and out every few minutes e g on an airplane is enough to drive anyone up the wall so the idea of losing access to your entire computer when that happens is especially unpleasant Versatility As inadvisable as it may be many people use their work computer for non work activities like contracting on the side or playing video games A workstation intended for remote computing would mean diminished capacity on one s physical endpoint for other things Ownership Some employers would abuse their access to remote workstations to install spyware on their employees computers or delete files without permission Beyond that there s also a sense of pride involved in owning a high performance computer even if it s technically property of the company Some employees may measure their value to the company by the class of computer allotted to them Distance and complexity If a physical computer breaks down there are things you can do to try to rescue it like booting in Safe Mode or removing the battery A remote workstation doesn t offer these possibilities The physical distance between you and your primary computing environment can be a factor in how difficult it is to troubleshoot problems Incentives Dell Apple et al are incentivized to build the fastest computers possible The first thing a power user read big spender does when comparison shopping is look at the performance specs of each device A cloud computing vendor s target market would be enterprise companies not end users so they may be incentivized to sacrifice performance for a variety of reasons When many decision makers are involved performance almost always goes by the wayside So pushback from employees should be expected Much of it is justified Having a high performance computer issued by your employer is a good experience most of the time and Remote Desktop is a bad experience most of the time However Remote Desktop is not representative of the sector With the right technology there are considerable potential advantages to working in a cloud desktop environment Performance Processing power can be offered more cheaply and efficiently in the cloud A cloud environment also has the ability to offer automatic scaling for CPU GPU RAM and hard drive space No employee uses all of their computer s resouces hours a day but many hit now and then suffering reduced productivity on power intensive tasks The ability to hot swap cores and capacity between environments making efficient use of hardware and employee time is possible if they all exist in the same cloud Theft mitigation Stolen computers are estimated to cost the corporate world billion dollars per year The actual computer hardware is only a fraction of the total cost per incident It can take a week or longer to procure and ship a replacement computer and then for the employee to install the applications they need and restore their files and settings There s also a significant security cost for an IT team to investigate the incident roll over compromised tokens and passwords and mitigate any associated data loss and regulatory risks On the other hand if the employee s computer is a cheap and naive portal to a cloud system it can be replaced without incurring setup time and few if any files will have been compromised Under ideal circumstances mitigation would consist of resetting the employee s cloud password and ending any active sessions As long as employees practice good internet hygiene many of the security risks of laptop theft can be avoided entirely Emergency access In the event of a breach or zero day a company would have the means to audit patch or update every employee s workstation overnight without waiting for them to respond to a notification or even turn on their computer Of course any back door into cloud workstations would be a major part of the company s risk profile and many would prefer not to do this but for less privileged systems there are security conscious ways to allow limited access for urgent concerns Easy upgrades and repairs Upgrading an employee s workstation involves several of the same costs and delays as replacing a stolen machine If their primary work environment is in the cloud however all the hardware components they rely on can be upgraded without their direct involvement No productive time needs to be lost Their disk can even be imaged and moved to a new configuration or a whole new cloud with minimal disruption And if there s a problem with their cloud workstation there s no need for them to ship it to the company s IT department and wait for it to be returned Their physical endpoint may still break down but since one endpoint is as good as another the cost of replacement is marginal Form factor Cloud desktops offer everyone the ability to use the endpoint that best meets their needs regardless of the amount of computing power they require whether that s an iPad with a keyboard cover for frequent flyers or a dual monitor station with a mechanical keyboard for those who work from a home office In a pinch you can even stream your workstation to a smartphone or smart TV As a software engineer that works in technology throughout the stack data visualization compiled code ETL processes performance sensitive queries and so on my response to a Desktop as a Service offering at work would depend heavily on the technology powering it The advantages are clear the power and freedom to work without disruptions and never have to think about my hardware But the potential downsides do give me pause To get buy in I think most employees would need some assurances Performance Beyond a simple uptime SLA streaming performance should be part of the contract so that incentives are aligned Any network latency or framerate reduction that can be detected by a human is too much A cloud workstation has to replicate the responsiveness and smoothness of a native workstation to be a suitable replacement There s ample evidence that video games the most latency sensitive applications there are can perform admirably over streaming even on Stadia a service criticized on release for its latency issues I found Destiny to be perfectly playable Better technology and closer data centers should keep latency in the single digit millisecond range or close to it but if poor corporate decision making and technical bloat lead to slowdowns clients should have contractual recourse Choice Employees should know that DaaS is being offered for their convenience and productivity not as a cost cutting measure Most companies understand that giving up even one percent of their workforce s productivity to save a few bucks on workstations would be shooting themselves in the foot But to avoid any misunderstanding DaaS should be opt in with the ability to opt out at any time and trade in one s cloud workstation for traditional hardware Privacy The exact circumstances and conditions of corporate access to an employee s cloud workstation should be specified in clear and simple terms For example if an employee uses a picture of their family as a desktop background they should know that the picture is their own private file and won t ever be accessed copied or used by anyone else If their workstation ever has to be accessed without their advance permission they should be notified immediately Backups Every employee s cloud storage should be backed up at least daily An incident at the data center should never result in loss of work Scalability Since CPU cores and memory can be offered more cheaply in a data center than in individual hardware endpoints employees should be aware that they ll have access to more computing power via DaaS than they could reasonably have in a traditional workstation Where possible automatic server scaling should also be offered The prospect of being able to scale up to supercomputer levels of processing power will be very appealing to data engineers video and audio producers and other power users But this has to come with a guaranteed minimum never less than x CPU cores y GHz of processing power and z GBs of RAM per workstation so there s no concern of bottlenecking during peak hours Ease of access Although it s reasonable to ask employees to be protective of their cloud password and use multi factor authentication accessing their cloud workstation shouldn t be a hassle To use a device via Remote Desktop it s sometimes necessary to pass two or three login screens as well as open an Authenticator app to get a generated token or wait for a one time code via text message Logging into a cloud workstation should involve a single login screen username password FA code These caveats granted I would jump at the chance to use a cloud workstation versus my current work computer No more week long setup process when I upgrade my hardware no more carrying around a heavy and costly work laptop when I go on vacation no more trying to explain complicated fixes over the phone if something breaks while I m away from my computer If you tack on the benefits of increased processing power for intensive queries and tasks the decision is easy I don t expect everyone to agree with me Travelers people who don t have access to reliable internet and hardware enthusiasts will always prefer to keep their processing power on their desk But all in all I think it s inevitable that cloud workstations will play a bigger and bigger role in our work lives 2022-04-17 20:28:54
海外TECH DEV Community Textual: The Definitive Guide - Part 3. https://dev.to/wiseai/textual-the-definitive-guide-part-3-2gl Textual The Definitive Guide Part Hello puppies and kittens In this article we will carry on our series demystifying every damn aspect of Textual In the previous articles we built a series of increasingly complex applications to demonstrate some of the concepts associated with developing TUIs with Textual such as reactive attributes custom widgets event handlers and state management among many others In part we introduced the concept of a GridView view and we didn t explain much about how it works to group and align widgets on a rectangular layout In part we created a useless dummy login form without actions such as redirection from one widget to another and refreshing the terminal We also explained how widget events are handled and how reactive attributes work in Textual but we didn t explain how to make our app handle events fired by another widget such as the submit button that we have created And that s what we are going to explore in this article by creating a fully dynamic register login form Given the fact that textual is highly involved in object oriented programming this article assumes that you are already familiar with this concept If not consider reading one of the most comprehensive tutorials out there about this topic This article also assumes that you know the basics of SQL since it is used to do CRUD operations on the database for the login and register forms Throughout this article two terms message and event were used interchangeably and referred to the same thing This article will shed some light on numerous Textual concepts used when developing custom TUI applications •Creating a Textual widget with custom rendering capabilities and behavior •Using GridView to arrange widgets in terms of columns and rows on the terminal •Rerender widgets using Textual s built in support for clearing and rerendering widgets Spoilers ahead By the end of this article you will learn how to create a fully functional login register screen in Textual as shown in the recording below Table Of Content TOC The Login FormGridViewViews vs LayoutsStoring User CredentialsConnecting The DatabasePutting It All TogetherWrapping UpFuture Work The Login Form Go To TOC In part we left off at this snippet of code that defines our login form logic It is made up of three main components Two custom input widgets for entering username and password positioned at the top of the terminal and a submit button placed at the bottom of the terminal Our submit button didn t do much other than logging the value of the username entered in a log file notice the line self log f username self username Now we need to modify it to actually emulate the login process But first let s tweak a bit the naming of some variables to reflect their functionalities and remove unnecessary variables from rich align import Alignfrom rich box import DOUBLEfrom rich console import RenderableTypefrom rich panel import Panelfrom rich style import Stylefrom rich text import Textfrom textual import eventsfrom textual app import Appfrom textual reactive import Reactivefrom textual widget import Widgetfrom textual widgets import Buttonfrom textual widgets import Button ButtonPressedclass InputText Widget title Reactive RenderableType Reactive content Reactive RenderableType Reactive mouse over Reactive RenderableType Reactive False def init self title str super init title self title title def on enter self gt None self mouse over True def on leave self gt None self mouse over False def on key self event events Key gt None if self mouse over True if event key ctrl h self content self content else self content event key def validate title self value gt None try return value lower except AttributeError TypeError raise AssertionError title attribute should be a string def render self gt RenderableType renderable None if self title lower password renderable join map lambda char self content else renderable Align left Text self content style bold return Panel renderable title self title title align center height style bold white on rgb border style Style color green box DOUBLE class MainApp App username Reactive RenderableType Reactive password Reactive RenderableType Reactive def handle button pressed self message ButtonPressed gt None A message sent by the submit button assert isinstance message sender Button button name message sender name if button name login self username self username field content self password self password field content Query the username and password async def on mount self gt None self login button Button label login name login self username field InputText username self password field InputText password await self view dock self login button edge bottom size await self view dock self username field edge left size await self view dock self password field edge left size if name main MainApp run log textual log A wacky login screen As you can tell our login form looks wacky and a bit off proportions We should organize the widgets in some sort of view And that s what we are going to do in the next section GridView Go To TOC As we saw in part of the series a grid lets us lay out our widgets in columns and rows It is similar to HTML tables for doing layouts We are going to illustrate the various ways you can tweak a grid to arrange and organize your widgets on your terminal In textual a GridView is one of many available views but it has some powerful capabilities for different use cases As mentioned above a GridView provides us a way to align widgets in rows and columns that indicate the relative position of widgets For example widgets with the same column will be stacked above each other Similarly Those in the same row will be adjacent to each other Column and row numbers should be positive integers The width of each column is fixed and defined beforehand Let s take the following snippet of code to demonstrate that from textual views import GridViewclass LoginGrid GridView async def on mount self gt None self grid set align center center self grid set gap Create rows columns areas self grid add column column repeat size self grid add row row repeat size As you can tell we have extended the base class GridView to create our custom LoginGrid grid The code is pretty straightforward it defiens a x grid with characters width and characters height for each column and row respectively notice the repeat argument of add column and add row Now Let s group our widgets within this grid which can be done by calling the self grid add widget function on each widget By doing so our code will result in the following listing from rich align import Alignfrom rich box import DOUBLEfrom rich console import RenderableTypefrom rich panel import Panelfrom rich style import Stylefrom rich text import Textfrom textual import eventsfrom textual app import Appfrom textual reactive import Reactivefrom textual views import GridViewfrom textual widget import Widgetfrom textual widgets import Button ButtonPressedclass InputText Widget title Reactive RenderableType Reactive content Reactive RenderableType Reactive mouse over Reactive RenderableType Reactive False def init self title str super init title self title title def on enter self gt None self mouse over True def on leave self gt None self mouse over False def on key self event events Key gt None if self mouse over True if event key ctrl h self content self content else self content event key def validate title self value gt None try return value lower except AttributeError TypeError raise AssertionError title attribute should be a string def render self gt RenderableType renderable None if self title lower password renderable join map lambda char self content else renderable Align left Text self content style bold return Panel renderable title title align center height style bold white on rgb border style Style color green box DOUBLE class LoginGrid GridView username Reactive RenderableType Reactive password Reactive RenderableType Reactive async def on mount self gt None define input fields self username InputText username self password InputText password self grid set align center center self grid set gap Create rows columns areas self grid add column column repeat size self grid add row row repeat size Place out widgets in to the layout button style bold red on white label style bold white on rgb username label Button label username name username label style label style password label Button label password name password label style label style self grid add widget username label self grid add widget self username self grid add widget password label self grid add widget self password self grid add widget Button label register name register style button style self grid add widget Button label login name login style button style class MainApp App username Reactive RenderableType Reactive password Reactive RenderableType Reactive def handle button pressed self message ButtonPressed gt None A message sent by the submit button assert isinstance message sender Button button name message sender name if button name login self username self login grid username content self password self login grid password content Query username and password async def on mount self gt None self login grid LoginGrid await self view dock self login grid if name main MainApp run log textual log Notice we have added six widgets to our LoginGrid and two reactive attributes to store the username and password entered by the user and make them accessible to the parent application MainApp The add widget function will group the widgets from left to right top to bottom Now our app looks minimalistic and contains only the LoginGrid inside the on mount event handler Running the above snippet of code will result in the following A login screen The comment Query username and password is where we need to add the necessary logic to check whether or not the username and password being entered match a record in a database For that purpose we are going to use SQLite to store credentials since it comes pre installed with python a battery loaded programming language One major caveat here is the login register buttons In textual you can capture click messages from the parent app by overriding the handle button pressed method which is a special handler to read messages sent by a child button This function will help us create the necessary logic simulating the login and register screens concept Views Vs Layouts Go To TOC The other day I was hopping around the source code and I noticed that there are two ways to create a grid Using the GridView or the GridLayout class Apparently a GridView is a layer of abstraction on top of GridLayout with an extra readable grid attribute As a programmer you can use either class to define a grid But if you want to read the grid value associated with a layout you can use GridView However if you re going to use the GridLayout class you can refer to this example I think GridView is more flexible to use It can interact with the parent application unlike GridLayout With that noted let s continue the implementation of our login form In the next section we will use sqlite as a database Storing User Credentials Go To TOC In this section we will learn how to build a little database to store the data submitted by a user Having sqlite installed on our machine we need to create a file called db py and add the following code import sqliteimport contextlibdef create users table gt None create table query CREATE TABLE IF NOT EXISTS users id integer primary key autoincrement username VARCHAR UNIQUE not null password VARCHAR not null connect to the database using contextlib to avoid connections issues with sqlite when forget closing the connection and cursor with contextlib closing sqlite connect users sqlite as connection create a crusor to interract with the database with contextlib closing connection cursor as cursor cursor execute create table query commit the changes connection commit This code snippet creates a table called users that will hold each user s id username and password You can extend this table to store whatever information you want such as phone number gender etc For demonstration purposes let s stick with these data fields In our function notice the use of contextlib which is a helpful built in module to control the context of running code it is usually used for synchronization In our case we used it to allow only one connection to the database to perform CRUD operations and close it afterward From what I have experienced this is the best practice to interact with the database if you are using SQLite Similarly let s build our function similar to an SQL procedure to register a user def register user username str password str gt bool query INSERT INTO users username password VALUES try with contextlib closing sqlite connect users sqlite as connection create a crusor to interract with the database with contextlib closing connection cursor as cursor cursor execute query username password commit the changes connection commit return True except return FalseNotice the use of the symbol which will control the values of the username and the password entered by a user This common practice shields you against the well known TOP OWASP attacks Notice also the use of a try catch block to handle the case of a user registering twice This function returns True if a user has registered successfully and False if the user already exists Bear in mind that in a real world application you never store sensitive information inside a database you store its hashes instead But for demonstration purposes let s bypass this requirement Moving on we need to create a function to check if a user exists in the database as a record def check user username str password str gt str result select query SELECT FROM users WHERE username AND password with contextlib closing sqlite connect users sqlite as connection create a crusor to interract with the database with contextlib closing connection cursor as cursor cursor execute select query username password commit the changes connection commit result cursor fetchone return resultTake a look at the result cursor fetchone statement which will return a record e g a tuple of id username and a password if the user exists None otherwise Up until now we have utility scripts that help us interact with the database with a level of abstraction Now let s go back to our main application Connecting The Database Go To TOC Now let s add the necessary logic for our login form class MainApp App username Reactive RenderableType Reactive password Reactive RenderableType Reactive def handle button pressed self message ButtonPressed gt None A message sent by the submit button assert isinstance message sender Button button name message sender name self username self login grid username content self password self login grid password content if button name login Query username and password to check if exists async def on mount self gt None self login grid LoginGrid await self view dock self login grid Let s begin with the edge cases The first one is where a user enters an empty string in the username field and or the password field To address this case we can add the following if statement if len self username or len self password Now we need to display a nicely formatted message to prompt users to reenter a valid username and or password In Textual there is no Label widget yet but we can use a button for that purpose add new widgetawait self view dock Button label Please enter a valid username and password style bold white on rgb But first we need to clear up the screen to draw this button on the terminal To do so we can use the clear function on the docks and widgets associated with the app self view layout docks clear self view widgets clear After adding these lines of code our main app becomes class MainApp App username Reactive RenderableType Reactive password Reactive RenderableType Reactive async def handle button pressed self message ButtonPressed gt None A message sent by the submit button assert isinstance message sender Button button name message sender name self username self login grid username content self password self login grid password content if button name login clear widgets and docks self view layout docks clear self view widgets clear if len self username or len self password add new widget await self view dock Button label Please enter a valid username and password style bold white on rgb async def on mount self gt None self login grid LoginGrid await self view dock self login grid Notice that our handle button pressed becomes asynchronous because of the await self view dock statements Now we need to display this message for a couple of seconds before redrawing back the widgets to prompt the user to enter a new username and password await asyncio sleep clear widgetsself view layout docks clear self view widgets clear redraw back the gridawait self view dock self login grid If our program didn t hit this case it means the user has entered both username and password Now we need to check whether or not the user exists in our database To do so we can add the following if else statements from db import check userclass MainApp App username Reactive RenderableType Reactive password Reactive RenderableType Reactive async def handle button pressed self message ButtonPressed gt None A message sent by the submit button assert isinstance message sender Button button name message sender name self username self login grid username content self password self login grid password content if button name login clear widgets and docks self view layout docks clear self view widgets clear if len self username or len self password add new widget await self view dock Button label Please enter a valid username and password style bold white on rgb elif check user self username self password clear widgets self view layout docks clear self view widgets clear add new widget await self view dock Button label f Weclome back self username style bold white on rgb else clear widgets self view layout docks clear self view widgets clear add new widget await self view dock Button label Invalid Credentials style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid Alternatively we can implement our register form elif button name register result None self view layout docks clear self view widgets clear if len self username or len self password add new widget await self view dock Button label Please enter a valid username and password style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid else result register user self username self password if result add new widget await self view dock Button label User Registered Successfully style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid elif not result and len self username gt add new widget await self view dock Button label Username Already Exists style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid Putting It All Together Go To TOC The workflow of our program is the following after running python login py The login screen opens up Type in your user and password Click on register to add a new user to the database The application will display the text Please enter a valid username and password if one of the fields is empty User Registered Successfully for a new user Username Already Exists for registered user Click on login to login into the app The application will display the text Weclome back username if the user has registered to the application Invalid Credentials otherwise The complete listing for our application looks like the following import asynciofrom rich align import Alignfrom rich box import DOUBLEfrom rich console import RenderableTypefrom rich panel import Panelfrom rich style import Stylefrom rich text import Textfrom textual import eventsfrom textual app import Appfrom textual reactive import Reactivefrom textual views import GridViewfrom textual widget import Widgetfrom textual widgets import Button ButtonPressedfrom db import check user create users table register userclass InputText Widget title Reactive RenderableType Reactive content Reactive RenderableType Reactive mouse over Reactive RenderableType Reactive False def init self title str super init title self title title def on enter self gt None self mouse over True def on leave self gt None self mouse over False def on key self event events Key gt None if self mouse over True if event key ctrl h self content self content else self content event key def validate title self value gt None try return value lower except AttributeError TypeError raise AssertionError title attribute should be a string def render self gt RenderableType renderable None if self title lower password renderable join map lambda char self content else renderable Align left Text self content style bold return Panel renderable title title align center height style bold white on rgb border style Style color green box DOUBLE class LoginGrid GridView username Reactive RenderableType Reactive password Reactive RenderableType Reactive async def on mount self gt None define input fields self username InputText username self password InputText password self grid set align center center self grid set gap Create rows columns areas self grid add column column repeat size self grid add row row repeat size Place out widgets in to the layout button style bold red on white label style bold white on rgb username label Button label username name username label style label style password label Button label password name password label style label style self grid add widget username label self grid add widget self username self grid add widget password label self grid add widget self password self grid add widget Button label register name register style button style self grid add widget Button label login name login style button style class MainApp App username Reactive RenderableType Reactive password Reactive RenderableType Reactive async def handle button pressed self message ButtonPressed gt None A message sent by the submit button assert isinstance message sender Button button name message sender name self username self login grid username content self password self login grid password content if button name login clear widgets self view layout docks clear self view widgets clear if len self username or len self password add new widget await self view dock Button label Please enter a valid username and password style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid elif check user self username self password clear widgets self view layout docks clear self view widgets clear add new widget await self view dock Button label f Weclome back self username style bold white on rgb else clear widgets self view layout docks clear self view widgets clear add new widget await self view dock Button label Invalid Credentials style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid elif button name register result None self view layout docks clear self view widgets clear if len self username or len self password add new widget await self view dock Button label Please enter a valid username and password style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid else result register user self username self password if result add new widget await self view dock Button label User Registered Successfully style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid elif not result and len self username gt add new widget await self view dock Button label Username Already Exists style bold white on rgb await asyncio sleep clear widgets self view layout docks clear self view widgets clear redraw back the grid await self view dock self login grid async def on mount self gt None create users table self login grid LoginGrid await self view dock self login grid if name main MainApp run log textual log Wrapping up Go To TOC A view is one of the essential textual components that instructs the child components or widgets to render in the available space on the terminal For example as we discussed a Grid View arranges child components by a combination of rows and columns And this constitutes the Login app walkthrough The resulting application can actually register a new user and login into the application As always this article is a gift to you from a higher dimensional entity You can share it with whomever you like or use it in any way that would be beneficial to your personal and professional development By supporting this blog you keep me motivated to publish high quality content related to python in general and textual specifically Thank you in advance for your ultimate support You are free to use the code in this article which is licensed under the MIT license as a starting point for various needs Don t forget to look at the readme file and use your imagination to make more complex apps meaningful to your use case Future Work Go To TOC Now that you have created a fully functional login register screen in textual which worked as intended you can make a chat room that uses these forms Keep in mind that this task is somewhat a medium level It is objectively not easy to implement such applications But Textual provides us with a great toolkit on the user interface side of things facilitating the ease of creating fully featured blazingly fast rendered widgets If you get stuck it is not that big of a deal because nothing works immediately as you implement it Sometimes you will go through trial and error which is so common in the fascinating programming world Try to focus on one task at a time and you will be surprised by your capabilities There is so much to explore about the fantastic world of Textal and UI designers that are knowledgeable in this domain are few and highly valued Remember that it will certainly pay off to dig into such topics about TUI at some point Happy Coding folks see you in the next one 2022-04-17 20:24:26
海外TECH DEV Community Practical Javascript array methods https://dev.to/drsimplegraffiti/practical-javascript-array-methods-4nnk Practical Javascript array methodsThis is a step by step tutorial with examples showing how to use JavaScript array methods Filter array method const laptop model Macbook Pro price model Macbook Air price model Hp lite price model Dell price const filteredLaptop laptop filter laptop gt return laptop price gt console log filteredLaptop Explanation We are creating a new array called filteredLaptop We are filtering through the array laptop and checking if the laptop price is greater than If so we are adding the laptop to the filteredLaptop array We then return filteredLaptop Map methodconst laptop model Macbook Pro price model Macbook Air price model Hp lite price model Dell price const getLaptopModel laptop map item gt return item model console log getLaptopModel Explanation We create an array with objects inside We create an arrow function to map the array and return the property of model We log the result forEach Methodconst countries Nigeria Ghana Haiti Jamaica Kenya Tanzania Uganda Zambia Zimbabwe Ex countries forEach country index gt console log I am from country and my index is index foreach does not return anything o Result Ex countries forEach country index gt if country Zambia console log I am from country and my index is index Result Ex countries forEach country index gt if country length gt console log country character is greater than Result Ex countries forEach country index gt let containedLetters han if country includes containedLetters console log country contains the letter containedLetters Result Ex countries forEach country index gt let containedLetters Nig if country startsWith containedLetters console log country Starts with the letter containedLetters Result Ex const countries name Nigeria landMass name Ghana landMass name Haiti landMass name Jamaica landMass name Kenya landMass name Tanzania landMass name Uganda landMass name Zambia landMass name Zimbabwe landMass countries forEach country index gt console log country name Result Image description https dev to uploads s amazonaws com uploads articles yydtxofgvkrfnt PNG Includes Array methodconst items const includesTwo items includes console log includesTwo Result Explanation In Javascript the includes method is a method from the Array prototype This method takes an argument and returns true or false depending on whether the argument is in the Array or not Map array methodconst laptop model Macbook Pro price model Macbook Air price model Hp lite price model Dell price const getLaptopModel laptop map item gt return item model console log getLaptopModel Result Find Array method Find array methodconst laptop model Macbook Pro price model Macbook Air price model Hp lite price model Dell price const findLaptop laptop find laptop gt return laptop model Macbook Pro console log findLaptop Result Every array methodconst food name pizza price name burger price name pasta price name rice price name chicken price const checkIfFoodHasPriceLessThan food every item gt return item price lt console log checkIfFoodHasPriceLessThan Result Explanation food is an array of objects food every is a method on the array Every method iterates over each item in the array and calls the function passed to it The function is passed the item and the index of that item If the function returns true the every method returns true otherwise every returns false The function checks if the price of each item is less than checkIfFoodHasPriceLessThan is set to true if every item has a price less than otherwise it returns false Some array methodconst food name pizza price name burger price name pasta price name rice price name chicken price const checkIfFoodHasPriceLessThan food some item gt return item price lt console log checkIfFoodHasPriceLessThan Result Explanation The code checks if any item in the food array has a price less than The some method checks if any of the elements in the food array returns true The some method returns true if any of the elements in the food array return true The some method returns false if all of the elements in the food array return false Reduce array methodconst food name pizza price name burger price name pasta price name rice price name chicken price const total food reduce currentTotal item gt return item price currentTotal console log total Result Explanation We are using the reduce function to add up the total price of all the food items in the array The first argument of the reduce function is the currentTotal The second argument of the reduce function is the item We are using the item price to add the value of item price to the currentTotal The currentTotal is set to because we want to start with a base value of The value of currentTotal is returned at the end of the reduce function The value of the total is logged to the console ConclusionI hope you found this information useful Other array methods along with examples of how you will use them should be left in the comments section 2022-04-17 20:07:39
海外TECH DEV Community GTM Tracking Service in Angular https://dev.to/ayyash/gtm-tracking-service-in-angular-37ja GTM Tracking Service in AngularLaunching a rocket is so easy for those who ve done it Same goes with Google Tag Manager It really is like building a rocket but once you ve done it the first time you rarely have to deal with it again BasicsThis article is not about the use of Google Tag Manager nor how to install tags It is an attempt to create an Angular service that takes away the pain of maintaining it The following things are basics to keep in mind so that we remain sane because the docs of GTM will make you insane It s GTM that s how we will refer to itGA is Google Analytics version We will never use gtag js libraryWe will install on Web onlyThe docs are too overwhelming most of my work is around these documents Trigger TypesAutomatically collected eventsGA recommended events parametersI might have used gr and garage prefix interchangeably forgive me Setup Google Tag ManagerStarting with tag manager website create an account and an initial container of type web It is recommended to place the scripts as high in the head tag as possible so I am not going to attempt to insert the script via Angular though I saw some online libraries do that We can also create our script on PLATFORM INITIALIZER token Read about Angular initialization tokens But I see no added value lt index html gt lt head gt lt Google Tag Manager gt lt script gt function w d s l i w l w l w l push gtm start new Date getTime event gtm js var f d getElementsByTagName s j d createElement s dl l dataLayer amp l l j async true j src i dl f parentNode insertBefore j f window document script dataLayer GTM XXXXXX lt script gt lt End Google Tag Manager gt lt head gt lt body gt lt somewhere in body gt lt Google Tag Manager noscript gt lt noscript gt lt iframe src height width style display none visibility hidden gt lt iframe gt lt noscript gt lt End Google Tag Manager noscript gt lt body gt All what this does is create a global dataLayer array push the first gtm start event to it then inject the script Okay now what The end in sightGTM is a just a consolidation layer that gathers information from the website and sends it forward to wherever we hook it up to The most natural use of GTM is of course Google Analytics Hooking up GTM to GA is straight forward the real challenge though is understanding yet one more version of Analytics Universal has retired GA is in the house The GA tracking code is buried under Admin gt Property gt Data Streams gt Web Or do as I do when I lose it type tracking id in the search box The default Enhanced measurement is set with page views by default remember this Starting from list of trigger types on GTM the one we are looking for is Page view triggers gt Initialization to configure GA In GTM we ll create a tag for Analytics configuration which is triggered on initialization What we are looking for is on history change send a page view event to GA According to Automatically collected events page view is collected on history change automatically EventTriggerParameterspage view web each time the page loads or the browser history state is changed by the active site Collected by default via enhanced measurement page location page URL page referrer previous page URL engagement time msec In addition to the default language page location page referrer page title screen resolutionSo we should be set To test in GTM we use Preview feature and in GA we use Realtime reports Running my app clicking around to different routes I can see page view events piling up A side node to remember allowing Enhanced Measurements in GA for example scroll events or creating a tag in GTM with a trigger type scroll have the same effect GA will log scroll events both ways The main advantage of doing it in GTM fine tuning the trigger conditions is much easier If Enhanced measurements was not set we would have had to create a separate tag in GTM with trigger History change Navigation and history changeThree scenarios I want to test before I move on Navigation with replaceUrl skipLocationChange and Location go replaceUrl logs a proper page view No extra work herelocation go logs a page view event with wrong page title This is expected because this changes the URL without navigating away from component thus page title sticks around On the positive side this trick is helpful only on same route so no work needed here skipLocationChange does not log any eventsTo catch the undetected event one way involves work on GTM with no interference of the developer and the other is custom events for manual logging Page view manual loggingEventually I need to do the following in my codelocationChange this router navigate page skipLocationChange true log a page view read path elsewhere TellGTMToLogEvent garage page view In GTM will create a trigger could be anything And then a tag for that trigger that pushes page view into GA It took me a while to learn that Note anything that can be built in GTM without the support of an Angular developer is out of scope of this article But there are many many options available in GTM Click events specifically are quite rich My personal advice when dealing with GTM distinguish everything by a suffix or a prefix just to get a sense of what s happening if you do want to reach without losing your mind I will rely on the term garage or gr to distinguish my custom events New Trigger Page View Trigger add suffix Trigger Type Custom EventEvent Name garage trigger this is our data layer event New Tag Page View Tag add suffix Tag Type Google Analytics GA EventEvent name page view this is the event going to GA In our Angular App let me create a static service It is static until we need to change it GTM service declare the dataLayer to use in typescriptdeclare let dataLayer any export class GtmTracking first method register a garage trigger event public static RegisterView void dataLayer push event garage trigger In my component that has next linknextPage increase page and get all other params const page this paramState currentItem page const isPublic this paramState currentItem isPublic navigate with skipLocationChange this router navigate page public isPublic skipLocationChange true register view GtmTracking RegisterView In GTM the garage trigger should register and in GA I should see the page view I am assuming all data will be sent with it Running locally clicking next and the page view registers But it registers information from the current URL I want it to register a view for a different URL projects page ispublic falseIn order to pass the extra parameters page ispublic false we first create a GTM variable for that purpose New Variable Garage page location Variable add suffix Variable Type Data Layer variableVariable Name garage page location In Page View Tag we will add the parameter to be sent to GA page location and set it to the following Page Path Garage page location Variable Now in our Angular app we just need to add garage page location variable to the dataLayer in componentnextPage event MouseEvent register view event pass the extra params GtmTracking RegisterView page page public isPublic In GTM service public static RegisterView page location string void add garage page location dataLayer push event garage trigger garage page location page location We re supposed to see a page view event with product page public false logged in GA Here it is Realtime report That was just a quick run with GTM To organize it better let s look at the other recommended parameters The data modelLooking into recommended events list and reference of all parameters of recommended events I can see a certain pattern a data model that looks like this most popular parameters of recommended eventsinterface IGTMEvent event string item list name string items item id string item name string price number currency string index number method string content type string item id string occured once in Share event value number currency string search term string There are few others What we want to accomplish is adhering to one rule Angular code should be agnostic to the tracking data model Not only you have other interesting third party trackers but Analytics itself changes So the GTM service we hope to accomplish has its own internal mapper that maps our App models into GTM models Which later translates them into GA models or any other third party Here are some examples I want to keep in mind as I build my service In a login script I expect to be able to do this on login success GtmTracking Log event garage login method Google source Login page On searchGtmTracking Log event garage search source Products list searchTerm searchTerm On search results GtmTracking Log event garage view item list source Product list items results On clicking to view a search result GtmTracking Log event garage view item source Product list position item index item item And so on The idea is to send everything to GTM data layer and let the GTM expert jiggle with it to create the tags of choice From my experience the source of the engagement where on site it occurred is very handy My data model is looking like this export interface IGtmTrack event EnumGtmEvent to control events site wise source EnumGtmSource to control where the event is coming from Every call to register an event has to identify itself Then we run a mapper to send the different parts to dataLayer The GTM service is now like this GTM servicedeclare let dataLayer any Declare google tagexport enum EnumGtmSource any source in web is added here left side is internal right side is GTM ProductsList products list ProductsRelatedList products related ProjectsList projects list etc export enum EnumGtmEvent any event are added here prefixed with garage to clear head left side is internal right side is GTM Login garage login PageView garage page view etc export interface IGtmTrack event EnumGtmEvent source EnumGtmSource export class GtmTracking public static RegisterEvent track IGtmTrack extra any void const data event track event depending on event map something like this data of some attribute GtmTracking MapExtra extra push data dataLayer push data the mappers that take an existing model and turn it into GTM model for example products private static MapProducts products IProduct map products to items return items products map GtmTracking MapProduct private static MapProduct product IProduct index number limitation on GTM the property names must be identified by GA for easiest operations return item name product name item id product id price product price currency AUD index then all other mappers for employee and project search login etc private static MapSearch keyword string return search term keyword private static MapLogin method string this better turn into Enum to tame it return method The array of items cannot be broken down in GTM we can only pass it as is If your app depends on any of GA recommended parameters you need to use the same parameter names inside items array That s a GTM limitation The extras passed could be of project type an employee or a string or array of strings etc That makes RegisterEvent loaded with if else conditions the simpler way is to provide public mappers for all possible models and map before we pass to one RegisterEvent We can also place our parameters inside one prefixed property this will free us from prefixing all properties and worrying about clashing with automatic dataLayer properties The GTM service now looks like this public static RegisterEvent track IGtmTrack extra any void separate the event then pass everything else inside gr track const data event track event gr track source track source extra dataLayer push data also turn mappers into public methodsIn GTM the gr track can be dissected and multiple variables created with value set to gr track something For examples Garage track items variable gr track itemsIn Triggers we shall create a trigger for every event garage click or garage login etc Finally the tags Tracking view item list of a list of products Garage track items variable is passed as GA items and the Garage track source variable can be passed as item list name In our code where the product list is viewed GtmTracking RegisterEvent event EnumGtmEvent List new event garage view list source EnumGtmSource ProductsList product list GtmTracking MapProducts products matches Page viewNow let s rewrite the RegisterView mapping the page location with a proper event name garage page view In the service create a new mapperpublic static MapPath path string any return page location path And in component on next click nextPage register event GtmTracking RegisterEvent event EnumGtmEvent PageView GtmTracking MapPath page page public isPublic View item in a listLet s make another one for the recommended view item with event source We want to track a click from search results to view a specific item In the product list template we add a click handler product list template lt ul gt lt li ngFor let item of products click trackThis item gt item name item price lt li gt lt ul gt In componenttrackThis item IProduct GtmTracking RegisterEvent event EnumGtmEvent Click general click source EnumGtmSource ProductsList coming from product list GtmTracking MapProducts item send items array Since GA parameters all suggest item to be in an array even if it were one item then we wrap it in an array But the index can be the location in the list So let s adapt the mapper to accept a second argument for position of element public static MapProducts products IProduct position number const items products map GtmTracking MapProduct if position is passed change the element index this happens only when there is a single item if position items index position return items And in template let s pass the index lt ul class rowlist gt lt li ngFor let item of products let i index click trackThis item i gt item name item price lt li gt lt ul gt And in component trackThis item IProduct position number GtmTracking RegisterEvent event EnumGtmEvent Click source EnumGtmSource ProductsList GtmTracking MapProducts item position pass position When clicking this is what is set in dataLayerThe GTM tag could be set like this In GA now we can fine tune our reports to know where the most clicks come from the search results the related products or may be from a campaign on the homepage Have a look at the final service on StackBlitz Putting it to the testThese are recommended events but we can enrich our GA reports with extra custom dimensions we just need to keep in mind that GA limits custom events to undeletable Here are some example reports a GA expert might build and let s see if our data model holds up GA report of reveal details clicks in multiple locationsThe GA report needs a custom event gr reveal and a source parameter already set up to create a report like this sourceproduct searchproduct detailshomepage campaignTotalsEvent nameEvent countEvent countEvent countEvent CountTotalsxxxxxxxxxxxxxxxxgr revealxxxxxxxxxxxxxxxxSource can be item list name or a new GA dimention None of the business of the developer Our date model then looks like this event gr reveal gr track source homepage campaign items item name Optional send item name GA report of Upload eventsThe new event to introduce is gr upload The source could be the location on site in addition to action click or drag and drop sourceproduct detailshomepage navigationTotalsactionclickdragclickEvent nameEvent countEvent countEvent countEvent CountTotalsxxxxxxxxxxxxxxxxgr uploadxxxxxxxxxxxxxxxxOur data model then looks like this event gr upload gr track source product details we need a mapper for this action drag The data model holds but we need an extra action mapper control itexport enum EnumGtmAction Click click Drag drag export class GtmTracking map it public static MapAction action EnumGtmAction return action in component use itGtmTracking RegisterEvent event EnumGtmEvent Upload source EnumGtmSource ProductsDetail GtmTracking MapAction EnumGtmAction Drag Adding valueOne constant parameter your GA expert might insist on is value especially in ecommerce websites The value is not a ready property but rather a calculation of items values So every MapList method will have its own value calculation and again this is an extra Adjust the GTM service mapperpublic static MapProducts products IProduct position number calculate value const value items reduce acc item gt acc parseFloat item price return items and value return items value currency AUD currency is required in GA So far so good NextWhat happens when dataLayer bloats Let s investigate it next week In addition to creating a directive for general clicks that need less details and digging into third party trackers like sentry io to see what else we need for our service Thank you for reading this far of yet another long post have you spotted any crawling bugs let me know ResourcseGTM Trigger typesGA Recommended eventsGA Events parametersStackBlitz 2022-04-17 20:03:51
Apple AppleInsider - Frontpage News Pad & Quill NATO band review: High quality leather and a unique design https://appleinsider.com/articles/22/04/17/pad-quill-nato-band-review-high-quality-leather-and-a-unique-design?utm_medium=rss Pad amp Quill NATO band review High quality leather and a unique designPad Quill first new Apple Watch band in years pays homage to the s British NATO band This all leather band has a unique design unlike any other we ve tested We ve been fans of Pad Quill s Apple Watch bands for years as the company uses high quality materials such as full grain leather and marine grade stitching We last reviewed Pad Quill s cuff style Apple Watch band in which also was unusual in its design The new NATO band has similar elements but isn t as heavy in its appearance Read more 2022-04-17 20:41:01
ニュース BBC News - Home Ukraine round-up: Ukraine defies Mariupol deadline as Kharkiv shelled https://www.bbc.co.uk/news/world-europe-61135894?at_medium=RSS&at_campaign=KARANGA kharkiv 2022-04-17 20:15:28
ビジネス ダイヤモンド・オンライン - 新着記事 【スクープ】東レの品質不正調査報告書に重大欠陥、内部資料で判明した「消された言葉」 - 東レの背信 https://diamond.jp/articles/-/301641 日覺昭廣 2022-04-18 05:25:00
ビジネス ダイヤモンド・オンライン - 新着記事 商社・鉄鋼の重鎮が集う「鉄鋼マスターズゴルフ」の秘密、知られざる社交場で築く結束力 - 最強のゴルフ ビジネス・人脈に効く! https://diamond.jp/articles/-/301267 総合商社 2022-04-18 05:20:00
ビジネス ダイヤモンド・オンライン - 新着記事 ソニー「次期社長レース」が本格化、大本命の地位を脅かす“新顔”幹部が急浮上 - 人事コンフィデンシャル https://diamond.jp/articles/-/301050 吉田憲一郎 2022-04-18 05:15:00
ビジネス ダイヤモンド・オンライン - 新着記事 リコー「追い出し部屋炎上」で進化した狡猾リストラ、内部資料ににじむジョブ型人事の問題点 - ステルスリストラ 気付けばあなたも https://diamond.jp/articles/-/301282 リコー「追い出し部屋炎上」で進化した狡猾リストラ、内部資料ににじむジョブ型人事の問題点ステルスリストラ気付けばあなたもかつて「追い出し部屋」問題で厳しい非難を浴びたリコー。 2022-04-18 05:10:00
ビジネス 電通報 | 広告業界動向とマーケティングのコラム・ニュース テレビとデジタルを統合して広告効果を可視化する https://dentsu-ho.com/articles/8156 広告効果 2022-04-18 06:00:00
ビジネス 電通報 | 広告業界動向とマーケティングのコラム・ニュース パーソルキャリア村澤執行役員に聞く、変革の動かし方(電通BDS渕) https://dentsu-ho.com/articles/8152 執行役員 2022-04-18 06:00:00
北海道 北海道新聞 教皇、ウクライナの平和祈る 戦時下の復活祭で https://www.hokkaido-np.co.jp/article/670745/ 教皇 2022-04-18 05:11:00
北海道 北海道新聞 <社説>北電泊停止10年 原発担える組織なのか https://www.hokkaido-np.co.jp/article/670713/ 北海道電力 2022-04-18 05:05:00
ビジネス 東洋経済オンライン 年金改正!遅くなるほど「もらう金額」が増える 70歳受給なら42%増、75歳受給だと84%増額 | 最新の週刊東洋経済 | 東洋経済オンライン https://toyokeizai.net/articles/-/582235?utm_source=rss&utm_medium=http&utm_campaign=link_back 東洋経済オンライン 2022-04-18 05:40:00
ビジネス 東洋経済オンライン パナソニック「幸せの、チカラに。」へ感じる疑問 松下幸之助の「言霊力」こそ経営トップに必要だ | IT・電機・半導体・部品 | 東洋経済オンライン https://toyokeizai.net/articles/-/581734?utm_source=rss&utm_medium=http&utm_campaign=link_back 持株会社 2022-04-18 05:20:00
海外TECH reddit DRX vs OpTic Gaming / Valorant Champions Tour 2022: Stage 1 Masters - Reykjavík - Playoffs / Post-Match Thread https://www.reddit.com/r/ValorantCompetitive/comments/u5vitr/drx_vs_optic_gaming_valorant_champions_tour_2022/ DRX vs OpTic Gaming Valorant Champions Tour Stage Masters Reykjavík Playoffs Post Match ThreadDRX OpTic Gaming rib gg vlr gg Ascent Icebox Split DRX rib gg Liquipedia Twitter Twitch VLR YouTube OpTic Gaming rib gg Liquipedia Twitter Twitch VLR YouTube For spoiler free VALORANT VoDs check out Juked Join the subreddit Discord server by clicking the link in the sidebar Map Ascent Team ATK DEF Total DRX DEF ATK OpTic Gaming DRX ACS K D A MaKo Astra Zest Sova BuZz Chamber Rb Jett stax Skye OpTic Gaming ACS K D A yay Jett Marved Omen FNS Killjoy crashies Sova Victor KAY O Detailed Ascent Statistics Map Icebox Team DEF ATK Total DRX ATK DEF OpTic Gaming DRX ACS K D A Zest Sova stax KAY O BuZz Jett MaKo Viper Rb Sage OpTic Gaming ACS K D A Victor KAY O Marved Viper crashies Sova yay Chamber FNS Sage Detailed Icebox Statistics Map Split Team ATK DEF OT OT Total DRX DEF DEF ATK OpTic Gaming DEF DRX ACS K D A MaKo Viper Zest Sage Rb Jett BuZz Astra stax Skye OpTic Gaming ACS K D A yay Chamber crashies KAY O Marved Astra Victor Neon FNS Breach Detailed Split Statistics submitted by u rib gg bot to r ValorantCompetitive link comments 2022-04-17 20:30:55

コメント

このブログの人気の投稿

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

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

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