AWS |
AWS |
Get Started with Fleet Hub for AWS IoT Device MGMT: Monitor & Manage Pt 2 | Amazon Web Services |
https://www.youtube.com/watch?v=UXsGzp7MC_c
|
Get Started with Fleet Hub for AWS IoT Device MGMT Monitor amp Manage Pt Amazon Web ServicesFleet Hub for AWS IoT Device Management enables customers to easily create a fully managed web application to view and interact with their device fleets to monitor fleet and device health respond to alarms take remote actions and reduce time for troubleshooting In this video you will learn how to use Fleet Hub to examine device disconnections drill down on your fleet perform an over the air firmware update and create an alarm to detect misbehavior See developer documentation See the first part of this demonstration here Learn more about Fleet Hub for AWS IoT Device Management at Subscribe More AWS videos More AWS events videos ABOUT AWSAmazon Web Services AWS is the world s most comprehensive and broadly adopted cloud platform offering over fully featured services from data centers globally Millions of customers ーincluding the fastest growing startups largest enterprises and leading government agencies ーare using AWS to lower costs become more agile and innovate faster AWS AmazonWebServices CloudComputing AWSDemos |
2021-07-01 21:50:56 |
AWS |
AWS |
Get Started with Fleet Hub for AWS IoT Device MGMT - Configuration Pt 1 | Amazon Web Services |
https://www.youtube.com/watch?v=WIUZ-aBSRzs
|
Get Started with Fleet Hub for AWS IoT Device MGMT Configuration Pt Amazon Web ServicesFleet Hub for AWS IoT Device Management enables customers to easily create a fully managed web application to view and interact with their device fleets to monitor fleet and device health respond to alarms take remote actions and reduce time for troubleshooting In this video you will learn how to configure a Fleet Hub web application See developer documentation See the second part of this demonstration here Learn more about Fleet Hub for AWS IoT Device Management at Subscribe More AWS videos More AWS events videos ABOUT AWSAmazon Web Services AWS is the world s most comprehensive and broadly adopted cloud platform offering over fully featured services from data centers globally Millions of customers ーincluding the fastest growing startups largest enterprises and leading government agencies ーare using AWS to lower costs become more agile and innovate faster AWS AmazonWebServices CloudComputing AWSDemos IoT |
2021-07-01 21:50:18 |
Program |
[全てのタグ]の新着質問一覧|teratail(テラテイル) |
Pythonでボタンクリック時に処理がうまく行われない |
https://teratail.com/questions/347199?rss=all
|
Pythonでボタンクリック時に処理がうまく行われない前提・実現したいことパイソンでゲーム麻雀を作ろうとしています。 |
2021-07-02 06:13:34 |
Ruby |
Railsタグが付けられた新着投稿 - Qiita |
【Rails】ページネーション機能の実装(kaminari) |
https://qiita.com/oak1331/items/ddce155a8992937fd5b2
|
まずはkaminariにbootstrapを適用させて、デザインを変更します。 |
2021-07-02 06:35:51 |
海外TECH |
Ars Technica |
How a 17th-century illustration is helping archaeologists find Viking ships |
https://arstechnica.com/?p=1772472
|
kalvestene |
2021-07-01 21:11:25 |
海外TECH |
DEV Community |
How ad blockers can be used for browser fingerprinting |
https://dev.to/savannahjs/how-ad-blockers-can-be-used-for-browser-fingerprinting-5808
|
How ad blockers can be used for browser fingerprintingIn this article we show how signals generated by the use of an ad blocker can improve browser fingerprinting accuracy This novel browser fingerprinting method while oft discussed as a theoretical source of entropy has only just been added to FingerprintJS as of April and has never been fully described until now Ad blockers are an incredibly pervasive and useful piece of technology Around of Americans use an ad blocker today If you are reading this article on ad blocker technology you almost undoubtedly have one installed While ad blockers make the internet a more pleasant experience for many people whether or not they protect your privacy in any meaningful way is up for debate As ad blockers have access to the content of all pages that a browser loads and can reliably perform cross site tracking they are able to collect more information on a user s browsing activity than most marketing trackers they block Perhaps more insidiously the fact that a user is attempting to avoid being tracked online with an ad blocker can be used to identify them Consider the example of tracking an individual in the woods by their shoe print You may find success if you know their shoe s size and ridge pattern but it may be just as easy if you know that person habitually covers their tracks by raking a branch over their path Whether you are looking for a shoe print or the absence of one a signature pattern can be found Ad blockers leave a trace that can be harnessed by the websites you visit to identify you By testing whether certain page elements are blocked a site can find discrepancies in the filters used by your specific ad blocker s These discrepancies provide a source of entropy that when combined with other unique signals can identify a specific user over multiple visits This combining of browser signals to create a unique identifier is known as browser fingerprinting While browser fingerprinting is a proven out method of visitor identification you can read more about how it works in our beginner s guide how ad blockers can be used for fingerprinting is rarely discussed As the developers of the largest open source browser fingerprinting library we have only started including ad blocker signals as of April so this work is hot off the press from our team We hope shining a light on this cutting edge technique will be useful to the open source community at large What is an ad blockerAn ad blocker is a browser extension that prevents browsers from loading video and displaying advertisements pop ups tracking pixels and other third party scripts Ad blockers not only improve the online experience by hiding ads but also protect browsing activity from being tracked by third party scripts All major online ad platforms like Google and Facebook as well as other marketing and product testing tools like Crazy Egg and Hotjar use tracking scripts to monitor and monetize user activity online Privacy conscious users often turn to ad blockers to stop their browsing history from being shared with these platforms However ad blockers have access to the content of all pages that a browser loads They have a lot more information about browsing activity than trackers because trackers can t do reliable cross site tracking Therefore it is possible for ad blockers to violate user privacy Safari is an exception which we ll discuss below How ad blockers workIn this section we ll go fairly deep into the internals of ad blockers as it will help us build a better understanding of how ad blocking mechanics make it possible to reliably identify visitors Ad blockers typically run as extensions built on top of browser APIs Google Chrome and other Chromium based browsers Extensions are JavaScript applications that run in a sandboxed environment with additional browser APIs available only to browser extensions There are two ways ad blockers can block content The first one is element hiding and the second one is resource blocking Element hiding is done either by injecting CSS code or by using DOM APIs such as querySelectorAll or removeChild Resource blocking employs a different technique Instead of rendering elements on a page and then hiding them extensions block the resources on a browser networking level To plug into browser networking ad blockers will intercept requests as they happen or use declarative blocking rules defined beforehand Request interception utilizes webRequest API which is the most privacy violating technique It works by reading every request that a browser is making and deciding on the fly if it represents an ad and should be blocked The declarative approach utilizes declarativeNetRequest API to preemptively instruct browsers what needs to be blocked This happens without reading actual requests thus providing more privacy Firefox This API is almost the same as in Google Chrome The only notable difference is the lack of declarativeNetRequest API Safari Unlike Chrome or Firefox Safari extensions are native applications Safari provides a declarative API for ad blockers Ad blockers create static lists of things that describe what to block and pass them to Safari A list will contain rules that tell what network requests HTML elements or cookies to block A list content may also depend on user settings Ad blockers have no way of accessing browsing history in Safari You can watch a video by Apple with a detailed explanation Android browsers are a special case in that they generally lack extension APIs However Android Play Market allows you to install ad blocking apps that will work in all browsers These apps will create a VPN on the system level and pass all the device traffic through it The VPN connection will act as an ad blocker by adding JavaScript code or CSS styles to pages that will hide unwanted content or by blocking HTTP requests entirely Ad blocking filtersAd blockers prevent ads from being shown by looking for specific elements to block within the site s contents To identify these advertising elements ad blockers use collections of rules called filters to decide what to block Usually these filters are maintained by the open source community Like any other project filters are created by different people for different needs For example French websites often use local ad systems that are not known worldwide and are not blocked by general ad filters so developers in France will want to create a filter to block ads on French websites Some filter maintainers can have privacy concerns and thus create filters that block trackers A filter is usually a text file that follows a common standard called AdBlock Plus syntax Each line of text contains a blocking rule which tells an ad blocker which URLs or CSS selectors must be blocked Each blocking rule can have additional parameters such as the domain name or the resource type A blocking rule example is shown below The most common sets of filters used by AdBlock AdGuard and other ad blockers include EasyList includes EasyList EasyPrivacy EasyList Cookie List EasyList Germany and many others AdGuard includes a base filter a mobile ads filter a tracking protection filter a social media filter and many others Fanboy includes Enhanced Trackers List Anti Facebook Filters Annoyance List and several others How to get entropy from ad blockersOur goal is to get as much information from ad blockers as possible to generate a fingerprint A JS script running on a page can t tell directly if the browser has an ad blocker and if it does what is blocked by it Instead the script can try adding something on the page to see if it gets blocked The addition can be an HTML element that matches a blocked CSS selector or an external resource such as a script or an image We recommend using CSS selectors over resources to detect ad blockers as resource detection has two significant downsides Firstly detecting whether a resource is blocked requires trying to download the resource by making an HTTPS request and watching its state This process slows down the web page by occupying the network bandwidth and CPU Secondly the HTTPS requests will appear in the browser developer tools which may look suspicious to an observant site visitor For these reasons we will focus on using CSS selectors to collect data in this article We will now run through how to generate two related data sources using ad blocker signals the list of blocked CSS selectors and the list of filters Finding the list of filters will result in a significantly more stable fingerprint but requires additional work to identify unique CSS selectors to distinguish each filter from one another Data source detecting the list of blocked CSS selectorsThe process of detecting whether a CSS selector is blocked consists of the following steps Parse the selector i e get the tag name CSS classes id and attributes from it Create an empty HTML element that matches that selector and insert the element into the document Wait for the element to be hidden by an ad blocker if one is installed Check whether it s hidden One way to do it is checking the element s offsetParent property it s null when the element is hidden If you do the above steps for each selector you ll face a performance issue because there will be a lot of selectors to check To avoid slowing down your web page you should create all the HTML elements first and then check them to determine if they are hidden This approach can generate false positives when there are a lot of HTML elements added to the page It happens because some CSS selectors apply only when an element has certain siblings Such selectors contain a general sibling combinator or an adjacent sibling combinator They can lead to false element hiding and therefore false blocked selector detection results This problem can be mitigated by inserting every element into an individual lt div gt container so that each element has no siblings This solution may still fail occasionally but it reduces the false positives significantly Here is an example code that checks which selectors are blocked async function getBlockedSelectors allSelectors A storage for the test elements const elements new Array allSelectors length const blockedSelectors try First create all elements that can be blocked for let i i lt allSelectors length i const container document createElement div const element selectorToElement allSelectors i elements i element container appendChild element document body appendChild container Then wait for the ad blocker to hide the element await new Promise resolve gt setTimeout resolve Then check which of the elements are blocked for let i i lt allSelectors length i if elements i offsetParent blockedSelectors push allSelectors i finally Then remove the elements for const element of elements if element element parentNode remove return blockedSelectors Creates a DOM element that matches the given selectorfunction selectorToElement selector See the implementation at getBlockedSelectors advertisement img alt Promo then blockedSelectors gt console log blockedSelectors To determine which CSS selectors to check you can download some of the most popular filters and extract the CSS selectors that are blocked on all websites The rules for such selectors start with Your chosen selectors should contain no lt embed gt no fixed positioning no pseudo classes and no combinators The offsetParent check will not work with either lt embed gt or fixed positioning Selectors with combinators require a sophisticated script for building test HTML elements and since there are only a few selectors with combinators it isn t worth writing such a script Finally you should test only unique selectors across all the filters to avoid duplicate work You can see a script that we use to parse the unique selectors from the filters here You can see some of the selectors blocked by your browser in the interactive demo on our blog This is just an image check out the full interactive demo on our site Data source getting the list of ad blocking filtersA better way to get identification entropy from ad blockers is detecting which filters an ad blocker uses This is done by identifying unique CSS selectors for each filter so that if a unique selector is blocked you can be sure a visitor is using that filter The process consists of the following steps Identify which selectors are blocked by each filter This step will be done once as a preparation step Get unique selectors by filter This step will also be done once as a preparation step Check whether each unique selector is blocked This step will run in the browser every time you need to identify a visitor These three steps are explained in more detail below Identify which selectors are blocked by each filterTo get the selectors blocked by a filter we can t just read them from the filter file This approach will not work in practice because ad blockers can hide elements differently from filter rules So to get a true list of CSS selectors blocked by a filter we need to use a real ad blocker The process of detecting which selectors a filter really blocks is described next Make an HTML page that checks every selector from the filters you want to detect The page should use the process described in the previous section detecting the list of blocked CSS selectors You can use a Node js script that makes such an HTML page This step will be done once as a preparation step Go to the ad blocker settings and enable only the filter we re testing Go to the HTML page and reload it Save the list of blocked selectors to a new file Repeat the steps for each of the filters You will get a collection of files one for each filter Some filters will have no selectors we won t be able to detect them Get unique selectors by filterNow when you have selectors that are really blocked by each of the filters we can narrow them down to the unique ones A unique selector is a selector that is blocked by only one filter We created a script that extracts unique selectors The script output is a JSON file that contains unique blocked selectors for each of the filters Unfortunately some of the filters have no unique blocked selectors They are fully included into other filters That is all their rules are presented in other filters thus making these rules not unique You can see how we handle such filters in our GitHub repository Identify blocked selectors by filterThis part will run in the browser In a perfect world we would only need to check whether a single selector from each of the filters is blocked When a unique selector is blocked you can be sure that the person uses the filter Likewise if a unique selector isn t blocked you can be sure the person doesn t use the filter const uniqueSelectorsOfFilters easyList lazy ad leftthin banner fanboyAnnoyances feedback tab async function getActiveFilters uniqueSelectors const selectorArray Object values uniqueSelectors See the snippet above const blockedSelectors new Set await getBlockedSelectors selectorArray return Object keys uniqueSelectors filter filterName gt const selector uniqueSelectors filterName return blockedSelectors has selector getActiveFilters uniqueSelectorsOfFilters then activeFilters gt console log activeFilters In practice the result may sometimes be incorrect because of wrong detection of blocked selectors It can happen for several reasons ad blockers can update their filters they can experience glitches or page CSS can interfere with the process In order to mitigate the impact of unexpected behavior we can use fuzzy logic For example if more than of unique selectors associated with one filter are blocked we will assume the filter is enabled An example code that checks which of the given filters are enabled using a fuzzy logic const uniqueSelectorsOfFilters easyList lazy ad leftthin banner ad x fanboyAnnoyances feedback tab taboola below article async function getActiveFilters uniqueSelectors Collect all the selectors into a plain array const allSelectors concat Object values uniqueSelectors const blockedSelectors new Set await getBlockedSelectors allSelectors return Object keys uniqueSelectors filter filterName gt const selectors uniqueSelectors filterName let blockedSelectorCount for const selector of selectors if blockedSelectors has selector blockedSelectorCount return blockedSelectorCount gt selectors length getActiveFilters uniqueSelectorsOfFilters then activeFilters gt console log activeFilters Ad blocker fingerprintingOnce you collect enough data you can generate a visitor fingerprint Browser fingerprinting is a technique that works by reading browser attributes and combining them together into a single identifier This identifier is stateless and works well in normal and incognito modes There are dozens of ad blockers available For example AdBlock uBlock Origin AdGuard Blocker X These ad blockers use different sets of filters by default Also users can customize ad blocking extensions by removing default filters and adding custom filters This diversity gives entropy that can be used to generate fingerprints and identify visitors An example of an ad blocker customization A good browser fingerprint should stay the same when a user goes from regular to incognito private mode of the browser Thus ad blockers can provide a useful source of entropy only for browsers and operating systems where ad blockers are enabled by default in incognito mode Safari on MacOS iOS iPadOS browser extensions are enabled including ad blockers in both regular and incognito mode All Browsers on Android Ad blockers work on the system level so they affect all browser modes Desktop Chrome and Firefox Extensions are disabled by default in incognito mode Users however can manually choose to keep extensions enabled in incognito mode but few people do so Since we cannot know if a user has an ad blocker enabled in incognito mode it makes sense to identify visitors by their ad blockers only in Safari and on Android You can make a fingerprint solely from the information that we ve gotten from the visitor s ad blocker either by using the list of blocked selectors or the list of filters from the sections above Using SelectorsTo make a fingerprint using selectors only we take a list of selectors check which of them are blocked and hash the result See the snippet abovegetBlockedSelectors then blockedSelectors gt See the murmurHash implementation at const fingerprint murmurHash x hash JSON stringify blockedSelectors console log fingerprint This fingerprint is very sensitive but not stable The CSS code of the page can accidentally hide a test HTML element and thus change the result Also as the community updates the filters quite often every small update can add or remove a CSS selector rule which will change the whole fingerprint So a fingerprint based on selectors alone can only be used for short term identification Using Filter ListsTo mitigate the instability of CSS selectors alone you can use the list of filters instead to generate a fingerprint The list of filters that a person uses is only likely to change if they switch ad blockers or if their installed ad blocker undergoes a significant update To make a fingerprint get the list of enabled filters and hash it See the snippet abovegetActiveFilters then activeFilters gt See the murmurHash implementation at const fingerprint murmurHash x hash JSON stringify activeFilters console log fingerprint This is just an image check out the full interactive demo on our site As we mentioned above the filter lists themselves are updated frequently The updates can make the fingerprint change The fuzzy algorithm mitigates this problem but the underlying selectors will need to be updated eventually So you will need to repeat the process of collecting unique selectors after some time to actualize the data and keep the fingerprinting accuracy high PerformanceThe browser main thread is where it processes user events and paints By default browsers use a single thread to run all the JavaScript in the page and to perform layout reflows and garbage collection This means that long running JavaScript can block the thread leading to an unresponsive page and bad user experience The process of checking CSS selectors runs on the main thread The algorithm uses many DOM operations such as createElement and offsetParent These operations can run only on the main thread and can t be moved to a worker So it s important for the algorithm to run fast We ve measured the time it takes several old devices to check different numbers of CSS selectors per filter We test only in the browsers where it makes sense to identify visitors by ad blockers The tests were conducted in cold browsers on a complex page about KB of uncompressed CSS code The results MacBook Pro Core i macOS Safari iPhone SE iOS Safari Pixel Android Chrome selector per filter in total msmsmsAt most selectors per filter in total msmsmsAt most selectors per filter in totalmsmsmsAll selectors in total ≈ms≈ms≈msThe more CSS selectors the algorithm checks the more accurate the result will be But a large number of CSS selectors increases the execution time and the code size We have chosen to check selectors per filter as a good balance between performance stability and the code size You can see a complete implementation of the described algorithm in our GitHub repository Brave and TorBrave is a browser based on Chromium It disables extensions in incognito mode by default Thus we don t perform ad blocker fingerprinting in Brave Desktop Tor has no separate incognito mode so every extension works in all Tor tabs Ad blockers can be used to identify Tor users But the Tor authors strongly recommend not to install any custom extensions and it s not easy to do so Very few people will install ad blockers in Tor So the effectiveness of ad blocker fingerprinting is low Closing thoughts Ad blocker fingerprinting is only a small part of the larger identification processAd blocker fingerprinting is one of the many signals our open source library uses to generate a browser fingerprint However we do not blindly incorporate every signal available in the browser Instead we analyze the stability and uniqueness of each signal separately to determine their impact on fingerprint accuracy Ad blocker detection is a new signal and we re still evaluating its properties You can learn more about stability uniqueness and accuracy in our beginner s guide to browser fingerprinting Try Browser Fingerprinting for YourselfBrowser fingerprinting is a useful method of visitor identification for a variety of anti fraud applications It is particularly useful to identify malicious visitors attempting to circumvent tracking by clearing cookies browsing in incognito mode or using a VPN You can try implementing browser fingerprinting yourself with our open source library FingerprintJS is the most popular browser fingerprinting library available with over K GitHub stars For higher identification accuracy we also developed the FingerprintJS Pro API which uses machine learning to combine browser fingerprinting with additional identification techniques You can use FingerprintJS Pro for free with up to k API calls per month Get in touchStar follow or fork our GitHub projectEmail us your questions at oss fingerprintJS comSign up to our newsletter for updatesJoin our team to work on exciting research in online security work fingerprintjs com |
2021-07-01 21:03:44 |
Apple |
AppleInsider - Frontpage News |
Joel Kim Booster joins untitled Apple TV+ series starring Maya Rudolph |
https://appleinsider.com/articles/21/07/01/joel-kim-booster-joins-untitled-apple-tv-series-starring-maya-rudolph?utm_medium=rss
|
Joel Kim Booster joins untitled Apple TV series starring Maya RudolphJoel Kim Booster has signed on for an upcoming Apple TV comedy series led by Maya Rudolph Credit Taylor MillerThe currently untitled series which Apple won the rights to back in March stars Rudolph as a woman named Molly whose seemingly perfect life is upended after her husband leaves her with nothing but billion dollars Read more |
2021-07-01 21:08:38 |
Apple |
AppleInsider - Frontpage News |
GE rebrands smart home business as CYNC, HomeKit support coming soon |
https://appleinsider.com/articles/21/07/01/ge-rebrands-smart-home-business-as-cync-homekit-support-coming-soon?utm_medium=rss
|
GE rebrands smart home business as CYNC HomeKit support coming soonGE Lighting is rebranding its C by GE smart home line as CYNC ahead of a debut of several new products and an imminent HomeKit support addition C by GE becomes CYNCGE s smart home line now dubbed CYNC ーa stylized spelling of sync ーis getting a shot in the arm Alongside the new branding the company is introducing several new products including bulbs a motion sensor a switch and a camera Read more |
2021-07-01 21:51:59 |
海外TECH |
Engadget |
Facebook test warns users who may have seen 'harmful extremist content' |
https://www.engadget.com/facebook-extremism-prompts-213257499.html?src=rss
|
Facebook test warns users who may have seen x harmful extremist content x Facebook is testing new prompts to reach users who may be “becoming an extremist The in app messages which Facebook has confirmed is a test direct users to resources aimed at combating extremism CNN first reported the new prompts which have been spotted by Twitter users in recent days One version is aimed at people who may know someone falling into extremism “Are you concerned that someone you know is becoming an extremist it reads nbsp Facebook will also alert you if you ve been exposed to extremist content pic twitter com HQrkiKjーMatt Navarra MattNavarra July Another prompt appears to warn users who may have encountered extremist content on the platform “Violent groups try to manipulate your anger and disappointment it says “You can take action now to protect yourself and others Facebook spokesperson Andy Stone confirmed the messages are “part of our ongoing Redirect Initiative work The initiative is part of a broader effort by Facebook to fight extremism on its platform by working with groups like Life After Hate which helps people leave extremist groups The prompts will send users to Life After Hate or other resources according to CNN It s not clear how Facebook is determining which users may be most likely to be affected by extremism but the issue has become a hot button topic for Facebook The company was widely criticized for not doing enough to prevent QAnon and other fringe groups from using its platform to grow their followings Facebook has also been accused of downplaying its role in enabling the events of January th And when the Oversight Board recommended the company conduct its own inquiry into the issue the company said investigations should remain in the hands of law enforcement and elected officials |
2021-07-01 21:32:57 |
海外科学 |
NYT > Science |
Trailblazing Female Pilot to Join Jeff Bezos on Spaceflight |
https://www.nytimes.com/2021/07/01/science/space/wally-funk-blue-origin.html
|
Trailblazing Female Pilot to Join Jeff Bezos on SpaceflightAt Ms Funk will become the oldest person ever to go to space In the s she was part of a test program to determine whether women were fit for space |
2021-07-01 21:20:00 |
ニュース |
BBC News - Home |
Covid: Boris Johnson upbeat about easing lockdown in England on 19 July |
https://www.bbc.co.uk/news/uk-57681216
|
boris |
2021-07-01 21:32:31 |
ニュース |
BBC News - Home |
British teenager into Wimbledon third round |
https://www.bbc.co.uk/sport/tennis/57689514
|
wimbledon |
2021-07-01 21:01:54 |
ニュース |
BBC News - Home |
Batley and Spen by-election: Nail-biter for Labour as count gets under way |
https://www.bbc.co.uk/news/uk-politics-57686817
|
conservatives |
2021-07-01 21:08:43 |
ニュース |
BBC News - Home |
Warholm breaks Young's 29-year-old 400m hurdles world record |
https://www.bbc.co.uk/sport/athletics/57689153
|
Warholm breaks Young x s year old m hurdles world recordNorway s Karsten Warholm runs to set a new world record in the m hurdles in front of his home crowd at the Diamond League meeting in Oslo |
2021-07-01 21:12:03 |
ビジネス |
東洋経済オンライン |
投資初心者でもできる!「割安株」を探す3つの方法 なんとなくの “勘"で株を買っていませんか? | 投資 | 東洋経済オンライン |
https://toyokeizai.net/articles/-/436302?utm_source=rss&utm_medium=http&utm_campaign=link_back
|
東洋経済オンライン |
2021-07-02 06:30:00 |
コメント
コメントを投稿