Found 57 repositories(showing 30)
sanusanth
What is JavaScript and what does it do? Before you start learning something new, it’s important to understand exactly what it is and what it does. This is especially useful when it comes to mastering a new programming language. In simple terms, JavaScript is a programming language used to make websites interactive. If you think about the basic makeup of a website, you have HTML, which describes and defines the basic content and structure of the website, then you have CSS, which tells the browser how this HTML content should be displayed—determining things like color and font. With just HTML and CSS, you have a website that looks good but doesn’t actually do much. JavaScript brings the website to life by adding functionality. JavaScript is responsible for elements that the user can interact with, such as drop-down menus, modal windows, and contact forms. It is also used to create things like animations, video players, and interactive maps. Nowadays, JavaScript is an all-purpose programming language—meaning it runs across the entire software stack. The most popular application of JavaScript is on the client side (aka frontend), but since Node.js came on the scene, many people run JavaScript on the server side (aka backend) as well. When used on the client side, JavaScript code is read, interpreted, and executed in the user’s web browser. When used on the server side, it is run on a remote computer. You can learn more about the difference between frontend and backend programming here. JavaScript isn’t only used to create websites. It can also be used to build browser-based games and, with the help of certain frameworks, mobile apps for different operating systems. The creation of new libraries and frameworks is also making it possible to build backend programs with JavaScript, such as web apps and server apps. Is it still worth learning JavaScript in 2021? The world of web development is constantly moving. With so many new tools popping up all the time, it can be extremely difficult to know where you should focus your efforts. As an aspiring developer, you’ll want to make sure that what you’re learning is still relevant in today’s industry. If you’re having doubts about JavaScript, it’s important to know that, since its creation in 1995, JavaScript is pretty much everywhere on the web—and that’s not likely to change any time soon. According to the 2020 StackOverflow developer survey, JavaScript is the most commonly used programming language for the eighth year in a row. It is currently used by 94.5% of all websites and, despite originally being designed as a client-side language, JavaScript has now made its way to the server-side of websites (thanks to Node.js), mobile devices (thanks to React Native and Ionic) and desktop (courtesy of Electron). As long as people are interacting with the web, you can assume that JavaScript is highly relevant—there’s no doubt that this is a language worth knowing! With that in mind, let’s look at some of the key benefits of becoming a JavaScript expert. Why learn JavaScript? The most obvious reason for learning JavaScript is if you have hopes of becoming a web developer. Even if you haven’t got your heart set on a tech career, being proficient in JavaScript will enable you to build websites from scratch—a pretty useful skill to have in today’s job market! If you do want to become a web developer, here are some of the main reasons why you should learn JavaScript: JavaScript experts are versatile JavaScript is an extremely versatile language. Once you’ve mastered it, the possibilities are endless: you can code on the client-side (frontend) using Angular and on the server-side (backend) using Node.js. You can also develop web, mobile, and desktop apps using React, React Native, and Electron, and you can even get involved in machine learning. If you want to become a frontend developer, JavaScript is a prerequisite. However, that’s not the only career path open to you as a JavaScript expert. Mastering this key programming language could see you go on to work in full-stack development, games development, information security software engineering, machine learning, and artificial intelligence—to name just a few! Ultimately, if you want any kind of development or engineering career, proficiency in JavaScript is a must. JavaScript experts are in-demand (and well-paid) JavaScript is the most popular programming language in the world, so it’s no wonder that JavaScript is one of the most sought-after skills in the web development industry today. According to the Devskiller IT Skills and Hiring Report 2020, 72% of companies are looking to hire JavaScript experts. Enter the search term “JavaScript” on job site Indeed and you’ll find over 40,000 jobs requiring this skill (in the US). Run the same search on LinkedIn and the results are in excess of 125,000. At the same time, the global demand for JavaScript seems to outweigh the expertise available on the market. According to this 2018 HackerRank report, 48% of employers worldwide need developers with JavaScript skills, while only 42% of student developers claim to be proficient in JavaScript. And, in their most recent report for 2020, HackerRank once again reports that JavaScript is the most popular language that hiring mangers look for in a web developer candidate. Not only are JavaScript experts in demand—they are also well-paid. In the United States, JavaScript developers earn an average yearly salary of $111,953 per year. We’ve covered this topic in more detail in our JavaScript salary guide, but as you can see, learning JavaScript can really boost your earning potential as a developer. JavaScript is beginner-friendly Compared to many other programming languages, JavaScript offers one of the more beginner-friendly entry points into the world of coding. The great thing about JavaScript is that it comes installed on every modern web browser—there’s no need to set up any kind of development environment, which means you can start coding with JavaScript right away! Another advantage of learning JavaScript as your first programming language is that you get instant feedback; with a minimal amount of JavaScript code, you’ll immediately see visible results. There’s also a huge JavaScript community on sites like Stack Overflow, so you’ll find plenty of support as you learn. Not only is JavaScript beginner-friendly; it will also set you up with some extremely valuable transferable skills. JavaScript supports object-oriented, functional, and imperative styles of programming—skills which can be transferred to any new language you might learn later on, such as Python, Java, or C++. JavaScript provides a crucial introduction to key principles and practices that you’ll take with you throughout your career as a developer. Should you learn plain JavaScript first or can you skip to frameworks and libraries? When deciding whether or not to learn JavaScript, what you’re really asking is whether or not you should learn “vanilla” JavaScript. Vanilla JavaScript just means plain JavaScript without any libraries or frameworks. Let’s explore what this means in more detail now. What is meant by vanilla JavaScript, libraries, and frameworks? If you research the term “vanilla JavaScript”, you might run into some confusion; however, all you need to know is that vanilla JavaScript is used to refer to native, standards-based, non-extended JavaScript. There is no difference between vanilla JavaScript and JavaScript—it’s just there to emphasize the usage of plain JavaScript without the use of libraries and frameworks. So what are libraries and frameworks? JavaScript libraries and frameworks both contain sets of prewritten, ready-to-use JavaScript code—but they’re not the same thing. You can think of a framework as your blueprint for building a website: it gives you a structure to work from, and contains ready-made components and tools that help you to build certain elements much quicker than if you were to code them from scratch. Some popular JavaScript frameworks include Angular, React, Vue, and Node.js. Frameworks also contain libraries. Libraries are smaller than frameworks, and tend to be used for more specific cases. A JavaScript library contains sets of JavaScript code which can be called upon to implement certain functions and features. Let’s imagine you want to code a particular element into your website. You could write, say, ten lines of JavaScript from scratch—or you could take the condensed, ready-made version from your chosen JavaScript library. Some examples of JavaScript libraries include jQuery, Lodash, and Underscore. The easiest way to understand how frameworks and libraries work together is to imagine you are building a house. The framework provides the foundation and the structure, while the library enables you to add in ready-made components (like furniture) rather than building your own from scratch. You can learn more about the relationship between languages and libraries in this post explaining the main differences between JavaScript and jQuery. For now, let’s go back to our original question: How important is it to learn vanilla JavaScript? Should you learn vanilla JavaScript first? When it comes to learning JavaScript, it can be tempting to skip ahead to those time-saving frameworks and libraries we just talked about—and many developers do. However, there are many compelling arguments for learning plain JavaScript first. While JavaScript frameworks may help you get the job done quicker, there’s only so far you can go if you don’t understand the core concepts behind these frameworks. Frontend developer Abhishek Nagekar describes how not learning vanilla JavaScript came back to bite him when he started learning the JavaScript frameworks Node and Express: “As I went to write more and more code in Node and Express, I began to get stuck at even the tiniest problems. Suddenly, I was surrounded with words like callbacks, closures, event loop and prototype. It felt like I got a reintroduction to JavaScript, but this time, it was not a toddler playing in its cradle, it was something of a mysterious monster, challenging me on every other step for not having taken it seriously.” The above Tweet references a long-running joke within the developer community, and although it dates way back to 2015, it’s still highly relevant today. If you want to become a developer who can innovate, not just execute, you need to understand the underlying principles of the web—not just the shortcuts. This means learning vanilla JavaScript before you move on to frameworks. In fact, understanding plain JavaScript will help you later on when it comes to deciding whether to use a framework for a certain project, and if so, which framework to use. Why Study JavaScript? JavaScript is one of the 3 languages all web developers must learn: 1. HTML to define the content of web pages 2. CSS to specify the layout of web pages 3. JavaScript to program the behavior of web pages Learning Speed In this tutorial, the learning speed is your choice. Everything is up to you. If you are struggling, take a break, or re-read the material. Always make sure you understand all the "Try-it-Yourself" examples. The only way to become a clever programmer is to: Practice. Practice. Practice. Code. Code. Code ! Commonly Asked Questions How do I get JavaScript? Where can I download JavaScript? Is JavaScript Free? You don't have to get or download JavaScript. JavaScript is already running in your browser on your computer, on your tablet, and on your smart-phone. JavaScript is free to use for everyone.
sayantann11
lustering in Machine Learning Introduction to Clustering It is basically a type of unsupervised learning method . An unsupervised learning method is a method in which we draw references from datasets consisting of input data without labelled responses. Generally, it is used as a process to find meaningful structure, explanatory underlying processes, generative features, and groupings inherent in a set of examples. Clustering is the task of dividing the population or data points into a number of groups such that data points in the same groups are more similar to other data points in the same group and dissimilar to the data points in other groups. It is basically a collection of objects on the basis of similarity and dissimilarity between them. For ex– The data points in the graph below clustered together can be classified into one single group. We can distinguish the clusters, and we can identify that there are 3 clusters in the below picture. It is not necessary for clusters to be a spherical. Such as : DBSCAN: Density-based Spatial Clustering of Applications with Noise These data points are clustered by using the basic concept that the data point lies within the given constraint from the cluster centre. Various distance methods and techniques are used for calculation of the outliers. Why Clustering ? Clustering is very much important as it determines the intrinsic grouping among the unlabeled data present. There are no criteria for a good clustering. It depends on the user, what is the criteria they may use which satisfy their need. For instance, we could be interested in finding representatives for homogeneous groups (data reduction), in finding “natural clusters” and describe their unknown properties (“natural” data types), in finding useful and suitable groupings (“useful” data classes) or in finding unusual data objects (outlier detection). This algorithm must make some assumptions which constitute the similarity of points and each assumption make different and equally valid clusters. Clustering Methods : Density-Based Methods : These methods consider the clusters as the dense region having some similarity and different from the lower dense region of the space. These methods have good accuracy and ability to merge two clusters.Example DBSCAN (Density-Based Spatial Clustering of Applications with Noise) , OPTICS (Ordering Points to Identify Clustering Structure) etc. Hierarchical Based Methods : The clusters formed in this method forms a tree-type structure based on the hierarchy. New clusters are formed using the previously formed one. It is divided into two category Agglomerative (bottom up approach) Divisive (top down approach) examples CURE (Clustering Using Representatives), BIRCH (Balanced Iterative Reducing Clustering and using Hierarchies) etc. Partitioning Methods : These methods partition the objects into k clusters and each partition forms one cluster. This method is used to optimize an objective criterion similarity function such as when the distance is a major parameter example K-means, CLARANS (Clustering Large Applications based upon Randomized Search) etc. Grid-based Methods : In this method the data space is formulated into a finite number of cells that form a grid-like structure. All the clustering operation done on these grids are fast and independent of the number of data objects example STING (Statistical Information Grid), wave cluster, CLIQUE (CLustering In Quest) etc. Clustering Algorithms : K-means clustering algorithm – It is the simplest unsupervised learning algorithm that solves clustering problem.K-means algorithm partition n observations into k clusters where each observation belongs to the cluster with the nearest mean serving as a prototype of the cluster . Applications of Clustering in different fields Marketing : It can be used to characterize & discover customer segments for marketing purposes. Biology : It can be used for classification among different species of plants and animals. Libraries : It is used in clustering different books on the basis of topics and information. Insurance : It is used to acknowledge the customers, their policies and identifying the frauds. City Planning: It is used to make groups of houses and to study their values based on their geographical locations and other factors present. Earthquake studies: By learning the earthquake-affected areas we can determine the dangerous zones. References : Wiki Hierarchical clustering Ijarcs matteucc analyticsvidhya knowm
NestieGuilas
Marketing Platform Google Analytics Terms of Service These Google Analytics Terms of Service (this "Agreement") are entered into by Google LLC ("Google") and the entity executing this Agreement ("You"). This Agreement governs Your use of the standard Google Analytics (the "Service"). BY CLICKING THE "I ACCEPT" BUTTON, COMPLETING THE REGISTRATION PROCESS, OR USING THE SERVICE, YOU ACKNOWLEDGE THAT YOU HAVE REVIEWED AND ACCEPT THIS AGREEMENT AND ARE AUTHORIZED TO ACT ON BEHALF OF, AND BIND TO THIS AGREEMENT, THE OWNER OF THIS ACCOUNT. In consideration of the foregoing, the parties agree as follows: 1. Definitions. "Account" refers to the account for the Service. All Profiles (as applicable) linked to a single Property will have their Hits aggregated before determining the charge for the Service for that Property. "Confidential Information" includes any proprietary data and any other information disclosed by one party to the other in writing and marked "confidential" or disclosed orally and, within five business days, reduced to writing and marked "confidential". However, Confidential Information will not include any information that is or becomes known to the general public, which is already in the receiving party's possession prior to disclosure by a party or which is independently developed by the receiving party without the use of Confidential Information. "Customer Data" or "Google Analytics Data" means the data you collect, process or store using the Service concerning the characteristics and activities of Users. "Documentation" means any accompanying documentation made available to You by Google for use with the Processing Software, including any documentation available online. "GAMC" means the Google Analytics Measurement Code, which is installed on a Property for the purpose of collecting Customer Data, together with any fixes, updates and upgrades provided to You. "Hit" means a collection of interactions that results in data being sent to the Service and processed. Examples of Hits may include page view hits and ecommerce hits. A Hit can be a call to the Service by various libraries, but does not have to be so (e.g., a Hit can be delivered to the Service by other Google Analytics-supported protocols and mechanisms made available by the Service to You). "Platform Home" means the user interface through which You can access certain Google Marketing Platform-level functionality. "Processing Software" means the Google Analytics server-side software and any upgrades, which analyzes the Customer Data and generates the Reports. "Profile" means the collection of settings that together determine the information to be included in, or excluded from, a particular Report. For example, a Profile could be established to view a small portion of a web site as a unique Report. "Property" means any web page, application, other property or resource under Your control that sends data to Google Analytics. "Privacy Policy" means the privacy policy on a Property. "Report" means the resulting analysis shown at www.google.com/analytics/, some of which may include analysis for a Profile. "Servers" means the servers controlled by Google (or its wholly-owned subsidiaries) on which the Processing Software and Customer Data are stored. “SDKs” mean certain software development kits, which may be used or incorporated into a Property app for the purpose of collecting Customer Data, together with any fixes, updates, and upgrades provided to You. "Software" means the Processing Software, GAMC and/or SDKs. "Third Party" means any third party (i) to which You provide access to Your Account or (ii) for which You use the Service to collect information on the third party's behalf. "Users" means users and/or visitors to Your Properties. The words "include" and "including" mean "including but not limited to." 2. Fees and Service. Subject to Section 15, the Service is provided without charge to You for up to 10 million Hits per month per Account. Google may change its fees and payment policies for the Service from time to time including the addition of costs for geographic data, the importing of cost data from search engines, or other fees charged to Google or its wholly-owned subsidiaries by third party vendors for the inclusion of data in the Service reports. The changes to the fees or payment policies are effective upon Your acceptance of those changes which will be posted at www.google.com/analytics/. Unless otherwise stated, all fees are quoted in U.S. Dollars. Any outstanding balance becomes immediately due and payable upon termination of this Agreement and any collection expenses (including attorneys' fees) incurred by Google will be included in the amount owed, and may be charged to the credit card or other billing mechanism associated with Your AdWords account. 3. Member Account, Password, and Security. To register for the Service, You must complete the registration process by providing Google with current, complete and accurate information as prompted by the registration form, including Your e-mail address (username) and password. You will protect Your passwords and take full responsibility for Your own, and third party, use of Your accounts. You are solely responsible for any and all activities that occur under Your Account. You will notify Google immediately upon learning of any unauthorized use of Your Account or any other breach of security. Google's (or its wholly-owned subsidiaries) support staff may, from time to time, log in to the Service under Your customer password in order to maintain or improve service, including to provide You assistance with technical or billing issues. 4. Nonexclusive License. Subject to the terms and conditions of this Agreement, (a) Google grants You a limited, revocable, non-exclusive, non-sublicensable license to install, copy and use the GAMC and/or SDKs solely as necessary for You to use the Service on Your Properties or Third Party's Properties; and (b) You may remotely access, view and download Your Reports stored at www.google.com/analytics/. You will not (and You will not allow any third party to) (i) copy, modify, adapt, translate or otherwise create derivative works of the Software or the Documentation; (ii) reverse engineer, decompile, disassemble or otherwise attempt to discover the source code of the Software, except as expressly permitted by the law in effect in the jurisdiction in which You are located; (iii) rent, lease, sell, assign or otherwise transfer rights in or to the Software, the Documentation or the Service; (iv) remove any proprietary notices or labels on the Software or placed by the Service; (v) use, post, transmit or introduce any device, software or routine which interferes or attempts to interfere with the operation of the Service or the Software; or (vi) use data labeled as belonging to a third party in the Service for purposes other than generating, viewing, and downloading Reports. You will comply with all applicable laws and regulations in Your use of and access to the Documentation, Software, Service and Reports. 5. Confidentiality and Beta Features. Neither party will use or disclose the other party's Confidential Information without the other's prior written consent except for the purpose of performing its obligations under this Agreement or if required by law, regulation or court order; in which case, the party being compelled to disclose Confidential Information will give the other party as much notice as is reasonably practicable prior to disclosing the Confidential Information. Certain Service features are identified as "Alpha," "Beta," "Experiment," (either within the Service or elsewhere by Google) or as otherwise unsupported or confidential (collectively, "Beta Features"). You may not disclose any information from Beta Features or the terms or existence of any non-public Beta Features. Google will have no liability arising out of or related to any Beta Features. 6. Information Rights and Publicity. Google and its wholly owned subsidiaries may retain and use, subject to the terms of its privacy policy (located at https://www.google.com/policies/privacy/), information collected in Your use of the Service. Google will not share Your Customer Data or any Third Party's Customer Data with any third parties unless Google (i) has Your consent for any Customer Data or any Third Party's consent for the Third Party's Customer Data; (ii) concludes that it is required by law or has a good faith belief that access, preservation or disclosure of Customer Data is reasonably necessary to protect the rights, property or safety of Google, its users or the public; or (iii) provides Customer Data in certain limited circumstances to third parties to carry out tasks on Google's behalf (e.g., billing or data storage) with strict restrictions that prevent the data from being used or shared except as directed by Google. When this is done, it is subject to agreements that oblige those parties to process Customer Data only on Google's instructions and in compliance with this Agreement and appropriate confidentiality and security measures. 7. Privacy. You will not and will not assist or permit any third party to, pass information to Google that Google could use or recognize as personally identifiable information. You will have and abide by an appropriate Privacy Policy and will comply with all applicable laws, policies, and regulations relating to the collection of information from Users. You must post a Privacy Policy and that Privacy Policy must provide notice of Your use of cookies, identifiers for mobile devices (e.g., Android Advertising Identifier or Advertising Identifier for iOS) or similar technology used to collect data. You must disclose the use of Google Analytics, and how it collects and processes data. This can be done by displaying a prominent link to the site "How Google uses data when you use our partners' sites or apps", (located at www.google.com/policies/privacy/partners/, or any other URL Google may provide from time to time). You will use commercially reasonable efforts to ensure that a User is provided with clear and comprehensive information about, and consents to, the storing and accessing of cookies or other information on the User’s device where such activity occurs in connection with the Service and where providing such information and obtaining such consent is required by law. You must not circumvent any privacy features (e.g., an opt-out) that are part of the Service. You will comply with all applicable Google Analytics policies located at www.google.com/analytics/policies/ (or such other URL as Google may provide) as modified from time to time (the "Google Analytics Policies"). You may participate in an integrated version of Google Analytics and certain Google advertising services ("Google Analytics Advertising Features"). If You use Google Analytics Advertising Features, You will adhere to the Google Analytics Advertising Features policy (available at support.google.com/analytics/bin/answer.py?hl=en&topic=2611283&answer=2700409). Your access to and use of any Google advertising service is subject to the applicable terms between You and Google regarding that service. If You use the Platform Home, Your use of the Platform Home is subject to the Platform Home Additional Terms (or as subsequently re-named) available at https://support.google.com/marketingplatform/answer/9047313 (or such other URL as Google may provide) as modified from time to time (the "Platform Home Terms"). 8. Indemnification. To the extent permitted by applicable law, You will indemnify, hold harmless and defend Google and its wholly-owned subsidiaries, at Your expense, from any and all third-party claims, actions, proceedings, and suits brought against Google or any of its officers, directors, employees, agents or affiliates, and all related liabilities, damages, settlements, penalties, fines, costs or expenses (including, reasonable attorneys' fees and other litigation expenses) incurred by Google or any of its officers, directors, employees, agents or affiliates, arising out of or relating to (i) Your breach of any term or condition of this Agreement, (ii) Your use of the Service, (iii) Your violations of applicable laws, rules or regulations in connection with the Service, (iv) any representations and warranties made by You concerning any aspect of the Service, the Software or Reports to any Third Party; (v) any claims made by or on behalf of any Third Party pertaining directly or indirectly to Your use of the Service, the Software or Reports; (vi) violations of Your obligations of privacy to any Third Party; and (vii) any claims with respect to acts or omissions of any Third Party in connection with the Service, the Software or Reports. Google will provide You with written notice of any claim, suit or action from which You must indemnify Google. You will cooperate as fully as reasonably required in the defense of any claim. Google reserves the right, at its own expense, to assume the exclusive defense and control of any matter subject to indemnification by You. 9. Third Parties. If You use the Service on behalf of the Third Party or a Third Party otherwise uses the Service through Your Account, whether or not You are authorized by Google to do so, then You represent and warrant that (a) You are authorized to act on behalf of, and bind to this Agreement, the Third Party to all obligations that You have under this Agreement, (b) Google may share with the Third Party any Customer Data that is specific to the Third Party's Properties, and (c) You will not disclose Third Party's Customer Data to any other party without the Third Party's consent. 10. DISCLAIMER OF WARRANTIES. TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, EXCEPT AS EXPRESSLY PROVIDED FOR IN THIS AGREEMENT, GOOGLE MAKES NO OTHER WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING WITHOUT LIMITATION WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR USE AND NONINFRINGEMENT. 11. LIMITATION OF LIABILITY. TO THE EXTENT PERMITTED BY APPLICABLE LAW, GOOGLE WILL NOT BE LIABLE FOR YOUR LOST REVENUES OR INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, EVEN IF GOOGLE OR ITS SUBSIDIARIES AND AFFILIATES HAVE BEEN ADVISED OF, KNEW OR SHOULD HAVE KNOWN THAT SUCH DAMAGES WERE POSSIBLE AND EVEN IF DIRECT DAMAGES DO NOT SATISFY A REMEDY. GOOGLE'S (AND ITS WHOLLY OWNED SUBSIDIARIES’) TOTAL CUMULATIVE LIABILITY TO YOU OR ANY OTHER PARTY FOR ANY LOSS OR DAMAGES RESULTING FROM CLAIMS, DEMANDS, OR ACTIONS ARISING OUT OF OR RELATING TO THIS AGREEMENT WILL NOT EXCEED $500 (USD). 12. Proprietary Rights Notice. The Service, which includes the Software and all Intellectual Property Rights therein are, and will remain, the property of Google (and its wholly owned subsidiaries). All rights in and to the Software not expressly granted to You in this Agreement are reserved and retained by Google and its licensors without restriction, including, Google's (and its wholly owned subsidiaries’) right to sole ownership of the Software and Documentation. Without limiting the generality of the foregoing, You agree not to (and not to allow any third party to): (a) sublicense, distribute, or use the Service or Software outside of the scope of the license granted in this Agreement; (b) copy, modify, adapt, translate, prepare derivative works from, reverse engineer, disassemble, or decompile the Software or otherwise attempt to discover any source code or trade secrets related to the Service; (c) rent, lease, sell, assign or otherwise transfer rights in or to the Software, Documentation or the Service; (d) use, post, transmit or introduce any device, software or routine which interferes or attempts to interfere with the operation of the Service or the Software; (e) use the trademarks, trade names, service marks, logos, domain names and other distinctive brand features or any copyright or other proprietary rights associated with the Service for any purpose without the express written consent of Google; (f) register, attempt to register, or assist anyone else to register any trademark, trade name, serve marks, logos, domain names and other distinctive brand features, copyright or other proprietary rights associated with Google (or its wholly owned subsidiaries) other than in the name of Google (or its wholly owned subsidiaries, as the case may be); (g) remove, obscure, or alter any notice of copyright, trademark, or other proprietary right appearing in or on any item included with the Service or Software; or (h) seek, in a proceeding filed during the term of this Agreement or for one year after such term, an injunction of any portion of the Service based on patent infringement. 13. U.S. Government Rights. If the use of the Service is being acquired by or on behalf of the U.S. Government or by a U.S. Government prime contractor or subcontractor (at any tier), in accordance with 48 C.F.R. 227.7202-4 (for Department of Defense (DOD) acquisitions) and 48 C.F.R. 2.101 and 12.212 (for non-DOD acquisitions), the Government's rights in the Software, including its rights to use, modify, reproduce, release, perform, display or disclose the Software or Documentation, will be subject in all respects to the commercial license rights and restrictions provided in this Agreement. 14. Term and Termination. Either party may terminate this Agreement at any time with notice. Upon any termination of this Agreement, Google will stop providing, and You will stop accessing the Service. Additionally, if Your Account and/or Properties are terminated, You will (i) delete all copies of the GAMC from all Properties and/or (ii) suspend any and all use of the SDKs within 3 business days of such termination. In the event of any termination (a) You will not be entitled to any refunds of any usage fees or any other fees, and (b) any outstanding balance for Service rendered through the date of termination will be immediately due and payable in full and (c) all of Your historical Report data will no longer be available to You. 15. Modifications to Terms of Service and Other Policies. Google may modify these terms or any additional terms that apply to the Service to, for example, reflect changes to the law or changes to the Service. You should look at the terms regularly. Google will post notice of modifications to these terms at https://www.google.com/analytics/terms/, the Google Analytics Policies at www.google.com/analytics/policies/, or other policies referenced in these terms at the applicable URL for such policies. Changes will not apply retroactively and will become effective no sooner than 14 days after they are posted. If You do not agree to the modified terms for the Service, You should discontinue Your use Google Analytics. No amendment to or modification of this Agreement will be binding unless (i) in writing and signed by a duly authorized representative of Google, (ii) You accept updated terms online, or (iii) You continue to use the Service after Google has posted updates to the Agreement or to any policy governing the Service. 16. Miscellaneous, Applicable Law and Venue. Google will be excused from performance in this Agreement to the extent that performance is prevented, delayed or obstructed by causes beyond its reasonable control. This Agreement (including any amendment agreed upon by the parties in writing) represents the complete agreement between You and Google concerning its subject matter, and supersedes all prior agreements and representations between the parties. If any provision of this Agreement is held to be unenforceable for any reason, such provision will be reformed to the extent necessary to make it enforceable to the maximum extent permissible so as to effect the intent of the parties, and the remainder of this Agreement will continue in full force and effect. This Agreement will be governed by and construed under the laws of the state of California without reference to its conflict of law principles. In the event of any conflicts between foreign law, rules, and regulations, and California law, rules, and regulations, California law, rules and regulations will prevail and govern. Each party agrees to submit to the exclusive and personal jurisdiction of the courts located in Santa Clara County, California. The United Nations Convention on Contracts for the International Sale of Goods and the Uniform Computer Information Transactions Act do not apply to this Agreement. The Software is controlled by U.S. Export Regulations, and it may be not be exported to or used by embargoed countries or individuals. Any notices to Google must be sent to: Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA, with a copy to Legal Department, via first class or air mail or overnight courier, and are deemed given upon receipt. A waiver of any default is not a waiver of any subsequent default. You may not assign or otherwise transfer any of Your rights in this Agreement without Google's prior written consent, and any such attempt is void. The relationship between Google and You is not one of a legal partnership relationship, but is one of independent contractors. This Agreement will be binding upon and inure to the benefit of the respective successors and assigns of the parties hereto. The following sections of this Agreement will survive any termination thereof: 1, 4, 5, 6 (except the last two sentences), 7, 8, 9, 10, 11, 12, 14, 16, and 17. 17. Google Analytics for Firebase. If You link a Property to Firebase (“Firebase Linkage”) as part of using the Service, the following terms, in addition to Sections 1-16 above, will also apply to You, and will also govern Your use of the Service, including with respect to Your use of Firebase Linkage. Other than as modified below, all other terms will stay the same and continue to apply. In the event of a conflict between this Section 17 and Sections 1-16 above, the terms in Section 17 will govern and control solely with respect to Your use of the Firebase Linkage. The following definition in Section 1 is modified as follows: "Hit" means a collection of interactions that results in data being sent to the Service and processed. Examples of Hits may include page view hits and ecommerce hits. A Hit can be a call to the Service by various libraries, but does not have to be so (e.g., a Hit can be delivered to the Service by other Google Analytics-supported protocols and mechanisms made available by the Service to You). For the sake of clarity, a Hit does not include certain events whose collection reflects interactions with certain Properties capable of supporting multiple data streams, and which may include screen views and custom events (the collection of events, an “Enhanced Packet”). The following sentence is added to the end of Section 7 as follows: If You link a Property to a Firebase project (“Firebase Linkage”) (i) certain data from Your Property, including Customer Data, may be made accessible within or to any other entity or personnel according to permissions set in Firebase and (ii) that Property may have certain Service settings modified by authorized personnel of Firebase (notwithstanding the settings You may have designated for that Property within the Service). Last Updated June 17, 2019 Follow us About Google Marketing Platform Overview For Small Businesses For Enterprise Learning & support Support Blog Analytics Academy Skillshop Google Primer Developers & partners Google Marketing Platform Partners Google Measurement Partners Analytics for developers Tag Manager for developers Surveys for developers Campaign Manager 360 for developers Related products Google Ads Google AdSense Google Ad Manager Google Cloud Firebase More from Google Think with Google Business Solutions Google Workspace PrivacyTermsAbout GoogleGoogle Products Help
lhai36366
WPF Partial Trust Security Article 10 minutes to read In general, Internet applications should be restricted from having direct access to critical system resources, to prevent malicious damage. By default, HTML and client-side scripting languages are not able to access critical system resources. Because Windows Presentation Foundation (WPF) browser-hosted applications can be launched from the browser, they should conform to a similar set of restrictions. To enforce these restrictions, WPF relies on both Code Access Security (CAS) and ClickOnce (see WPF Security Strategy - Platform Security). By default, browser-hosted applications request the Internet zone CAS set of permissions, irrespective of whether they are launched from the Internet, the local intranet, or the local computer. Applications that run with anything less than the full set of permissions are said to be running with partial trust. WPF provides a wide variety of support to ensure that as much functionality as possible can be used safely in partial trust, and along with CAS, provides additional support for partial trust programming. This topic contains the following sections: WPF Feature Partial Trust Support Partial Trust Programming Managing Permissions WPF Feature Partial Trust Support The following table lists the high-level features of Windows Presentation Foundation (WPF) that are safe to use within the limits of the Internet zone permission set. Table 1: WPF Features that are Safe in Partial Trust Feature Area Feature General Browser Window Site of Origin Access IsolatedStorage (512KB Limit) UIAutomation Providers Commanding Input Method Editors (IMEs) Tablet Stylus and Ink Simulated Drag/Drop using Mouse Capture and Move Events OpenFileDialog XAML Deserialization (via XamlReader.Load) Web Integration Browser Download Dialog Top-Level User-Initiated Navigation mailto:links Uniform Resource Identifier Parameters HTTPWebRequest WPF Content Hosted in an IFRAME Hosting of Same-Site HTML Pages using Frame Hosting of Same Site HTML Pages using WebBrowser Web Services (ASMX) Web Services (using Windows Communication Foundation) Scripting Document Object Model Visuals 2D and 3D Animation Media (Site Of Origin and Cross-Domain) Imaging/Audio/Video Reading FlowDocuments XPS Documents Embedded & System Fonts CFF & TrueType Fonts Editing Spell Checking RichTextBox Plaintext and Ink Clipboard Support User-Initiated Paste Copying Selected Content Controls General Controls This table covers the WPF features at a high level. For more detailed information, the Windows Software Development Kit (SDK) documents the permissions that are required by each member in WPF. Additionally, the following features have more detailed information regarding partial trust execution, including special considerations. XAML (see XAML Overview (WPF)). Popups (see System.Windows.Controls.Primitives.Popup). Drag and Drop (see Drag and Drop Overview). Clipboard (see System.Windows.Clipboard). Imaging (see System.Windows.Controls.Image). Serialization (see XamlReader.Load, XamlWriter.Save). Open File Dialog Box (see Microsoft.Win32.OpenFileDialog). The following table outlines the WPF features that are not safe to run within the limits of the Internet zone permission set. Table 2: WPF Features that are Not Safe in Partial Trust Feature Area Feature General Window (Application Defined Windows and Dialog Boxes) SaveFileDialog File System Registry Access Drag and Drop XAML Serialization (via XamlWriter.Save) UIAutomation Clients Source Window Access (HwndHost) Full Speech Support Windows Forms Interoperability Visuals Bitmap Effects Image Encoding Editing Rich Text Format Clipboard Full XAML support Partial Trust Programming For XBAP applications, code that exceeds the default permission set will have different behavior depending on the security zone. In some cases, the user will receive a warning when they attempt to install it. The user can choose to continue or cancel the installation. The following table describes the behavior of the application for each security zone and what you have to do for the application to receive full trust. Security Zone Behavior Getting Full Trust Local computer Automatic full trust No action is needed. Intranet and trusted sites Prompt for full trust Sign the XBAP with a certificate so that the user sees the source in the prompt. Internet Fails with "Trust Not Granted" Sign the XBAP with a certificate. Note The behavior described in the previous table is for full trust XBAPs that do not follow the ClickOnce Trusted Deployment model. In general, code that may exceed the allowed permissions is likely to be common code that is shared between both standalone and browser-hosted applications. CAS and WPF offer several techniques for managing this scenario. Detecting Permissions Using CAS In some situations, it is possible for shared code in library assemblies to be used by both standalone applications and XBAPs. In these cases, code may execute functionality that could require more permissions than the application's awarded permission set allows. Your application can detect whether or not it has a certain permission by using Microsoft .NET Framework security. Specifically, it can test whether it has a specific permission by calling the Demand method on the instance of the desired permission. This is shown in the following example, which has code that queries for whether it has the ability to save a file to the local disk: Imports System.IO ' File, FileStream, StreamWriter Imports System.IO.IsolatedStorage ' IsolatedStorageFile Imports System.Security ' CodeAccesPermission, IsolatedStorageFileStream Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess Imports System.Windows ' MessageBox Namespace SDKSample Public Class FileHandling Public Sub Save() If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then ' Write to local disk Using stream As FileStream = File.Create("c:\newfile.txt") Using writer As New StreamWriter(stream) writer.WriteLine("I can write to local disk.") End Using End Using Else MessageBox.Show("I can't write to local disk.") End If End Sub ' Detect whether or not this application has the requested permission Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean Try ' Try and get this permission requestedPermission.Demand() Return True Catch Return False End Try End Function ... End Class End Namespace using System.IO; // File, FileStream, StreamWriter using System.IO.IsolatedStorage; // IsolatedStorageFile using System.Security; // CodeAccesPermission, IsolatedStorageFileStream using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess using System.Windows; // MessageBox namespace SDKSample { public class FileHandling { public void Save() { if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt"))) { // Write to local disk using (FileStream stream = File.Create(@"c:\newfile.txt")) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("I can write to local disk."); } } else { MessageBox.Show("I can't write to local disk."); } } // Detect whether or not this application has the requested permission bool IsPermissionGranted(CodeAccessPermission requestedPermission) { try { // Try and get this permission requestedPermission.Demand(); return true; } catch { return false; } } ... } } If an application does not have the desired permission, the call to Demand will throw a security exception. Otherwise, the permission has been granted. IsPermissionGranted encapsulates this behavior and returns true or false as appropriate. Graceful Degradation of Functionality Being able to detect whether code has the permission to do what it needs to do is interesting for code that can be executed from different zones. While detecting the zone is one thing, it is far better to provide an alternative for the user, if possible. For example, a full trust application typically enables users to create files anywhere they want, while a partial trust application can only create files in isolated storage. If the code to create a file exists in an assembly that is shared by both full trust (standalone) applications and partial trust (browser-hosted) applications, and both applications want users to be able to create files, the shared code should detect whether it is running in partial or full trust before creating a file in the appropriate location. The following code demonstrates both. Imports System.IO ' File, FileStream, StreamWriter Imports System.IO.IsolatedStorage ' IsolatedStorageFile Imports System.Security ' CodeAccesPermission Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess Imports System.Windows ' MessageBox Namespace SDKSample Public Class FileHandlingGraceful Public Sub Save() If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then ' Write to local disk Using stream As FileStream =tênthietbi:<hailuu(GT-19195)>phienban.android<4.4.2>capdovaloibaomat<2016-05-01>phienban.baseband<19195xxscQA3> File.Create("c:\newfile.txt") Using writer As New StreamWriter(stream) writer.WriteLine("I can write to local disk.") End Using End Using Else ' Persist application-scope property to ' isolated storage Dim storage As IsolatedStorageFile =phien.kernel<3.4.0-8086469>#¿¿¿¿¿#(#DPI@SWHC3707#1)¿¿¿¿¿WE¿JAN<4 20:32:33 KST2017¿¿¿¿¿>#sohieubantao#¿<kot49h.19195xxscQA3¿¿¿¿>#<trangthai.SE.cho"ANDROID"ENFORCING¿¿¿¿¿#<Sepf-9T-19195-4.4.2-0054>#¿¿¿¿¿-web¿an#<04 20:31:30 2017>¿¿¿¿¿#secureboo¿¿¿atus<¿#"type:SAMSUNG"¿¿¿¿¿#>| <?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US"> <id>tag:github.com,2008:/Hailuu3333</id> <link type="text/html" rel="alternate" href="https://github.com/Hailuu3333"/> <link type="application/atom+xml" rel="self" href="https://github.com/Hailuu3333.private.atom?token=AWURDBH7ASDDKL3TWM5OQS57363BS"/> <title>Private Feed for Hailuu3333</title> <updated>2022-01-03T17:58:47Z</updated> <entry> <id>tag:github.com,2008:PushEvent/19562318704</id> <published>2022-01-03T17:58:47Z</published> <updated>2022-01-03T17:58:47Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/e746e8910e...5e157d1ff0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:58:47Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/5e157d1ff014dcb8f80f421cdd001bdec6fba990" rel="noreferrer">5e157d1</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for PerformanceResourceTiming API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090544464" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14304" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14304/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14304" rel="noreferrer">#14304</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562301951</id> <published>2022-01-03T17:57:13Z</published> <updated>2022-01-03T17:57:13Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/ba5bbe1657...e746e8910e"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:57:13Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/e746e8910e7defdbf34cc9ef0e05965debe30f4f" rel="noreferrer">e746e89</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for PerformanceObserverEntryList API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090457391" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14301" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14301/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14301" rel="noreferrer">#14301</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562295899</id> <published>2022-01-03T17:56:39Z</published> <updated>2022-01-03T17:56:39Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/f52107082e...ba5bbe1657"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:56:39Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/ba5bbe16577941c22b7e69856f1dcfacbb5a3328" rel="noreferrer">ba5bbe1</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for PerformanceMeasure API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090448000" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14299" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14299/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14299" rel="noreferrer">#14299</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562286119</id> <published>2022-01-03T17:55:43Z</published> <updated>2022-01-03T17:55:43Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/04b6bd0c15...f52107082e"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:55:43Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/f52107082e4f9ef8ac6e98b3f7dfd2795309d824" rel="noreferrer">f521070</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for PerformanceMark API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090446499" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14298" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14298/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14298" rel="noreferrer">#14298</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562263337</id> <published>2022-01-03T17:53:34Z</published> <updated>2022-01-03T17:53:34Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/75674de739...04b6bd0c15"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:53:34Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/04b6bd0c157e737639b1ae7f94f30fa2168effa3" rel="noreferrer">04b6bd0</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for PerformanceEventTiming API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090443593" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14296" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14296/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14296" rel="noreferrer">#14296</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562241843</id> <published>2022-01-03T17:51:36Z</published> <updated>2022-01-03T17:51:36Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/29a6974a75...75674de739"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:51:36Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/75674de739775f3dd4cddef82d09b98c9a058cf9" rel="noreferrer">75674de</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for api.PerformanceEventTiming.toJSON (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090445235" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14297" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14297/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14297" rel="noreferrer">#14297</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562237548</id> <published>2022-01-03T17:51:13Z</published> <updated>2022-01-03T17:51:13Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/bf39eba737...29a6974a75"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:51:13Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/29a6974a75547ca3bac6b24878bb0967c864f41a" rel="noreferrer">29a6974</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for api.OffscreenCanvasRenderingContext2D.can… </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562232818</id> <published>2022-01-03T17:50:48Z</published> <updated>2022-01-03T17:50:48Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/3eeeac9f61...bf39eba737"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:50:48Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/bf39eba7371b943fbe862dff0af4d0406729f94f" rel="noreferrer">bf39eba</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for OTPCredential API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090403975" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14290" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14290/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14290" rel="noreferrer">#14290</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562188285</id> <published>2022-01-03T17:46:40Z</published> <updated>2022-01-03T17:46:40Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/4bff6425fa...3eeeac9f61"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:46:40Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/3eeeac9f61d756098fe70aeb24f502e6017750f4" rel="noreferrer">3eeeac9</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for CanvasPattern API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089195844" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14202" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14202/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14202" rel="noreferrer">#14202</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561882855</id> <published>2022-01-03T17:19:44Z</published> <updated>2022-01-03T17:19:44Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/a74e1ff439...4bff6425fa"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:19:44Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/4bff6425faac6cbb58b15fc609993d960edd6827" rel="noreferrer">4bff642</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for NDEF APIs (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090332102" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14283" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14283/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14283" rel="noreferrer">#14283</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561829380</id> <published>2022-01-03T17:15:22Z</published> <updated>2022-01-03T17:15:22Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/edf64e0c97...a74e1ff439"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:15:22Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/a74e1ff4395fb92a0844164f5463d64632e7c2ca" rel="noreferrer">a74e1ff</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for MessageChannel API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090079194" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14272" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14272/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14272" rel="noreferrer">#14272</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561819576</id> <published>2022-01-03T17:14:35Z</published> <updated>2022-01-03T17:14:35Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/ebbed37e94...edf64e0c97"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:14:35Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/edf64e0c97fdfae1dc818946f8227ab94724d056" rel="noreferrer">edf64e0</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for api.MediaStreamAudioSourceNode.me… </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561801160</id> <published>2022-01-03T17:13:04Z</published> <updated>2022-01-03T17:13:04Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/20fa4010c1...ebbed37e94"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:13:04Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/ebbed37e948956bcbc9022f49ef6f33abca74e46" rel="noreferrer">ebbed37</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for MediaKeyMessageEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090075095" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14268" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14268/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14268" rel="noreferrer">#14268</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561788980</id> <published>2022-01-03T17:12:05Z</published> <updated>2022-01-03T17:12:05Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/d9a8229dc0...20fa4010c1"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:12:05Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/20fa4010c12cd5a0e74b1eb8cbea4d3afd89f264" rel="noreferrer">20fa401</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for api.MediaElementAudioSourceNode.m… </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561782081</id> <published>2022-01-03T17:11:33Z</published> <updated>2022-01-03T17:11:33Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/219bae08f0...d9a8229dc0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:11:33Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/d9a8229dc08bed161e100d25ca154375f0333fb3" rel="noreferrer">d9a8229</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for MediaDeviceInfo API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090073619" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14266" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14266/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14266" rel="noreferrer">#14266</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561757800</id> <published>2022-01-03T17:09:36Z</published> <updated>2022-01-03T17:09:36Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/77f4c09ac6...219bae08f0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:09:36Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/219bae08f0ff3917c23d60cfa18d4701d8153d26" rel="noreferrer">219bae0</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Edge versions for KeyframeEffect API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090071498" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14265" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14265/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14265" rel="noreferrer">#14265</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561683563</id> <published>2022-01-03T17:03:51Z</published> <updated>2022-01-03T17:03:51Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/8d3ddcf273...77f4c09ac6"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:03:51Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/77f4c09ac6f380764dc5af24fb460e2d8d2303e4" rel="noreferrer">77f4c09</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for IdleDetector API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089631424" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14258" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14258/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14258" rel="noreferrer">#14258</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561641770</id> <published>2022-01-03T17:00:42Z</published> <updated>2022-01-03T17:00:42Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/43b1c984e3...8d3ddcf273"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:00:42Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/8d3ddcf273becc09f9b9b36139326ca26eee4589" rel="noreferrer">8d3ddcf</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for HTMLQuoteElement API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089623277" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14256" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14256/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14256" rel="noreferrer">#14256</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561618310</id> <published>2022-01-03T16:58:55Z</published> <updated>2022-01-03T16:58:55Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/e0b6775007...43b1c984e3"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:58:55Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/43b1c984e3a15c611b0abc314cc8b0046664d3b5" rel="noreferrer">43b1c98</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for HTMLFormControlsCollection API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089618163" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14253" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14253/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14253" rel="noreferrer">#14253</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561587537</id> <published>2022-01-03T16:56:25Z</published> <updated>2022-01-03T16:56:25Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/69f98959d0...e0b6775007"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:56:25Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/e0b67750076ad0d93393ccb085d1dc54d773253e" rel="noreferrer">e0b6775</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for api.HTMLElement.outerText (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089616978" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14252" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14252/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14252" rel="noreferrer">#14252</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561489898</id> <published>2022-01-03T16:48:36Z</published> <updated>2022-01-03T16:48:36Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/528d168175...69f98959d0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:48:36Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/69f98959d01049d80574d185e8e74b11bacad813" rel="noreferrer">69f9895</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for HTMLCanvasElement API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089594658" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14251" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14251/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14251" rel="noreferrer">#14251</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561478464</id> <published>2022-01-03T16:47:42Z</published> <updated>2022-01-03T16:47:42Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/1c83c46f3b...528d168175"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:47:42Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/528d168175ca12effcb92663441b0bb5dba86c36" rel="noreferrer">528d168</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for GamepadHapticActuator API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089591518" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14250" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14250/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14250" rel="noreferrer">#14250</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561470552</id> <published>2022-01-03T16:47:04Z</published> <updated>2022-01-03T16:47:04Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/8988fadf71...1c83c46f3b"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:47:04Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/1c83c46f3b35669320196ee8ed4c058e6e27f81b" rel="noreferrer">1c83c46</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for FormDataEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089591110" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14249" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14249/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14249" rel="noreferrer">#14249</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561432212</id> <published>2022-01-03T16:44:01Z</published> <updated>2022-01-03T16:44:01Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/aee84e62b4...8988fadf71"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:44:01Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/8988fadf71141dc430fee7270277952475021227" rel="noreferrer">8988fad</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for FormData API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089590697" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14248" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14248/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14248" rel="noreferrer">#14248</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561367603</id> <published>2022-01-03T16:38:51Z</published> <updated>2022-01-03T16:38:51Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/ac60c669b9...aee84e62b4"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:38:51Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/aee84e62b43d1ef88fa59b157870bd2489d6586d" rel="noreferrer">aee84e6</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for api.FetchEvent.handled (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089588080" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14245" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14245/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14245" rel="noreferrer">#14245</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561363029</id> <published>2022-01-03T16:38:29Z</published> <updated>2022-01-03T16:38:29Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/6e0eb31096...ac60c669b9"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:38:29Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/ac60c669b9fd4329e9d466de32b45535970748de" rel="noreferrer">ac60c66</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for FederatedCredential API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089587721" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14244" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14244/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14244" rel="noreferrer">#14244</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561354449</id> <published>2022-01-03T16:37:48Z</published> <updated>2022-01-03T16:37:48Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/625928c8b1...6e0eb31096"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:37:48Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/6e0eb31096b675addd01f2a4c7086881cf77b19e" rel="noreferrer">6e0eb31</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for ExtendableMessageEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089586405" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14243" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14243/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14243" rel="noreferrer">#14243</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561344598</id> <published>2022-01-03T16:37:00Z</published> <updated>2022-01-03T16:37:00Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/5f702b8587...625928c8b1"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:37:00Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/625928c8b125e9d7d4a86fa8c4e87ec3ff3cb69b" rel="noreferrer">625928c</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for ExtendableCookieChangeEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089583771" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14242" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14242/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14242" rel="noreferrer">#14242</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561318915</id> <published>2022-01-03T16:35:01Z</published> <updated>2022-01-03T16:35:01Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/e68f72ae70...5f702b8587"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:35:01Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/5f702b8587e131920441b60a96e28b6b7324efe7" rel="noreferrer">5f702b8</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for api.EventSource.EventSource (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089583044" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14241" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14241/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14241" rel="noreferrer">#14241</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561277837</id> <published>2022-01-03T16:31:50Z</published> <updated>2022-01-03T16:31:50Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/31a42b62de...e68f72ae70"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:31:50Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/e68f72ae70c99bb9c5be7489cce03c6e4d44c8f7" rel="noreferrer">e68f72a</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for Event API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089581729" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14239" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14239/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14239" rel="noreferrer">#14239</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> </feed> IsolatedStorageFile.GetUserStoreForApplication() Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage) Using writer As New StreamWriter(stream) writer.WriteLine("I can write to Isolated Storage") End Using End Using End If End Sub ' Detect whether or not this application has the requested permission Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean Try ' Try and get this permission requestedPermission.Demand() Return True Catch Return False End Try End Function ... End Class End Namespace using System.IO; // File, FileStream, StreamWriter using System.IO.IsolatedStorage; // IsolatedStorageFile using System.Security; // CodeAccesPermission using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess using System.Windows; // MessageBox namespace SDKSample { public class FileHandlingGraceful { public void Save() { if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt"))) { // Write to local disk using (FileStream stream = File.Create(@"c:\newfile.txt")) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("I can write to local disk."); } } else { // Persist application-scope property to // isolated storage IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("I can write to Isolated Storage"); } } } // Detect whether or not this application has the requested permission bool IsPermissionGranted(CodeAccessPermission requestedPermission) { try { // Try and get this permission requestedPermission.Demand(); return true; } catch { return false; } } ... } } In many cases, you should be able to find a partial trust alternative. In a controlled environment, such as an intranet, custom managed frameworks can be installed across the client base into the global assembly cache (GAC). These libraries can execute code that requires full trust, and be referenced from applications that are only allowed partial trust by using AllowPartiallyTrustedCallersAttribute (for more information, see Security (WPF) and WPF Security Strategy - Platform Security). Browser Host Detection Using CAS to check for permissions is a suitable technique when you need to check on a per-permission basis. Although, this technique depends on catching exceptions as a part of normal processing, which is not recommended in general and can have performance issues. Instead, if your XAML browser application (XBAP) only runs within the Internet zone sandbox, you can use the BrowserInteropHelper.IsBrowserHosted property, which returns true for XAML browser applications (XBAPs). Note IsBrowserHosted only distinguishes whether an application is running in a browser, not which set of permissions an application is running with. Managing Permissions By default, XBAPs run with partial trust (default Internet zone permission set). However, depending on the requirements of the application, it is possible to change the set of permissions from the default. For example, if an XBAPs is launched from a local intranet, it can take advantage of an increased permission set, which is shown in the following table. Table 3: LocalIntranet and Internet Permissions Permission Attribute LocalIntranet Internet DNS Access DNS servers Yes No Environment Variables Read Yes No File Dialogs Open Yes Yes File Dialogs Unrestricted Yes No Isolated Storage Assembly isolation by user Yes No Isolated Storage Unknown isolation Yes Yes Isolated Storage Unlimited user quota Yes No Media Safe audio, video, and images Yes Yes Printing Default printing Yes No Printing Safe printing Yes Yes Reflection Emit Yes No Security Managed code execution Yes Yes Security Assert granted permissions Yes No User Interface Unrestricted Yes No User Interface Safe top level windows Yes Yes User Interface Own Clipboard Yes Yes Web Browser Safe frame navigation to HTML Yes Yes Note Cut and Paste is only allowed in partial trust when user initiated. If you need to increase permissions, you need to change the project settings and the ClickOnce application manifest. For more information, see WPF XAML Browser Applications Overview. The following documents may also be helpful. Mage.exe (Manifest Generation and Editing Tool). MageUI.exe (Manifest Generation and Editing Tool, Graphical Client). Securing ClickOnce Applications. If your XBAP requires full trust, you can use the same tools to increase the requested permissions. Although an XBAP will only receive full trust if it is installed on and launched from the local computer, the intranet, or from a URL that is listed in the browser's trusted or allowed sites. If the application is installed from the intranet or a trusted site, the user will receive the standard ClickOnce prompt notifying them of the elevated permissions. The user can choose to continue or cancel the installation. Alternatively, you can use the ClickOnce Trusted Deployment model for full trust deployment from any security zone. For more information, see Trusted Application Deployment Overview and Security (WPF). See Also Concepts Security (WPF) WPF Security Strategy - Platform Security WPF Security Strategy - Security Engineering Theme Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Trademarks © Microsoft 2021
uttkarshparmar50
1-Project Title “Library Management System (L_I_B_R_A)” The “Library Management System” has been developed to override the problems prevailing in the practicing manual system. This software is supported to eliminate and in some cases reduce the hardship faced by this existing system. Moreover this system is designed for the particular need of the institution to carry out operating in a smooth and effective manner. 2-Domain Library management institutional management non-profitable organization. 3-Problem of Statement In our existing system all the transaction of books are done manually, so taking more time for a transaction like borrowing a book or returning a book and also for searching of member and books. Another major disadvantage is that to preparing the list of book borrowed and the available book in the library will take more time, currently it is doing as a day process for verifying all records. So after conducting he feasibility study we decided to make the manual library management system to be computerised. Proposed system is an automated library management system. Through our software user can add member, edit information, borrow and return books in quick time. Some of the problems being faced in faced in manual system are as follows: • Fast report generation is not possible. • Tracing a book is difficult. • Information about issue/return of the books is not properly maintained. • No central database can be created as information is not available in database. All the manual difficulty in managing the Library have been rectified by implementing computerization. This application is reduced as much as possible to avoid errors while entering the data. It also provides error message while entering invalid data. No, formal knowledge is needed for the user to use this system. Thus by this all it is user-friendly. Library Management System as described above can lead error free, secure, reliable and fast management system. It can assist the user to concentrate on other activities rather to concentrate on the record keeping. Thus it will help organisation in better utilization of resources. So that’s why I can choose this topic to make it simple. is a sub-discipline of issues faced by libraries and library management professionals. Library management encompasses normal managerial tasks, as well as intellectual that focuses on specific freedom and fundraising responsibilities. Issues faced in library management frequently overlap with those faced in managing Title: L_I_B_R_A Page 5 of 16 TMU-CCSIT Version 1. 4-Project Description The software to be produced is on Library Management System. A library card will also be provided to the customers who visit daily. A person can also borrow the book for particular days. All the information will be entered in the system. If the person doesn’t return the due book. Admin has the authority to add, delete or modify the details of the book available to/from the system. He also has the authority to provide username and password for the receptionist. He can also add the details of the book purchased from shops along with the shop name. Project plan Requirement Design Process description implementation STATE DIAGRAM : LIBRARIAN OBJECT Title: L_I_B_R_A Page 6 of 16 TMU-CCSIT Version 1. 4.1-Scope of the Work This project is helpful to track all the book and library information and to rate the maximum number of books, the students wished to allot books. The software will be able to handle all the necessary information related to the library. From a librarian perspective, the Library Management System Project enhanced searchable database for the search books, managing library members, issuing and receiving books . • Search Books, Managing Library Members, Issuing and Receiving Books: An enhanced atomized system is developed to maintain Books, Authors, Issuing and Receiving Books and maintain the history of transaction. • To utilize resources in an efficient manner by increasing their productivity through automation. • It satisfies the user requirement. Title: L_I_B_R_A Page 7 of 16 TMU-CCSIT Version 1. 4.2-Project Modules • Books: This module consist the details of the books available in library and their categories. Title: L_I_B_R_A Page 8 of 16 TMU-CCSIT Version 1. • Member Account details To issue an book from the library, one should have a account in the library. The registration contains all the details about the member like registration number, name, address, contact number etc.. • Book Request: This module is used by the member to request a book from the library. The search can be performed by using name of the book, author name, and subject name. Title: L_I_B_R_A Page 9 of 16 TMU-CCSIT Version 1. • Issue of books: This module is used by the librarian to issue a book based on the request made by the members. • Returning Books: In this module the librarian maintains the details of the books returned by the member, which also includes the fine details, damage book details, lost book details. • History: In this module the member can view the details about the previous issued books, requested books and returned books etc. • Reports: This module includes the details about the issued books, returned books, member reports, fine reports, or any damage to the book or details of the book which are not returned. Title: L_I_B_R_A Page 10 of 16 TMU-CCSIT Version 1. 5-Implementation Methodology In this I am trying to give an Idea of “How I can implement the library management system” . FUNCTIONAL DECOMPOSITION OF LIBRARY MANAGEMENT SYSTEM CLASS DIAGRAM OF LIBRARY MANAGEMENT SYSTEM Title: L_I_B_R_A Page 11 of 16 TMU-CCSIT Version 1. DFD OF LIBRARY MANAGEMENT SYSTEM ER DIAGRAM OF LIBRARY MANAGEMENT SYSYTEM Title: L_I_B_R_A Page 12 of 16 TMU-CCSIT Version 1. DATABASE OF LIBRARY MANAGEMENT SYSTEM Title: L_I_B_R_A Page 13 of 16 TMU-CCSIT Version 1. 6-Technologies to be used 6.1 -Software Platform a) Front-end ----python (3.8) ----tk-inter (GUI) b) Back-end -----sqlite (database) 6.2 -Hardware Platform RAM — 8 GB Hard Disk — not used OS — Mac OS (Mojave-10.14.6) Editor — idle (Available with python package) Processor — 1.8 GHz intel core i5 6.3 -Tools No tool used. 7-Advantages of this Project Our proposed system has the following advantages. User friendly interface Fast access to database Less error More storage capacity Search facility Look and feel environment Quick transaction 8-Future Scope and further enhancement of the Project o In future we can make this application online so that members will be able to search the book from any places as well as can send book request. o Book reading facility can be provided through on-line. o In the area of data security and system security. o Provide more online tips and help. o Implementation of ISBN BAR code reader Title: L_I_B_R_A Page 14 of 16 TMU-CCSIT Version 1. 9-Project Repository Location S# Project Artifacts (softcopy) Location Verified by Project Guide Verified by Lab In-Charge 1. Project Synopsis Report (Final Version) https://s.docworkspace.com/d/AEsSC- 7eqLpR6Z6S_OSdFA Tushar mehrotra Name and Signature 2. Project Progress updates Name and Signature Name and Signature 3. Project Requirement specifications Name and Signature Name and Signature 4. Project Report (Final Version) Name and Signature Name and Signature 5. Test Repository Name and Signature Name and Signature 6. Any other document, give details Name and Signature Name and Signature 10-Team Details Project Name Course Name Student ID Student Name Role Signature LIBRARY MANAGEMENT SYSTEM INDUSTRIAL TRAINING(PYTHON) (ECS 509) TCA1809026 UTTKARSH PARMAR Developer 11-Conclusion “Library Management System” allows the user to store the book details and the customer details. This software package allows storing the details of all the data related to library. The system is strong enough to withstand regressive yearly operations under conditions where the Title: L_I_B_R_A Page 15 of 16 TMU-CCSIT Version 1. database is maintained and cleared over a certain time of span. The implementation of the system in the organization will considerably reduce data entry, time and also provide readily calculated reports. 12-References • Website http://www.wikipedia.com http://www.sololearn.com And also my mentor from Ducat (Noida) • Book Python-basic-handbook ( writer- vivek Krishnamoorthy, jay Parmar, mario pisa pena)
anujkumarthakur
Introduction Note: This edition of the book is the same as The Rust Programming Language available in print and ebook format from No Starch Press. Welcome to The Rust Programming Language, an introductory book about Rust. The Rust programming language helps you write faster, more reliable software. High-level ergonomics and low-level control are often at odds in programming language design; Rust challenges that conflict. Through balancing powerful technical capacity and a great developer experience, Rust gives you the option to control low-level details (such as memory usage) without all the hassle traditionally associated with such control. Who Rust Is For Rust is ideal for many people for a variety of reasons. Let’s look at a few of the most important groups. Teams of Developers Rust is proving to be a productive tool for collaborating among large teams of developers with varying levels of systems programming knowledge. Low-level code is prone to a variety of subtle bugs, which in most other languages can be caught only through extensive testing and careful code review by experienced developers. In Rust, the compiler plays a gatekeeper role by refusing to compile code with these elusive bugs, including concurrency bugs. By working alongside the compiler, the team can spend their time focusing on the program’s logic rather than chasing down bugs. Rust also brings contemporary developer tools to the systems programming world: Cargo, the included dependency manager and build tool, makes adding, compiling, and managing dependencies painless and consistent across the Rust ecosystem. Rustfmt ensures a consistent coding style across developers. The Rust Language Server powers Integrated Development Environment (IDE) integration for code completion and inline error messages. By using these and other tools in the Rust ecosystem, developers can be productive while writing systems-level code. Students Rust is for students and those who are interested in learning about systems concepts. Using Rust, many people have learned about topics like operating systems development. The community is very welcoming and happy to answer student questions. Through efforts such as this book, the Rust teams want to make systems concepts more accessible to more people, especially those new to programming. Companies Hundreds of companies, large and small, use Rust in production for a variety of tasks. Those tasks include command line tools, web services, DevOps tooling, embedded devices, audio and video analysis and transcoding, cryptocurrencies, bioinformatics, search engines, Internet of Things applications, machine learning, and even major parts of the Firefox web browser. Open Source Developers Rust is for people who want to build the Rust programming language, community, developer tools, and libraries. We’d love to have you contribute to the Rust language. People Who Value Speed and Stability Rust is for people who crave speed and stability in a language. By speed, we mean the speed of the programs that you can create with Rust and the speed at which Rust lets you write them. The Rust compiler’s checks ensure stability through feature additions and refactoring. This is in contrast to the brittle legacy code in languages without these checks, which developers are often afraid to modify. By striving for zero-cost abstractions, higher-level features that compile to lower-level code as fast as code written manually, Rust endeavors to make safe code be fast code as well. The Rust language hopes to support many other users as well; those mentioned here are merely some of the biggest stakeholders. Overall, Rust’s greatest ambition is to eliminate the trade-offs that programmers have accepted for decades by providing safety and productivity, speed and ergonomics. Give Rust a try and see if its choices work for you. Who This Book Is For This book assumes that you’ve written code in another programming language but doesn’t make any assumptions about which one. We’ve tried to make the material broadly accessible to those from a wide variety of programming backgrounds. We don’t spend a lot of time talking about what programming is or how to think about it. If you’re entirely new to programming, you would be better served by reading a book that specifically provides an introduction to programming. How to Use This Book In general, this book assumes that you’re reading it in sequence from front to back. Later chapters build on concepts in earlier chapters, and earlier chapters might not delve into details on a topic; we typically revisit the topic in a later chapter. You’ll find two kinds of chapters in this book: concept chapters and project chapters. In concept chapters, you’ll learn about an aspect of Rust. In project chapters, we’ll build small programs together, applying what you’ve learned so far. Chapters 2, 12, and 20 are project chapters; the rest are concept chapters. Chapter 1 explains how to install Rust, how to write a Hello, world! program, and how to use Cargo, Rust’s package manager and build tool. Chapter 2 is a hands-on introduction to the Rust language. Here we cover concepts at a high level, and later chapters will provide additional detail. If you want to get your hands dirty right away, Chapter 2 is the place for that. At first, you might even want to skip Chapter 3, which covers Rust features similar to those of other programming languages, and head straight to Chapter 4 to learn about Rust’s ownership system. However, if you’re a particularly meticulous learner who prefers to learn every detail before moving on to the next, you might want to skip Chapter 2 and go straight to Chapter 3, returning to Chapter 2 when you’d like to work on a project applying the details you’ve learned. Chapter 5 discusses structs and methods, and Chapter 6 covers enums, match expressions, and the if let control flow construct. You’ll use structs and enums to make custom types in Rust. In Chapter 7, you’ll learn about Rust’s module system and about privacy rules for organizing your code and its public Application Programming Interface (API). Chapter 8 discusses some common collection data structures that the standard library provides, such as vectors, strings, and hash maps. Chapter 9 explores Rust’s error-handling philosophy and techniques. Chapter 10 digs into generics, traits, and lifetimes, which give you the power to define code that applies to multiple types. Chapter 11 is all about testing, which even with Rust’s safety guarantees is necessary to ensure your program’s logic is correct. In Chapter 12, we’ll build our own implementation of a subset of functionality from the grep command line tool that searches for text within files. For this, we’ll use many of the concepts we discussed in the previous chapters. Chapter 13 explores closures and iterators: features of Rust that come from functional programming languages. In Chapter 14, we’ll examine Cargo in more depth and talk about best practices for sharing your libraries with others. Chapter 15 discusses smart pointers that the standard library provides and the traits that enable their functionality. In Chapter 16, we’ll walk through different models of concurrent programming and talk about how Rust helps you to program in multiple threads fearlessly. Chapter 17 looks at how Rust idioms compare to object-oriented programming principles you might be familiar with. Chapter 18 is a reference on patterns and pattern matching, which are powerful ways of expressing ideas throughout Rust programs. Chapter 19 contains a smorgasbord of advanced topics of interest, including unsafe Rust, macros, and more about lifetimes, traits, types, functions, and closures. In Chapter 20, we’ll complete a project in which we’ll implement a low-level multithreaded web server! Finally, some appendixes contain useful information about the language in a more reference-like format. Appendix A covers Rust’s keywords, Appendix B covers Rust’s operators and symbols, Appendix C covers derivable traits provided by the standard library, Appendix D covers some useful development tools, and Appendix E explains Rust editions. There is no wrong way to read this book: if you want to skip ahead, go for it! You might have to jump back to earlier chapters if you experience any confusion. But do whatever works for you. An important part of the process of learning Rust is learning how to read the error messages the compiler displays: these will guide you toward working code. As such, we’ll provide many examples that don’t compile along with the error message the compiler will show you in each situation. Know that if you enter and run a random example, it may not compile! Make sure you read the surrounding text to see whether the example you’re trying to run is meant to error. Ferris will also help you distinguish code that isn’t meant to work:
mojihack
Telegram messenger CLI Build Status Command-line interface for Telegram. Uses readline interface. API, Protocol documentation Documentation for Telegram API is available here: http://core.telegram.org/api Documentation for MTproto protocol is available here: http://core.telegram.org/mtproto Upgrading to version 1.0 First of all, the binary is now in ./bin folder and is named telegram-cli. So be careful, not to use old binary. Second, config folder is now ${HOME}/.telegram-cli Third, database is not compatible with older versions, so you'll have to login again. Fourth, in peer_name '#' are substitued to '@'. (Not applied to appending of '#%d' in case of two peers having same name). Installation Clone GitHub Repository git clone --recursive https://github.com/vysheng/tg.git && cd tg Python Support Python support is currently limited to Python 2.7 or Python 3.1+. Other versions may work but are not tested. Linux and BSDs Install libs: readline, openssl and (if you want to use config) libconfig, liblua, python and libjansson. If you do not want to use them pass options --disable-libconfig, --disable-liblua, --disable-python and --disable-json respectively. On Ubuntu/Debian use: sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make On gentoo: sudo emerge -av sys-libs/readline dev-libs/libconfig dev-libs/openssl dev-lang/lua dev-libs/libevent dev-libs/jansson dev-lang/python On Fedora: sudo dnf install lua-devel openssl-devel libconfig-devel readline-devel libevent-devel libjansson-devel python-devel On Archlinux: yaourt -S telegram-cli-git On FreeBSD: pkg install libconfig libexecinfo lua52 python On OpenBSD: pkg_add libconfig libexecinfo lua python On openSUSE: sudo zypper in lua-devel libconfig-devel readline-devel libevent-devel libjansson-devel python-devel libopenssl-devel Then, ./configure make Other methods to install on linux On Gentoo: use ebuild provided. On Arch: https://aur.archlinux.org/packages/telegram-cli-git Mac OS X The client depends on readline library and libconfig, which are not included in OS X by default. You have to install these libraries manually. If using Homebrew: brew install libconfig readline lua python libevent jansson export CFLAGS="-I/usr/local/include -I/usr/local/Cellar/readline/6.3.8/include" export LDFLAGS="-L/usr/local/lib -L/usr/local/Cellar/readline/6.3.8/lib" ./configure && make Thanks to @jfontan for this solution. If using MacPorts: sudo port install libconfig-hr sudo port install readline sudo port install lua51 sudo port install python34 sudo port install libevent export CFLAGS="-I/usr/local/include -I/opt/local/include -I/opt/local/include/lua-5.1" export LDFLAGS="-L/usr/local/lib -L/opt/local/lib -L/opt/local/lib/lua-5.1" ./configure && make Install these ports: devel/libconfig devel/libexecinfo lang/lua52 Then build: env CC=clang CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib LUA=/usr/local/bin/lua52 LUA_INCLUDE=-I/usr/local/include/lua52 LUA_LIB=-llua-5.2 ./configure make Other UNIX If you manage to launch it on other UNIX, please let me know. Contacts If you would like to ask a question, you can write to my telegram or to the github (or both). To contact me via telegram, you should use import_card method with argument 000653bf:0738ca5d:5521fbac:29246815:a27d0cda Usage bin/telegram-cli -k <public-server-key> By default, the public key is stored in tg-server.pub in the same folder or in /etc/telegram-cli/server.pub. If not, specify where to find it: bin/telegram-cli -k tg-server.pub Client support TAB completion and command history. Peer refers to the name of the contact or dialog and can be accessed by TAB completion. For user contacts peer name is Name Lastname with all spaces changed to underscores. For chats it is it's title with all spaces changed to underscores For encrypted chats it is <Exсlamation mark> Name Lastname with all spaces changed to underscores. If two or more peers have same name, number is appended to the name. (for example A_B, A_B#1, A_B#2 and so on) Supported commands Messaging msg <peer> Text - sends message to this peer fwd <user> <msg-seqno> - forward message to user. You can see message numbers starting client with -N chat_with_peer <peer> starts one on one chat session with this peer. /exit or /quit to end this mode. add_contact <phone-number> <first-name> <last-name> - tries to add contact to contact-list by phone rename_contact <user> <first-name> <last-name> - tries to rename contact. If you have another device it will be a fight mark_read <peer> - mark read all received messages with peer delete_msg <msg-seqno> - deletes message (not completly, though) restore_msg <msg-seqno> - restores delete message. Impossible for secret chats. Only possible short time (one hour, I think) after deletion Multimedia send_photo <peer> <photo-file-name> - sends photo to peer send_video <peer> <video-file-name> - sends video to peer send_text <peer> <text-file-name> - sends text file as plain messages load_photo/load_video/load_video_thumb/load_audio/load_document/load_document_thumb <msg-seqno> - loads photo/video/audio/document to download dir view_photo/view_video/view_video_thumb/view_audio/view_document/view_document_thumb <msg-seqno> - loads photo/video to download dir and starts system default viewer fwd_media <msg-seqno> send media in your message. Use this to prevent sharing info about author of media (though, it is possible to determine user_id from media itself, it is not possible get access_hash of this user) set_profile_photo <photo-file-name> - sets userpic. Photo should be square, or server will cut biggest central square part Group chat options chat_info <chat> - prints info about chat chat_add_user <chat> <user> - add user to chat chat_del_user <chat> <user> - remove user from chat rename_chat <chat> <new-name> create_group_chat <chat topic> <user1> <user2> <user3> ... - creates a groupchat with users, use chat_add_user to add more users chat_set_photo <chat> <photo-file-name> - sets group chat photo. Same limits as for profile photos. Search search <peer> pattern - searches pattern in messages with peer global_search pattern - searches pattern in all messages Secret chat create_secret_chat <user> - creates secret chat with this user visualize_key <secret_chat> - prints visualization of encryption key. You should compare it to your partner's one set_ttl <secret_chat> <ttl> - sets ttl to secret chat. Though client does ignore it, client on other end can make use of it accept_secret_chat <secret_chat> - manually accept secret chat (only useful when starting with -E key) Stats and various info user_info <user> - prints info about user history <peer> [limit] - prints history (and marks it as read). Default limit = 40 dialog_list - prints info about your dialogs contact_list - prints info about users in your contact list suggested_contacts - print info about contacts, you have max common friends stats - just for debugging show_license - prints contents of GPLv2 help - prints this help get_self - get our user info Card export_card - print your 'card' that anyone can later use to import your contact import_card <card> - gets user by card. You can write messages to him after that. Other quit - quit safe_quit - wait for all queries to end then quit
GroupAYECS765P
BDP 05: CLUSTERING OF LARGE UNLABELED DATASETS OVERVIEW Real world data is frequently unlabeled and can seem completely random. In these sort of situations, unsupervised learning techniques are a great way to find underlying patterns. This project looks at one such algorithm, KMeans clustering, which searches for boundaries separating groups of points based on their differences in some features. The goal of the project is to implement an unsupervised clustering algorithm using a distributed computing platform. You will implement this algorithm on the stack overflow user base to find different ways the community can be divided, and investigate what causes these groupings. The clustering algorithm must be designed in a way that is appropriate for data intensive parallel computing frameworks. Spark would be the primary choice for this project, but it could also be implemented in Hadoop MapReduce. Algorithm implementations from external libraries such as Spark MLib may not be utilised; the code must be original from the students. However, once the algorithm is completed, a comparison between your own results and that generated by MLlib could be interesting and aid your investigation. Stack Overflow is the main dataset for this project, but alternative datasets can be adopted after consultation with the module organiser. Additionally, different clustering algorithms may be utilised, but this must be discussed and approved y the module organiser. DATASET The project will use the Stack Overflow dataset. This dataset is located in HDFS at /data/stackoverflow The dataset for StackOverflow is a set of files containing Posts, Users, Votes, Comments, PostHistory and PostLinks. Each file contains one XML record per line. For complete schema information: Click here In order to define the clustering use case, you must define what should be the features of each post that will be used to cluster the data. Have a look at the different fields to define your use case. ALGORITHM The project will implement the k-means algorithm for clustering. This algorithm iteratively recomputes the location of k centroids (k is the number of clusters, defined beforehand), that aim to classify the data. Points are labelled to the closest centroid, with each iteration updating the centroids location based on all the points labelled with that value. Spark and Map/Reduce can be utilised for implementing this problem. Spark is recommended for this task, due to its performance benefits in . However, note that the MLib extension of Spark is not allowed to be used as the primary implementation. The group must code its own original implementation of the algorithm. However, it is possible to also use the mllib implementation, in order to evaluate the results from each clustering implementation. Report Contents Brief literature survey on clustering algorithms, including the challenges on implementing them at scale for parallel frameworks. The report should then justify the chosen algorithm (if changed) and the implementation. Definition of the project use case, where the implemented project will be part of the solution. Implementation in MapReduce or Spark of a clustering algorithm(KMeans). Must take into account the potential enormous size of the dataset, and develop sensible code that will scale and efficiently use additional computing nodes. The code will also need to potentially convert the dataset from its storage format to an in-memory representation. Source code should not be included in the report. However, the algorithms should be explained in the report. Results section. Adequate figures and tables should be used to present the results. The effectiveness of the algorithm should also be shown, including performance indications. Not really sure if this can be done for clustering. Critical evaluation of the results should be provided. Experiments demonstrating the technique can successfully group users in the dataset. Representation of the results, and discussion of the findings in a critical manner. ASSESSMENT The project according to the specification has a base difficulty of 85/100. This means that a perfect implementation and report would get a 85. Additional technical features and experimentation would raise the difficulty in order to opt for a full 100/100 mark. Report presentation: 20% Appropriate motivation for the work. Lack of typos/grammar errors, adequate format. Clear flow and style. Related work section including adequate referencing. Technical merit: 50% Completeness of the implementation. [25%] Provided source code. Code is documented. [10%] Design rationale of the code is provided. [10%] Efficient, and appropriate implementation for the chosen platform. [5%] Results/Analysis: 30% Experiments have been carried out on the full dataset. [10%] Adequate plots/tables are provided, with captions. [10%] Results are not only presented but discussed appropriately. [10%] Additional project goals: Implementation of additional functions beyond the base specification can raise the base mark up to 100. A non-exhaustive list of expansion ideas include: Exploration and discussion of hyperparameter tuning (e.g. the number of k groups to cluster the data into) [up to 10 marks] Comparative evaluation of clustering technique with existing implementations (e.g. mllib) [up to 10 marks] Bringing in additional datasets from stackoverflow, such as user badges, to aid in clustering [up to 5 marks] Cluster additional datasets (such as posts) [up to 10 marks] LEAD DEMONSTRATOR For specific queries related to this coursework topic, please liaise with Mr/Ms TBD, who will be the lead demonstrator for this project, as well as with the module organiser. SUBMISSION GUIDELINES The report will have a maximum length of 8 pages, not counting cover page and table of contents. The report must include motivation of the problem, brief literature survey, explanation of the selected technique, implementation details and discussion of the obtained results, and references used in the work. Additionally, the source code must be included as a separate compressed file in the submission.
haseebalam
software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. '''A library that provides a Python interface to the Twitter API''' import base64 import calendar import datetime import httplib import os import rfc822 import sys import tempfile import textwrap import time import calendar import urllib import urllib2 import urlparse import gzip import StringIO try: # Python >= 2.6 import json as simplejson except ImportError: try: # Python < 2.6 import simplejson except ImportError: try: # Google App Engine from django.utils import simplejson except ImportError: raise ImportError, "Unable to load a json library" # parse_qsl moved to urlparse module in v2.6 try: from urlparse import parse_qsl, parse_qs except ImportError: from cgi import parse_qsl, parse_qs try: from hashlib import md5 except ImportError: from md5 import md5 import oauth2 as oauth CHARACTER_LIMIT = 140 # A singleton representing a lazily instantiated FileCache. DEFAULT_CACHE = object() REQUEST_TOKEN_URL = 'https://api.twitter.com/oauth/request_token' ACCESS_TOKEN_URL = 'https://api.twitter.com/oauth/access_token' AUTHORIZATION_URL = 'https://api.twitter.com/oauth/authorize' SIGNIN_URL = 'https://api.twitter.com/oauth/authenticate' class TwitterError(Exception): '''Base class for Twitter errors''' @property def message(self): '''Returns the first argument used to construct this error.''' return self.args[0] class Status(object): '''A class representing the Status structure used by the twitter API. The Status structure exposes the following properties: status.created_at status.created_at_in_seconds # read only status.favorited status.in_reply_to_screen_name status.in_reply_to_user_id status.in_reply_to_status_id status.truncated status.source status.id status.text status.location status.relative_created_at # read only status.user status.urls status.user_mentions status.hashtags status.geo status.place status.coordinates status.contributors ''' def __init__(self, created_at=None, favorited=None, id=None, text=None, location=None, user=None, in_reply_to_screen_name=None, in_reply_to_user_id=None, in_reply_to_status_id=None, truncated=None, source=None, now=None, urls=None, user_mentions=None, hashtags=None, geo=None, place=None, coordinates=None, contributors=None, retweeted=None, retweeted_status=None, retweet_count=None): '''An object to hold a Twitter status message. This class is normally instantiated by the twitter.Api class and returned in a sequence. Note: Dates are posted in the form "Sat Jan 27 04:17:38 +0000 2007" Args: created_at: The time this status message was posted. [Optional] favorited: Whether this is a favorite of the authenticated user. [Optional] id: The unique id of this status message. [Optional] text: The text of this status message. [Optional] location: the geolocation string associated with this message. [Optional] relative_created_at: A human readable string representing the posting time. [Optional] user: A twitter.User instance representing the person posting the message. [Optional] now: The current time, if the client choses to set it. Defaults to the wall clock time. [Optional] urls: user_mentions: hashtags: geo: place: coordinates: contributors: retweeted: retweeted_status: retweet_count: ''' self.created_at = created_at self.favorited = favorited self.id = id self.text = text self.location = location self.user = user self.now = now self.in_reply_to_screen_name = in_reply_to_screen_name self.in_reply_to_user_id = in_reply_to_user_id self.in_reply_to_status_id = in_reply_to_status_id self.truncated = truncated self.retweeted = retweeted self.source = source self.urls = urls self.user_mentions = user_mentions self.hashtags = hashtags self.geo = geo self.place = place self.coordinates = coordinates self.contributors = contributors self.retweeted_status = retweeted_status self.retweet_count = retweet_count def GetCreatedAt(self): '''Get the time this status message was posted. Returns: The time this status message was posted ''' return self._created_at def SetCreatedAt(self, created_at): '''Set the time this status message was posted. Args: created_at: The time this status message was created ''' self._created_at = created_at created_at = property(GetCreatedAt, SetCreatedAt, doc='The time this status message was posted.') def GetCreatedAtInSeconds(self): '''Get the time this status message was posted, in seconds since the epoch. Returns: The time this status message was posted, in seconds since the epoch. ''' return calendar.timegm(rfc822.parsedate(self.created_at)) created_at_in_seconds = property(GetCreatedAtInSeconds, doc="The time this status message was " "posted, in seconds since the epoch") def GetFavorited(self): '''Get the favorited setting of this status message. Returns: True if this status message is favorited; False otherwise ''' return self._favorited def SetFavorited(self, favorited): '''Set the favorited state of this status message. Args: favorited: boolean True/False favorited state of this status message ''' self._favorited = favorited favorited = property(GetFavorited, SetFavorited, doc='The favorited state of this status message.') def GetId(self): '''Get the unique id of this status message. Returns: The unique id of this status message ''' return self._id def SetId(self, id): '''Set the unique id of this status message. Args: id: The unique id of this status message ''' self._id = id id = property(GetId, SetId, doc='The unique id of this status message.') def GetInReplyToScreenName(self): return self._in_reply_to_screen_name def SetInReplyToScreenName(self, in_reply_to_screen_name): self._in_reply_to_screen_name = in_reply_to_screen_name in_reply_to_screen_name = property(GetInReplyToScreenName, SetInReplyToScreenName, doc='') def GetInReplyToUserId(self): return self._in_reply_to_user_id def SetInReplyToUserId(self, in_reply_to_user_id): self._in_reply_to_user_id = in_reply_to_user_id in_reply_to_user_id = property(GetInReplyToUserId, SetInReplyToUserId, doc='') def GetInReplyToStatusId(self): return self._in_reply_to_status_id def SetInReplyToStatusId(self, in_reply_to_status_id): self._in_reply_to_status_id = in_reply_to_status_id in_reply_to_status_id = property(GetInReplyToStatusId, SetInReplyToStatusId, doc='') def GetTruncated(self): return self._truncated def SetTruncated(self, truncated): self._truncated = truncated truncated = property(GetTruncated, SetTruncated, doc='') def GetRetweeted(self): return self._retweeted def SetRetweeted(self, retweeted): self._retweeted = retweeted retweeted = property(GetRetweeted, SetRetweeted, doc='') def GetSource(self): return self._source def SetSource(self, source): self._source = source source = property(GetSource, SetSource, doc='') def GetText(self): '''Get the text of this status message. Returns: The text of this status message. ''' return self._text def SetText(self, text): '''Set the text of this status message. Args: text: The text of this status message ''' self._text = text text = property(GetText, SetText, doc='The text of this status message') def GetLocation(self): '''Get the geolocation associated with this status message Returns: The geolocation string of this status message. ''' return self._location def SetLocation(self, location): '''Set the geolocation associated with this status message Args: location: The geolocation string of this status message ''' self._location = location location = property(GetLocation, SetLocation, doc='The geolocation string of this status message') def GetRelativeCreatedAt(self): '''Get a human redable string representing the posting time Returns: A human readable string representing the posting time ''' fudge = 1.25 delta = long(self.now) - long(self.created_at_in_seconds) if delta < (1 * fudge): return 'about a second ago' elif delta < (60 * (1/fudge)): return 'about %d seconds ago' % (delta) elif delta < (60 * fudge): return 'about a minute ago' elif delta < (60 * 60 * (1/fudge)): return 'about %d minutes ago' % (delta / 60) elif delta < (60 * 60 * fudge) or delta / (60 * 60) == 1: return 'about an hour ago' elif delta < (60 * 60 * 24 * (1/fudge)): return 'about %d hours ago' % (delta / (60 * 60)) elif delta < (60 * 60 * 24 * fudge) or delta / (60 * 60 * 24) == 1: return 'about a day ago' else: return 'about %d days ago' % (delta / (60 * 60 * 24)) relative_created_at = property(GetRelativeCreatedAt, doc='Get a human readable string representing ' 'the posting time') def GetUser(self): '''Get a twitter.User reprenting the entity posting this status message. Returns: A twitter.User reprenting the entity posting this status message ''' return self._user def SetUser(self, user): '''Set a twitter.User reprenting the entity posting this status message. Args: user: A twitter.User reprenting the entity posting this status message ''' self._user = user user = property(GetUser, SetUser, doc='A twitter.User reprenting the entity posting this ' 'status message') def GetNow(self): '''Get the wallclock time for this status message. Used to calculate relative_created_at. Defaults to the time the object was instantiated. Returns: Whatever the status instance believes the current time to be, in seconds since the epoch. ''' if self._now is None: self._now = time.time() return self._now def SetNow(self, now): '''Set the wallclock time for this status message. Used to calculate relative_created_at. Defaults to the time the object was instantiated. Args: now: The wallclock time for this instance. ''' self._now = now now = property(GetNow, SetNow, doc='The wallclock time for this status instance.') def GetGeo(self): return self._geo def SetGeo(self, geo): self._geo = geo geo = property(GetGeo, SetGeo, doc='') def GetPlace(self): return self._place def SetPlace(self, place): self._place = place place = property(GetPlace, SetPlace, doc='') def GetCoordinates(self): return self._coordinates def SetCoordinates(self, coordinates): self._coordinates = coordinates coordinates = property(GetCoordinates, SetCoordinates, doc='') def GetContributors(self): return self._contributors def SetContributors(self, contributors): self._contributors = contributors contributors = property(GetContributors, SetContributors, doc='') def GetRetweeted_status(self): return self._retweeted_status def SetRetweeted_status(self, retweeted_status): self._retweeted_status = retweeted_status retweeted_status = property(GetRetweeted_status, SetRetweeted_status, doc='') def GetRetweetCount(self): return self._retweet_count def SetRetweetCount(self, retweet_count): self._retweet_count = retweet_count retweet_count = property(GetRetweetCount, SetRetweetCount, doc='') def __ne__(self, other): return not self.__eq__(other) def __eq__(self, other): try: return other and \ self.created_at == other.created_at and \ self.id == other.id and \ self.text == other.text and \ self.location == other.location and \ self.user == other.user and \ self.in_reply_to_screen_name == other.in_reply_to_screen_name and \ self.in_reply_to_user_id == other.in_reply_to_user_id and \ self.in_reply_to_status_id == other.in_reply_to_status_id and \ self.truncated == other.truncated and \ self.retweeted == other.retweeted and \ self.favorited == other.favorited and \ self.source == other.source and \ self.geo == other.geo and \ self.place == other.place and \ self.coordinates == other.coordinates and \ self.contributors == other.contributors and \ self.retweeted_status == other.retweeted_status and \ self.retweet_count == other.retweet_count except AttributeError: return False def __str__(self): '''A string representation of this twitter.Status instance. The return value is the same as the JSON string representation. Returns: A string representation of this twitter.Status instance. ''' return self.AsJsonString() def AsJsonString(self): '''A JSON string representation of this twitter.Status instance. Returns: A JSON string representation of this twitter.Status instance ''' return simplejson.dumps(self.AsDict(), sort_keys=True) def AsDict(self): '''A dict representation of this twitter.Status instance. The return value uses the same key names as the JSON representation. Return: A dict representing this twitter.Status instance ''' data = {} if self.created_at: data['created_at'] = self.created_at if self.favorited: data['favorited'] = self.favorited if self.id: data['id'] = self.id if self.text: data['text'] = self.text if self.location: data['location'] = self.location if self.user: data['user'] = self.user.AsDict() if self.in_reply_to_screen_name: data['in_reply_to_screen_name'] = self.in_reply_to_screen_name if self.in_reply_to_user_id: data['in_reply_to_user_id'] = self.in_reply_to_user_id if self.in_reply_to_status_id: data['in_reply_to_status_id'] = self.in_reply_to_status_id if self.truncated is not None: data['truncated'] = self.truncated if self.retweeted is not None: data['retweeted'] = self.retweeted if self.favorited is not None: data['favorited'] = self.favorited if self.source: data['source'] = self.source if self.geo: data['geo'] = self.geo if self.place: data['place'] = self.place if self.coordinates: data['coordinates'] = self.coordinates if self.contributors: data['contributors'] = self.contributors if self.hashtags: data['hashtags'] = [h.text for h in self.hashtags] if self.retweeted_status: data['retweeted_status'] = self.retweeted_status.AsDict() if self.retweet_count: data['retweet_count'] = self.retweet_count return data @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the twitter API Returns: A twitter.Status instance ''' if 'user' in data: user = User.NewFromJsonDict(data['user']) else: user = None if 'retweeted_status' in data: retweeted_status = Status.NewFromJsonDict(data['retweeted_status']) else: retweeted_status = None urls = None user_mentions = None hashtags = None if 'entities' in data: if 'urls' in data['entities']: urls = [Url.NewFromJsonDict(u) for u in data['entities']['urls']] if 'user_mentions' in data['entities']: user_mentions = [User.NewFromJsonDict(u) for u in data['entities']['user_mentions']] if 'hashtags' in data['entities']: hashtags = [Hashtag.NewFromJsonDict(h) for h in data['entities']['hashtags']] return Status(created_at=data.get('created_at', None), favorited=data.get('favorited', None), id=data.get('id', None), text=data.get('text', None), location=data.get('location', None), in_reply_to_screen_name=data.get('in_reply_to_screen_name', None), in_reply_to_user_id=data.get('in_reply_to_user_id', None), in_reply_to_status_id=data.get('in_reply_to_status_id', None), truncated=data.get('truncated', None), retweeted=data.get('retweeted', None), source=data.get('source', None), user=user, urls=urls, user_mentions=user_mentions, hashtags=hashtags, geo=data.get('geo', None), place=data.get('place', None), coordinates=data.get('coordinates', None), contributors=data.get('contributors', None), retweeted_status=retweeted_status, retweet_count=data.get('retweet_count', None)) class User(object): '''A class representing the User structure used by the twitter API. The User structure exposes the following properties: user.id user.name user.screen_name user.location user.description user.profile_image_url user.profile_background_tile user.profile_background_image_url user.profile_sidebar_fill_color user.profile_background_color user.profile_link_color user.profile_text_color user.protected user.utc_offset user.time_zone user.url user.status user.statuses_count user.followers_count user.friends_count user.favourites_count user.geo_enabled user.verified user.lang user.notifications user.contributors_enabled user.created_at user.listed_count ''' def __init__(self, id=None, name=None, screen_name=None, location=None, description=None, profile_image_url=None, profile_background_tile=None, profile_background_image_url=None, profile_sidebar_fill_color=None, profile_background_color=None, profile_link_color=None, profile_text_color=None, protected=None, utc_offset=None, time_zone=None, followers_count=None, friends_count=None, statuses_count=None, favourites_count=None, url=None, status=None, geo_enabled=None, verified=None, lang=None, notifications=None, contributors_enabled=None, created_at=None, listed_count=None): self.id = id self.name = name self.screen_name = screen_name self.location = location self.description = description self.profile_image_url = profile_image_url self.profile_background_tile = profile_background_tile self.profile_background_image_url = profile_background_image_url self.profile_sidebar_fill_color = profile_sidebar_fill_color self.profile_background_color = profile_background_color self.profile_link_color = profile_link_color self.profile_text_color = profile_text_color self.protected = protected self.utc_offset = utc_offset self.time_zone = time_zone self.followers_count = followers_count self.friends_count = friends_count self.statuses_count = statuses_count self.favourites_count = favourites_count self.url = url self.status = status self.geo_enabled = geo_enabled self.verified = verified self.lang = lang self.notifications = notifications self.contributors_enabled = contributors_enabled self.created_at = created_at self.listed_count = listed_count def GetId(self): '''Get the unique id of this user. Returns: The unique id of this user ''' return self._id def SetId(self, id): '''Set the unique id of this user. Args: id: The unique id of this user. ''' self._id = id id = property(GetId, SetId, doc='The unique id of this user.') def GetName(self): '''Get the real name of this user. Returns: The real name of this user ''' return self._name def SetName(self, name): '''Set the real name of this user. Args: name: The real name of this user ''' self._name = name name = property(GetName, SetName, doc='The real name of this user.') def GetScreenName(self): '''Get the short twitter name of this user. Returns: The short twitter name of this user ''' return self._screen_name def SetScreenName(self, screen_name): '''Set the short twitter name of this user. Args: screen_name: the short twitter name of this user ''' self._screen_name = screen_name screen_name = property(GetScreenName, SetScreenName, doc='The short twitter name of this user.') def GetLocation(self): '''Get the geographic location of this user. Returns: The geographic location of this user ''' return self._location def SetLocation(self, location): '''Set the geographic location of this user. Args: location: The geographic location of this user ''' self._location = location location = property(GetLocation, SetLocation, doc='The geographic location of this user.') def GetDescription(self): '''Get the short text description of this user. Returns: The short text description of this user ''' return self._description def SetDescription(self, description): '''Set the short text description of this user. Args: description: The short text description of this user ''' self._description = description description = property(GetDescription, SetDescription, doc='The short text description of this user.') def GetUrl(self): '''Get the homepage url of this user. Returns: The homepage url of this user ''' return self._url def SetUrl(self, url): '''Set the homepage url of this user. Args: url: The homepage url of this user ''' self._url = url url = property(GetUrl, SetUrl, doc='The homepage url of this user.') def GetProfileImageUrl(self): '''Get the url of the thumbnail of this user. Returns: The url of the thumbnail of this user ''' return self._profile_image_url def SetProfileImageUrl(self, profile_image_url): '''Set the url of the thumbnail of this user. Args: profile_image_url: The url of the thumbnail of this user ''' self._profile_image_url = profile_image_url profile_image_url= property(GetProfileImageUrl, SetProfileImageUrl, doc='The url of the thumbnail of this user.') def GetProfileBackgroundTile(self): '''Boolean for whether to tile the profile background image. Returns: True if the background is to be tiled, False if not, None if unset. ''' return self._profile_background_tile def SetProfileBackgroundTile(self, profile_background_tile): '''Set the boolean flag for whether to tile the profile background image. Args: profile_background_tile: Boolean flag for whether to tile or not. ''' self._profile_background_tile = profile_background_tile profile_background_tile = property(GetProfileBackgroundTile, SetProfileBackgroundTile, doc='Boolean for whether to tile the background image.') def GetProfileBackgroundImageUrl(self): return self._profile_background_image_url def SetProfileBackgroundImageUrl(self, profile_background_image_url): self._profile_background_image_url = profile_background_image_url profile_background_image_url = property(GetProfileBackgroundImageUrl, SetProfileBackgroundImageUrl, doc='The url of the profile background of this user.') def GetProfileSidebarFillColor(self): return self._profile_sidebar_fill_color def SetProfileSidebarFillColor(self, profile_sidebar_fill_color): self._profile_sidebar_fill_color = profile_sidebar_fill_color profile_sidebar_fill_color = property(GetProfileSidebarFillColor, SetProfileSidebarFillColor) def GetProfileBackgroundColor(self): return self._profile_background_color def SetProfileBackgroundColor(self, profile_background_color): self._profile_background_color = profile_background_color profile_background_color = property(GetProfileBackgroundColor, SetProfileBackgroundColor) def GetProfileLinkColor(self): return self._profile_link_color def SetProfileLinkColor(self, profile_link_color): self._profile_link_color = profile_link_color profile_link_color = property(GetProfileLinkColor, SetProfileLinkColor) def GetProfileTextColor(self): return self._profile_text_color def SetProfileTextColor(self, profile_text_color): self._profile_text_color = profile_text_color profile_text_color = property(GetProfileTextColor, SetProfileTextColor) def GetProtected(self): return self._protected def SetProtected(self, protected): self._protected = protected protected = property(GetProtected, SetProtected) def GetUtcOffset(self): return self._utc_offset def SetUtcOffset(self, utc_offset): self._utc_offset = utc_offset utc_offset = property(GetUtcOffset, SetUtcOffset) def GetTimeZone(self): '''Returns the current time zone string for the user. Returns: The descriptive time zone string for the user. ''' return self._time_zone def SetTimeZone(self, time_zone): '''Sets the user's time zone string. Args: time_zone: The descriptive time zone to assign for the user. ''' self._time_zone = time_zone time_zone = property(GetTimeZone, SetTimeZone) def GetStatus(self): '''Get the latest twitter.Status of this user. Returns: The latest twitter.Status of this user ''' return self._status def SetStatus(self, status): '''Set the latest twitter.Status of this user. Args: status: The latest twitter.Status of this user ''' self._status = status status = property(GetStatus, SetStatus, doc='The latest twitter.Status of this user.') def GetFriendsCount(self): '''Get the friend count for this user. Returns: The number of users this user has befriended. ''' return self._friends_count def SetFriendsCount(self, count): '''Set the friend count for this user. Args: count: The number of users this user has befriended. ''' self._friends_count = count friends_count = property(GetFriendsCount, SetFriendsCount, doc='The number of friends for this user.') def GetListedCount(self): '''Get the listed count for this user. Returns: The number of lists this user belongs to. ''' return self._listed_count def SetListedCount(self, count): '''Set the listed count for this user. Args: count: The number of lists this user belongs to. ''' self._listed_count = count listed_count = property(GetListedCount, SetListedCount, doc='The number of lists this user belongs to.') def GetFollowersCount(self): '''Get the follower count for this user. Returns: The number of users following this user. ''' return self._followers_count def SetFollowersCount(self, count): '''Set the follower count for this user. Args: count: The number of users following this user. ''' self._followers_count = count followers_count = property(GetFollowersCount, SetFollowersCount, doc='The number of users following this user.') def GetStatusesCount(self): '''Get the number of status updates for this user. Returns: The number of status updates for this user. ''' return self._statuses_count def SetStatusesCount(self, count): '''Set the status update count for this user. Args: count: The number of updates for this user. ''' self._statuses_count = count statuses_count = property(GetStatusesCount, SetStatusesCount, doc='The number of updates for this user.') def GetFavouritesCount(self): '''Get the number of favourites for this user. Returns: The number of favourites for this user. ''' return self._favourites_count def SetFavouritesCount(self, count): '''Set the favourite count for this user. Args: count: The number of favourites for this user. ''' self._favourites_count = count favourites_count = property(GetFavouritesCount, SetFavouritesCount, doc='The number of favourites for this user.') def GetGeoEnabled(self): '''Get the setting of geo_enabled for this user. Returns: True/False if Geo tagging is enabled ''' return self._geo_enabled def SetGeoEnabled(self, geo_enabled): '''Set the latest twitter.geo_enabled of this user. Args: geo_enabled: True/False if Geo tagging is to be enabled ''' self._geo_enabled = geo_enabled geo_enabled = property(GetGeoEnabled, SetGeoEnabled, doc='The value of twitter.geo_enabled for this user.') def GetVerified(self): '''Get the setting of verified for this user. Returns: True/False if user is a verified account ''' return self._verified def SetVerified(self, verified): '''Set twitter.verified for this user. Args: verified: True/False if user is a verified account ''' self._verified = verified verified = property(GetVerified, SetVerified, doc='The value of twitter.verified for this user.') def GetLang(self): '''Get the setting of lang for this user. Returns: language code of the user ''' return self._lang def SetLang(self, lang): '''Set twitter.lang for this user. Args: lang: language code for the user ''' self._lang = lang lang = property(GetLang, SetLang, doc='The value of twitter.lang for this user.') def GetNotifications(self): '''Get the setting of notifications for this user. Returns: True/False for the notifications setting of the user ''' return self._notifications def SetNotifications(self, notifications): '''Set twitter.notifications for this user. Args: notifications: True/False notifications setting for the user ''' self._notifications = notifications notifications = property(GetNotifications, SetNotifications, doc='The value of twitter.notifications for this user.') def GetContributorsEnabled(self): '''Get the setting of contributors_enabled for this user. Returns: True/False contributors_enabled of the user ''' return self._contributors_enabled def SetContributorsEnabled(self, contributors_enabled): '''Set twitter.contributors_enabled for this user. Args: contributors_enabled: True/False contributors_enabled setting for the user ''' self._contributors_enabled = contributors_enabled contributors_enabled = property(GetContributorsEnabled, SetContributorsEnabled, doc='The value of twitter.contributors_enabled for this user.') def GetCreatedAt(self): '''Get the setting of created_at for this user. Returns: created_at value of the user ''' return self._created_at def SetCreatedAt(self, created_at): '''Set twitter.created_at for this user. Args: created_at: created_at value for the user ''' self._created_at = created_at created_at = property(GetCreatedAt, SetCreatedAt, doc='The value of twitter.created_at for this user.') def __ne__(self, other): return not self.__eq__(other) def __eq__(self, other): try: return other and \ self.id == other.id and \ self.name == other.name and \ self.screen_name == other.screen_name and \ self.location == other.location and \ self.description == other.description and \ self.profile_image_url == other.profile_image_url and \ self.profile_background_tile == other.profile_background_tile and \ self.profile_background_image_url == other.profile_background_image_url and \ self.profile_sidebar_fill_color == other.profile_sidebar_fill_color and \ self.profile_background_color == other.profile_background_color and \ self.profile_link_color == other.profile_link_color and \ self.profile_text_color == other.profile_text_color and \ self.protected == other.protected and \ self.utc_offset == other.utc_offset and \ self.time_zone == other.time_zone and \ self.url == other.url and \ self.statuses_count == other.statuses_count and \ self.followers_count == other.followers_count and \ self.favourites_count == other.favourites_count and \ self.friends_count == other.friends_count and \ self.status == other.status and \ self.geo_enabled == other.geo_enabled and \ self.verified == other.verified and \ self.lang == other.lang and \ self.notifications == other.notifications and \ self.contributors_enabled == other.contributors_enabled and \ self.created_at == other.created_at and \ self.listed_count == other.listed_count except AttributeError: return False def __str__(self): '''A string representation of this twitter.User instance. The return value is the same as the JSON string representation. Returns: A string representation of this twitter.User instance. ''' return self.AsJsonString() def AsJsonString(self): '''A JSON string representation of this twitter.User instance. Returns: A JSON string representation of this twitter.User instance ''' return simplejson.dumps(self.AsDict(), sort_keys=True) def AsDict(self): '''A dict representation of this twitter.User instance. The return value uses the same key names as the JSON representation. Return: A dict representing this twitter.User instance ''' data = {} if self.id: data['id'] = self.id if self.name: data['name'] = self.name if self.screen_name: data['screen_name'] = self.screen_name if self.location: data['location'] = self.location if self.description: data['description'] = self.description if self.profile_image_url: data['profile_image_url'] = self.profile_image_url if self.profile_background_tile is not None: data['profile_background_tile'] = self.profile_background_tile if self.profile_background_image_url: data['profile_sidebar_fill_color'] = self.profile_background_image_url if self.profile_background_color: data['profile_background_color'] = self.profile_background_color if self.profile_link_color: data['profile_link_color'] = self.profile_link_color if self.profile_text_color: data['profile_text_color'] = self.profile_text_color if self.protected is not None: data['protected'] = self.protected if self.utc_offset: data['utc_offset'] = self.utc_offset if self.time_zone: data['time_zone'] = self.time_zone if self.url: data['url'] = self.url if self.status: data['status'] = self.status.AsDict() if self.friends_count: data['friends_count'] = self.friends_count if self.followers_count: data['followers_count'] = self.followers_count if self.statuses_count: data['statuses_count'] = self.statuses_count if self.favourites_count: data['favourites_count'] = self.favourites_count if self.geo_enabled: data['geo_enabled'] = self.geo_enabled if self.verified: data['verified'] = self.verified if self.lang: data['lang'] = self.lang if self.notifications: data['notifications'] = self.notifications if self.contributors_enabled: data['contributors_enabled'] = self.contributors_enabled if self.created_at: data['created_at'] = self.created_at if self.listed_count: data['listed_count'] = self.listed_count return data @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the twitter API Returns: A twitter.User instance ''' if 'status' in data: status = Status.NewFromJsonDict(data['status']) else: status = None return User(id=data.get('id', None), name=data.get('name', None), screen_name=data.get('screen_name', None), location=data.get('location', None), description=data.get('description', None), statuses_count=data.get('statuses_count', None), followers_count=data.get('followers_count', None), favourites_count=data.get('favourites_count', None), friends_count=data.get('friends_count', None), profile_image_url=data.get('profile_image_url', None), profile_background_tile = data.get('profile_background_tile', None), profile_background_image_url = data.get('profile_background_image_url', None), profile_sidebar_fill_color = data.get('profile_sidebar_fill_color', None), profile_background_color = data.get('profile_background_color', None), profile_link_color = data.get('profile_link_color', None), profile_text_color = data.get('profile_text_color', None), protected = data.get('protected', None), utc_offset = data.get('utc_offset', None), time_zone = data.get('time_zone', None), url=data.get('url', None), status=status, geo_enabled=data.get('geo_enabled', None), verified=data.get('verified', None), lang=data.get('lang', None), notifications=data.get('notifications', None), contributors_enabled=data.get('contributors_enabled', None), created_at=data.get('created_at', None), listed_count=data.get('listed_count', None)) class List(object): '''A class representing the List structure used by the twitter API. The List structure exposes the following properties: list.id list.name list.slug list.description list.full_name list.mode list.uri list.member_count list.subscriber_count list.following ''' def __init__(self, id=None, name=None, slug=None, description=None, full_name=None, mode=None, uri=None, member_count=None, subscriber_count=None, following=None, user=None): self.id = id self.name = name self.slug = slug self.description = description self.full_name = full_name self.mode = mode self.uri = uri self.member_count = member_count self.subscriber_count = subscriber_count self.following = following self.user = user def GetId(self): '''Get the unique id of this list. Returns: The unique id of this list ''' return self._id def SetId(self, id): '''Set the unique id of this list. Args: id: The unique id of this list. ''' self._id = id id = property(GetId, SetId, doc='The unique id of this list.') def GetName(self): '''Get the real name of this list. Returns: The real name of this list ''' return self._name def SetName(self, name): '''Set the real name of this list. Args: name: The real name of this list ''' self._name = name name = property(GetName, SetName, doc='The real name of this list.') def GetSlug(self): '''Get the slug of this list. Returns: The slug of this list ''' return self._slug def SetSlug(self, slug): '''Set the slug of this list. Args: slug: The slug of this list. ''' self._slug = slug slug = property(GetSlug, SetSlug, doc='The slug of this list.') def GetDescription(self): '''Get the description of this list. Returns: The description of this list ''' return self._description def SetDescription(self, description): '''Set the description of this list. Args: description: The description of this list. ''' self._description = description description = property(GetDescription, SetDescription, doc='The description of this list.') def GetFull_name(self): '''Get the full_name of this list. Returns: The full_name of this list ''' return self._full_name def SetFull_name(self, full_name): '''Set the full_name of this list. Args: full_name: The full_name of this list. ''' self._full_name = full_name full_name = property(GetFull_name, SetFull_name, doc='The full_name of this list.') def GetMode(self): '''Get the mode of this list. Returns: The mode of this list ''' return self._mode def SetMode(self, mode): '''Set the mode of this list. Args: mode: The mode of this list. ''' self._mode = mode mode = property(GetMode, SetMode, doc='The mode of this list.') def GetUri(self): '''Get the uri of this list. Returns: The uri of this list ''' return self._uri def SetUri(self, uri): '''Set the uri of this list. Args: uri: The uri of this list. ''' self._uri = uri uri = property(GetUri, SetUri, doc='The uri of this list.') def GetMember_count(self): '''Get the member_count of this list. Returns: The member_count of this list ''' return self._member_count def SetMember_count(self, member_count): '''Set the member_count of this list. Args: member_count: The member_count of this list. ''' self._member_count = member_count member_count = property(GetMember_count, SetMember_count, doc='The member_count of this list.') def GetSubscriber_count(self): '''Get the subscriber_count of this list. Returns: The subscriber_count of this list ''' return self._subscriber_count def SetSubscriber_count(self, subscriber_count): '''Set the subscriber_count of this list. Args: subscriber_count: The subscriber_count of this list. ''' self._subscriber_count = subscriber_count subscriber_count = property(GetSubscriber_count, SetSubscriber_count, doc='The subscriber_count of this list.') def GetFollowing(self): '''Get the following status of this list. Returns: The following status of this list ''' return self._following def SetFollowing(self, following): '''Set the following status of this list. Args: following: The following of this list. ''' self._following = following following = property(GetFollowing, SetFollowing, doc='The following status of this list.') def GetUser(self): '''Get the user of this list. Returns: The owner of this list ''' return self._user def SetUser(self, user): '''Set the user of this list. Args: user: The owner of this list. ''' self._user = user user = property(GetUser, SetUser, doc='The owner of this list.') def __ne__(self, other): return not self.__eq__(other) def __eq__(self, other): try: return other and \ self.id == other.id and \ self.name == other.name and \ self.slug == other.slug and \ self.description == other.description and \ self.full_name == other.full_name and \ self.mode == other.mode and \ self.uri == other.uri and \ self.member_count == other.member_count and \ self.subscriber_count == other.subscriber_count and \ self.following == other.following and \ self.user == other.user except AttributeError: return False def __str__(self): '''A string representation of this twitter.List instance. The return value is the same as the JSON string representation. Returns: A string representation of this twitter.List instance. ''' return self.AsJsonString() def AsJsonString(self): '''A JSON string representation of this twitter.List instance. Returns: A JSON string representation of this twitter.List instance ''' return simplejson.dumps(self.AsDict(), sort_keys=True) def AsDict(self): '''A dict representation of this twitter.List instance. The return value uses the same key names as the JSON representation. Return: A dict representing this twitter.List instance ''' data = {} if self.id: data['id'] = self.id if self.name: data['name'] = self.name if self.slug: data['slug'] = self.slug if self.description: data['description'] = self.description if self.full_name: data['full_name'] = self.full_name if self.mode: data['mode'] = self.mode if self.uri: data['uri'] = self.uri if self.member_count is not None: data['member_count'] = self.member_count if self.subscriber_count is not None: data['subscriber_count'] = self.subscriber_count if self.following is not None: data['following'] = self.following if self.user is not None: data['user'] = self.user return data @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the twitter API Returns: A twitter.List instance ''' if 'user' in data: user = User.NewFromJsonDict(data['user']) else: user = None return List(id=data.get('id', None), name=data.get('name', None), slug=data.get('slug', None), description=data.get('description', None), full_name=data.get('full_name', None), mode=data.get('mode', None), uri=data.get('uri', None), member_count=data.get('member_count', None), subscriber_count=data.get('subscriber_count', None), following=data.get('following', None), user=user) class DirectMessage(object): '''A class representing the DirectMessage structure used by the twitter API. The DirectMessage structure exposes the following properties: direct_message.id direct_message.created_at direct_message.created_at_in_seconds # read only direct_message.sender_id direct_message.sender_screen_name direct_message.recipient_id direct_message.recipient_screen_name direct_message.text ''' def __init__(self, id=None, created_at=None, sender_id=None, sender_screen_name=None, recipient_id=None, recipient_screen_name=None, text=None): '''An object to hold a Twitter direct message. This class is normally instantiated by the twitter.Api class and returned in a sequence. Note: Dates are posted in the form "Sat Jan 27 04:17:38 +0000 2007" Args: id: The unique id of this direct message. [Optional] created_at: The time this direct message was posted. [Optional] sender_id: The id of the twitter user that sent this message. [Optional] sender_screen_name: The name of the twitter user that sent this message. [Optional] recipient_id: The id of the twitter that received this message. [Optional] recipient_screen_name: The name of the twitter that received this message. [Optional] text: The text of this direct message. [Optional] ''' self.id = id self.created_at = created_at self.sender_id = sender_id self.sender_screen_name = sender_screen_name self.recipient_id = recipient_id self.recipient_screen_name = recipient_screen_name self.text = text def GetId(self): '''Get the unique id of this direct message. Returns: The unique id of this direct message ''' return self._id def SetId(self, id): '''Set the unique id of this direct message. Args: id: The unique id of this direct message ''' self._id = id id = property(GetId, SetId, doc='The unique id of this direct message.') def GetCreatedAt(self): '''Get the time this direct message was posted. Returns: The time this direct message was posted ''' return self._created_at def SetCreatedAt(self, created_at): '''Set the time this direct message was posted. Args: created_at: The time this direct message was created ''' self._created_at = created_at created_at = property(GetCreatedAt, SetCreatedAt, doc='The time this direct message was posted.') def GetCreatedAtInSeconds(self): '''Get the time this direct message was posted, in seconds since the epoch. Returns: The time this direct message was posted, in seconds since the epoch. ''' return calendar.timegm(rfc822.parsedate(self.created_at)) created_at_in_seconds = property(GetCreatedAtInSeconds, doc="The time this direct message was " "posted, in seconds since the epoch") def GetSenderId(self): '''Get the unique sender id of this direct message. Returns: The unique sender id of this direct message ''' return self._sender_id def SetSenderId(self, sender_id): '''Set the unique sender id of this direct message. Args: sender_id: The unique sender id of this direct message ''' self._sender_id = sender_id sender_id = property(GetSenderId, SetSenderId, doc='The unique sender id of this direct message.') def GetSenderScreenName(self): '''Get the unique sender screen name of this direct message. Returns: The unique sender screen name of this direct message ''' return self._sender_screen_name def SetSenderScreenName(self, sender_screen_name): '''Set the unique sender screen name of this direct message. Args: sender_screen_name: The unique sender screen name of this direct message ''' self._sender_screen_name = sender_screen_name sender_screen_name = property(GetSenderScreenName, SetSenderScreenName, doc='The unique sender screen name of this direct message.') def GetRecipientId(self): '''Get the unique recipient id of this direct message. Returns: The unique recipient id of this direct message ''' return self._recipient_id def SetRecipientId(self, recipient_id): '''Set the unique recipient id of this direct message. Args: recipient_id: The unique recipient id of this direct message ''' self._recipient_id = recipient_id recipient_id = property(GetRecipientId, SetRecipientId, doc='The unique recipient id of this direct message.') def GetRecipientScreenName(self): '''Get the unique recipient screen name of this direct message. Returns: The unique recipient screen name of this direct message ''' return self._recipient_screen_name def SetRecipientScreenName(self, recipient_screen_name): '''Set the unique recipient screen name of this direct message. Args: recipient_screen_name: The unique recipient screen name of this direct message ''' self._recipient_screen_name = recipient_screen_name recipient_screen_name = property(GetRecipientScreenName, SetRecipientScreenName, doc='The unique recipient screen name of this direct message.') def GetText(self): '''Get the text of this direct message. Returns: The text of this direct message. ''' return self._text def SetText(self, text): '''Set the text of this direct message. Args: text: The text of this direct message ''' self._text = text text = property(GetText, SetText, doc='The text of this direct message') def __ne__(self, other): return not self.__eq__(other) def __eq__(self, other): try: return other and \ self.id == other.id and \ self.created_at == other.created_at and \ self.sender_id == other.sender_id and \ self.sender_screen_name == other.sender_screen_name and \ self.recipient_id == other.recipient_id and \ self.recipient_screen_name == other.recipient_screen_name and \ self.text == other.text except AttributeError: return False def __str__(self): '''A string representation of this twitter.DirectMessage instance. The return value is the same as the JSON string representation. Returns: A string representation of this twitter.DirectMessage instance. ''' return self.AsJsonString() def AsJsonString(self): '''A JSON string representation of this twitter.DirectMessage instance. Returns: A JSON string representation of this twitter.DirectMessage instance ''' return simplejson.dumps(self.AsDict(), sort_keys=True) def AsDict(self): '''A dict representation of this twitter.DirectMessage instance. The return value uses the same key names as the JSON representation. Return: A dict representing this twitter.DirectMessage instance ''' data = {} if self.id: data['id'] = self.id if self.created_at: data['created_at'] = self.created_at if self.sender_id: data['sender_id'] = self.sender_id if self.sender_screen_name: data['sender_screen_name'] = self.sender_screen_name if self.recipient_id: data['recipient_id'] = self.recipient_id if self.recipient_screen_name: data['recipient_screen_name'] = self.recipient_screen_name if self.text: data['text'] = self.text return data @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the twitter API Returns: A twitter.DirectMessage instance ''' return DirectMessage(created_at=data.get('created_at', None), recipient_id=data.get('recipient_id', None), sender_id=data.get('sender_id', None), text=data.get('text', None), sender_screen_name=data.get('sender_screen_name', None), id=data.get('id', None), recipient_screen_name=data.get('recipient_screen_name', None)) class Hashtag(object): ''' A class represeinting a twitter hashtag ''' def __init__(self, text=None): self.text = text @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the twitter API Returns: A twitter.Hashtag instance ''' return Hashtag(text = data.get('text', None)) class Trend(object): ''' A class representing a trending topic ''' def __init__(self, name=None, query=None, timestamp=None): self.name = name self.query = query self.timestamp = timestamp def __str__(self): return 'Name: %s\nQuery: %s\nTimestamp: %s\n' % (self.name, self.query, self.timestamp) def __ne__(self, other): return not self.__eq__(other) def __eq__(self, other): try: return other and \ self.name == other.name and \ self.query == other.query and \ self.timestamp == other.timestamp except AttributeError: return False @staticmethod def NewFromJsonDict(data, timestamp = None): '''Create a new instance based on a JSON dict Args: data: A JSON dict timestamp: Gets set as the timestamp property of the new object Returns: A twitter.Trend object ''' return Trend(name=data.get('name', None), query=data.get('query', None), timestamp=timestamp) class Url(object): '''A class representing an URL contained in a tweet''' def __init__(self, url=None, expanded_url=None): self.url = url self.expanded_url = expanded_url @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the twitter API Returns: A twitter.Url instance ''' return Url(url=data.get('url', None), expanded_url=data.get('expanded_url', None)) class Api(object): '''A python interface into the Twitter API By default, the Api caches results for 1 minute. Example usage: To create an instance of the twitter.Api class, with no authentication: >>> import twitter >>> api = twitter.Api() To fetch the most recently posted public twitter status messages: >>> statuses = api.GetPublicTimeline() >>> print [s.user.name for s in statuses] [u'DeWitt', u'Kesuke Miyagi', u'ev', u'Buzz Andersen', u'Biz Stone'] #... To fetch a single user's public status messages, where "user" is either a Twitter "short name" or their user id. >>> statuses = api.GetUserTimeline(user) >>> print [s.text for s in statuses] To use authentication, instantiate the twitter.Api class with a consumer key and secret; and the oAuth key and secret: >>> api = twitter.Api(consumer_key='twitter consumer key', consumer_secret='twitter consumer secret', access_token_key='the_key_given', access_token_secret='the_key_secret') To fetch your friends (after being authenticated): >>> users = api.GetFriends() >>> print [u.name for u in users] To post a twitter status message (after being authenticated): >>> status = api.PostUpdate('I love python-twitter!') >>> print status.text I love python-twitter! There are many other methods, including: >>> api.PostUpdates(status) >>> api.PostDirectMessage(user, text) >>> api.GetUser(user) >>> api.GetReplies() >>> api.GetUserTimeline(user) >>> api.GetStatus(id) >>> api.DestroyStatus(id) >>> api.GetFriendsTimeline(user) >>> api.GetFriends(user) >>> api.GetFollowers() >>> api.GetFeatured() >>> api.GetDirectMessages() >>> api.PostDirectMessage(user, text) >>> api.DestroyDirectMessage(id) >>> api.DestroyFriendship(user) >>> api.CreateFriendship(user) >>> api.GetUserByEmail(email) >>> api.VerifyCredentials() ''' DEFAULT_CACHE_TIMEOUT = 60 # cache for 1 minute _API_REALM = 'Twitter API' def __init__(self, consumer_key=None, consumer_secret=None, access_token_key=None, access_token_secret=None, input_encoding=None, request_headers=None, cache=DEFAULT_CACHE, shortner=None, base_url=None, use_gzip_compression=False, debugHTTP=False): '''Instantiate a new twitter.Api object. Args: consumer_key: Your Twitter user's consumer_key. consumer_secret: Your Twitter user's consumer_secret. access_token_key: The oAuth access token key value you retrieved from running get_access_token.py. access_token_secret: The oAuth access token's secret, also retrieved from the get_access_token.py run. input_encoding: The encoding used to encode input strings. [Optional] request_header: A dictionary of additional HTTP request headers. [Optional] cache: The cache instance to use. Defaults to DEFAULT_CACHE. Use None to disable caching. [Optional] shortner: The shortner instance to use. Defaults to None. See shorten_url.py for an example shortner. [Optional] base_url: The base URL to use to contact the Twitter API. Defaults to https://twitter.com. [Optional] use_gzip_compression: Set to True to tell enable gzip compression for any call made to Twitter. Defaults to False. [Optional] debugHTTP: Set to True to enable debug output from urllib2 when performing any HTTP requests. Defaults to False. [Optional] ''' self.SetCache(cache) self._urllib = urllib2 self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT self._input_encoding = input_encoding self._use_gzip = use_gzip_compression self._debugHTTP = debugHTTP self._oauth_consumer = None self._InitializeRequestHeaders(request_headers) self._InitializeUserAgent() self._InitializeDefaultParameters() if base_url is None: self.base_url = 'https://api.twitter.com/1' else: self.base_url = base_url if consumer_key is not None and (access_token_key is None or access_token_secret is None): print >> sys.stderr, 'Twitter now requires an oAuth Access Token for API calls.' print >> sys.stderr, 'If your using this library from a command line utility, please' print >> sys.stderr, 'run the the included get_access_token.py tool to generate one.' raise TwitterError('Twitter requires oAuth Access Token for all API access') self.SetCredentials(consumer_key, consumer_secret, access_token_key, access_token_secret) def SetCredentials(self, consumer_key, consumer_secret, access_token_key=None, access_token_secret=None): '''Set the consumer_key and consumer_secret for this instance Args: consumer_key: The consumer_key of the twitter account. consumer_secret: The consumer_secret for the twitter account. access_token_key: The oAuth access token key value you retrieved from running get_access_token.py. access_token_secret: The oAuth access token's secret, also retrieved from the get_access_token.py run. ''' self._consumer_key = consumer_key self._consumer_secret = consumer_secret self._access_token_key = access_token_key self._access_token_secret = access_token_secret self._oauth_consumer = None if consumer_key is not None and consumer_secret is not None and \ access_token_key is not None and access_token_secret is not None: self._signature_method_plaintext = oauth.SignatureMethod_PLAINTEXT() self._signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() self._oauth_token = oauth.Token(key=access_token_key, secret=access_token_secret) self._oauth_consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret) def ClearCredentials(self): '''Clear the any credentials for this instance ''' self._consumer_key = None self._consumer_secret = None self._access_token_key = None self._access_token_secret = None self._oauth_consumer = None def GetPublicTimeline(self, since_id=None, include_rts=None, include_entities=None): '''Fetch the sequence of public twitter.Status message for all users. Args: since_id: Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available. [Optional] include_rts: If True, the timeline will contain native retweets (if they exist) in addition to the standard stream of tweets. [Optional] include_entities: If True, each tweet will include a node called "entities,". This node offers a variety of metadata about the tweet in a discreet structure, including: user_mentions, urls, and hashtags. [Optional] Returns: An sequence of twitter.Status instances, one for each message ''' parameters = {} if since_id: parameters['since_id'] = since_id if include_rts: parameters['include_rts'] = 1 if include_entities: parameters['include_entities'] = 1 url = '%s/statuses/public_timeline.json' % self.base_url json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) return [Status.NewFromJsonDict(x) for x in data] def FilterPublicTimeline(self, term, since_id=None): '''Filter the public twitter timeline by a given search term on the local machine. Args: term: term to search by. since_id: Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available. [Optional] Returns: A sequence of twitter.Status instances, one for each message containing the term ''' statuses = self.GetPublicTimeline(since_id) results = [] for s in statuses: if s.text.lower().find(term.lower()) != -1: results.append(s) return results def GetSearch(self, term=None, geocode=None, since_id=None, per_page=15, page=1, lang="en", show_user="true", query_users=False): '''Return twitter search results for a given term. Args: term: term to search by. Optional if you include geocode. since_id: Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available. [Optional] geocode: geolocation information in the form (latitude, longitude, radius) [Optional] per_page: number of results to return. Default is 15 [Optional] page: Specifies the page of results to retrieve. Note: there are pagination limits. [Optional] lang: language for results. Default is English [Optional] show_user: prefixes screen name in status query_users: If set to False, then all users only have screen_name and profile_image_url available. If set to True, all information of users are available, but it uses lots of request quota, one per status. Returns: A sequence of twitter.Status instances, one for each message containing the term ''' # Build request parameters parameters = {} if since_id: parameters['since_id'] = since_id if term is None and geocode is None: return [] if term is not None: parameters['q'] = term if geocode is not None: parameters['geocode'] = ','.join(map(str, geocode)) parameters['show_user'] = show_user parameters['lang'] = lang parameters['rpp'] = per_page parameters['page'] = page # Make and send requests url = 'http://search.twitter.com/search.json' json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) results = [] for x in data['results']: temp = Status.NewFromJsonDict(x) if query_users: # Build user object with new request temp.user = self.GetUser(urllib.quote(x['from_user'])) else: temp.user = User(screen_name=x['from_user'], profile_image_url=x['profile_image_url']) results.append(temp) # Return built list of statuses return results # [Status.NewFromJsonDict(x) for x in data['results']] def GetTrendsCurrent(self, exclude=None): '''Get the current top trending topics Args: exclude: Appends the exclude parameter as a request parameter. Currently only exclude=hashtags is supported. [Optional] Returns: A list with 10 entries. Each entry contains the twitter. ''' parameters = {} if exclude: parameters['exclude'] = exclude url = '%s/trends/current.json' % self.base_url json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) trends = [] for t in data['trends']: for item in data['trends'][t]: trends.append(Trend.NewFromJsonDict(item, timestamp = t)) return trends def GetTrendsWoeid(self, woeid, exclude=None): '''Return the top 10 trending topics for a specific WOEID, if trending information is available for it. Args: woeid: the Yahoo! Where On Earth ID for a location. exclude: Appends the exclude parameter as a request parameter. Currently only exclude=hashtags is supported. [Optional] Returns: A list with 10 entries. Each entry contains a Trend. ''' parameters = {} if exclude: parameters['exclude'] = exclude url = '%s/trends/%s.json' % (self.base_url, woeid) json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) trends = [] timestamp = data[0]['as_of'] for trend in data[0]['trends']: trends.append(Trend.NewFromJsonDict(trend, timestamp = timestamp)) return trends def GetTrendsDaily(self, exclude=None, startdate=None): '''Get the current top trending topics for each hour in a given day Args: startdate: The start date for the report. Should be in the format YYYY-MM-DD. [Optional] exclude: Appends the exclude parameter as a request parameter. Currently only exclude=hashtags is supported. [Optional] Returns: A list with 24 entries. Each entry contains the twitter. Trend elements that were trending at the corresponding hour of the day. ''' parameters = {} if exclude: parameters['exclude'] = exclude if not startdate: startdate = time.strftime('%Y-%m-%d', time.gmtime()) parameters['date'] = startdate url = '%s/trends/daily.json' % self.base_url json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) trends = [] for i in xrange(24): trends.append(None) for t in data['trends']: idx = int(time.strftime('%H', time.strptime(t, '%Y-%m-%d %H:%M'))) trends[idx] = [Trend.NewFromJsonDict(x, timestamp = t) for x in data['trends'][t]] return trends def GetTrendsWeekly(self, exclude=None, startdate=None): '''Get the top 30 trending topics for each day in a given week. Args: startdate: The start date for the report. Should be in the format YYYY-MM-DD. [Optional] exclude: Appends the exclude parameter as a request parameter. Currently only exclude=hashtags is supported. [Optional] Returns: A list with each entry contains the twitter. Trend elements of trending topics for the corrsponding day of the week ''' parameters = {} if exclude: parameters['exclude'] = exclude if not startdate: startdate = time.strftime('%Y-%m-%d', time.gmtime()) parameters['date'] = startdate url = '%s/trends/weekly.json' % self.base_url json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) trends = [] for i in xrange(7): trends.append(None) # use the epochs of the dates as keys for a dictionary times = dict([(calendar.timegm(time.strptime(t, '%Y-%m-%d')),t) for t in data['trends']]) cnt = 0 # create the resulting structure ordered by the epochs of the dates for e in sorted(times.keys()): trends[cnt] = [Trend.NewFromJsonDict(x, timestamp = times[e]) for x in data['trends'][times[e]]] cnt +=1 return trends def GetFriendsTimeline(self, user=None, count=None, page=None, since_id=None, retweets=None, include_entities=None): '''Fetch the sequence of twitter.Status messages for a user's friends The twitter.Api instance must be authenticated if the user is private. Args: user: Specifies the ID or screen name of the user for whom to return the friends_timeline. If not specified then the authenticated user set in the twitter.Api instance will be used. [Optional] count: Specifies the number of statuses to retrieve. May not be greater than 100. [Optional] page: Specifies the page of results to retrieve. Note: there are pagination limits. [Optional] since_id: Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available. [Optional] retweets: If True, the timeline will contain native retweets. [Optional] include_entities: If True, each tweet will include a node called "entities,". This node offers a variety of metadata about the tweet in a discreet structure, including: user_mentions, urls, and hashtags. [Optional] Returns: A sequence of twitter.Status instances, one for each message ''' if not user and not self._oauth_consumer: raise TwitterError("User must be specified if API is not authenticated.") url = '%s/statuses/friends_timeline' % self.base_url if user: url = '%s/%s.json' % (url, user) else: url = '%s.json' % url parameters = {} if count is not None: try: if int(count) > 100: raise TwitterError("'count' may not be greater than 100") except ValueError: raise TwitterError("'count' must be an integer") parameters['count'] = count if page is not None: try: parameters['page'] = int(page) except ValueError: raise TwitterError("'page' must be an integer") if since_id: parameters['since_id'] = since_id if retweets: parameters['include_rts'] = True if include_entities: parameters['include_entities'] = True json = self._FetchUrl(url, parameters=parameters) data = self._ParseAndCheckTwitter(json) return [Status.NewFromJsonDict(x) for x in data] def GetUserTimeline(self, id=None, user_id=None, screen_name=None, since_id=None, max_id=None, count=None, page=None, include_rts=None, include_entities=None): '''Fetch the sequence of public Status messages for a single user. The twitter.Api instance must be authenticated if the user is private. Args: id: Specifies the ID or screen name of the user for whom to return the user_timeline. [Optional] user_id: Specfies the ID of the user for whom to return the user_timeline. Helpful for disambiguating when a valid user ID is also a valid screen name. [Optional] screen_name: Specfies the scre
Python is an object oriented high level programming language. One of the simplest programming languages of all, and also the most used language for creating System Security programs. It is Simple, yet the most powerful programming language which is very close to the Machine Language. If you have never programmed before, but you have little knowledge of how a computer works, then this the right place to start. After learning this course, one can start to build their own System programs, and also basic malware testing programs. This course is for those who want to learn how to program in python. It is intended to suit a wide audience, though not for absolute beginners. This course is targeted towards people who already have basic in either python or any other programming language. This course takes in consideration that you already know what loops, conditions, statements and variables are. This course will take you through the following chapters: Abstraction I and II, Exceptions in programs, Methods, properties and iterators, Standard Libraries and Python programming with Files. This will complete your intermediate training in Python Programming and how data structures are created and implemented in software’s. If you already know python, but other versions earlier than Python3.0, then you can start with this course to upgrade yourself with necessary modules. Some of the material in this course may be a bit difficult for an inexperienced programmer. However, once you start writing and practicing the examples in this course and writing your own codes based on these examples, then it will become quite practical for you to understand these terms. If you don’t understand some specific terms in the first bit, go through the tutorials again. Practice and Repetition are the keys to learning. This Course is in depth summary of the Core of Python. So, if you already have the basics in python, then it will be extremely easy to understand. Even if you don’t have the basics, then you can just search the specific terms used in here, understand only those and then come back to clear the advanced topics in these tutorials. This course will take you through the journey of interacting with system files using IDLE or the Python Interpreter, Creating your own servers and clients using socket programming, Understanding the database support for python with SQlite. There are also chapters which will teach you how to create your own programs which can interact with open files in any platform (UNIX, Linux, Windows or Mac). There is also a vast area covered in this course about Web Programming with Python covering the four most important topics as CGI, Screen Scraping, mod_python and Web Services. And finally there is testing, debugging and logging in Python. So, by completing this course, you will finally be able to write your own programs and test them on various platforms. The Main Idea of this course is to make the learner an advanced programmer having knowledge in bits and bytes in all various environments in Python programming. What are the requirements? Basics in Any Programming Language Basic Computer Knowledge Basics in Python such as ‘loops, variables, conditions and statements’(knowing any other language would be an added advantage) Basics in Python (knowing basic C,C++ and a bit about network programming would be an added advantage) What am I going to get from this course? Over 73 lectures and 10 hours of content! This course will clear advanced programming knowledge in Python Learn Abstraction I and II, Exceptions in programs, Methods, properties and iterators, Standard Libraries and Python programming with Files This course will take you through the journey of interacting with system files using IDLE or the Python Interpreter, Creating your own servers and clients using socket programming, Understanding the database support for python with SQlite. Learn Web Programming with Python covering the four most important topics as CGI, Screen Scraping, mod_python and Web Services Learn testing, debugging and logging in Python What is the target audience? Students Professionals Anyone who wants to learn a new Version i.e. Python 3.4.2
armankarimpour
Welcome to Hyper Bot ! Create your own permanent Hyper Bot ( runs on Heroku, no Lc0 ) If you want to create your own permanent bot, do the following: Sign up to GitHub https://github.com/join , if you have not already. With your GitHub account visit https://github.com/hyperchessbot/hyperbot , then click on Fork. Create a BOT account if you do not already have one. To create one use an account that has not played any games yet, log into this account, then visit https://hypereasy.herokuapp.com/auth/lichess/bot , approve oauth and then on the page you are taken to click on 'Request upgrade to bot'. Create an API access token with your BOT account at https://lichess.org/account/oauth/token ( should have scopes Read incoming challenges / Create, accept, decline challenges / Play games with the bot API ) Sign up to Heroku https://signup.heroku.com/ , if you have not already. At Heroku create a new app using New / Create new app. Choose Europe for region. In the app's dashboard go to the Deploy tab. Use the GitHub button to connect the app to your forked repo. Press Search to find your repositories, then select hyperbot. You need to deploy the master branch. Enable Automatic Deploys and press Deploy Branch, for the initial deploy. Wait for the build to finish. In Heroku Settings / Reveal Config Vars create a new variable TOKEN and set its value to your newly created access token, then create a new variable BOT_NAME and set its value to your bot's lichess username. For more detailed instructions and screenshots on setting up your Heroku app refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Creating-and-configuring-your-app-on-Heroku#creating-and-configuring-your-app-on-heroku . Congratulations, you have an up and running lichess bot. If you want to use 3-4-5 piece tablebases on Heroku, refer to this guide https://github.com/hyperchessbot/hyperbot/wiki/Update-Heroku-app-to-latest-version-using-Gitpod#enabling-syzygy-tablebases . Upgrade to bot and play games in your browser To upgrade an account, that has played no games yet, to bot, and to make this bot accept challenges and play games in your browser, visit https://hypereasy.herokuapp.com . For detailed instructions see https://lichess.org/forum/off-topic-discussion/hyper-easy-all-variants-lichess-bot-running-in-your-browser#1 . Update Heroku app to latest version using Gitpod Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Update-Heroku-app-to-latest-version-using-Gitpod#update-heroku-app-to-latest-version-using-gitpod . Creating a MongoDb account Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Creating-a-MongoDb-account#creating-a-mongodb-account . Build external multi game PGN file with MongoDb book builder ( version 2 ) Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Build-book-from-external-multi-game-PGN-file#build-book-from-external-multi-game-pgn-file . Install bot on Windows ( runs Lc0 ) Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Install-bot-on-Windows-(-runs-Lc0-)#install-bot-on-windows--runs-lc0- . Install bot on goorm.io ( runs Lc0 ) Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Install-bot-on-goorm.io-(-runs-Lc0-)#install-bot-on-goormio--runs-lc0- . Download a net for Lc0 Dowload a net from https://lczero.org/dev/wiki/best-nets-for-lc0 . Rename the weights file 'weights.pb.gz', then copy it to the 'lc0goorm' folder. Overwrite the old file. Update to latest version on Windows / goorm Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Update-to-latest-version-on-Windows-or-goorm#update-to-latest-version-on-windows--goorm . Explanation of files Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Explanation-of-files#git . Contribute to code Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Contribute-to-code#contribute-to-code . Discussion / Feedback Discuss Hyper Bot on Discord https://discord.gg/8m3Muay . Post issues on GitHub https://github.com/hyperchessbot/hyperbot/issues . Getting assistance in lichess PM You can seek assistance in lichess PM using your BOT account. Open an issue at https://github.com/hyperchessbot/hyperbot/issues with the GitHub account on which your forked Hyper Bot, with the title 'Identifying lichess account'. Give a link to your lichess account in the issue. After identification you can PM https://lichess.org/@/hyperchessbotauthor . Seeking assistance in lichess PM without verifying your lichess account with your GitHub account may get you blocked. The block may be lifted once you identify your lichess account with your GitHub account. Config vars KEEP_ALIVE_URL : set this to the full link of your bot home page ( https://[yourappname].herokuapp.com , where change [yourappname] to your Heroku app name ) if you want your bot to be kept alive from early morning till late night Heroku server time, keeping alive a free Heroku bot for 24/7 is not possible, because a free Heroku account has a monthly quota of 550 hours ALWAYS_ON : requires paid Heroku account, set it to 'true' to keep the bot alive 24/7, you have to set KEEP_ALIVE_URL to your bot's full home page link for ALWAYS_ON to work ( see also the explanation of KEEP_ALIVE_URL config var ) ALLOW_CORRESPONDENCE : set it to 'true' to allow playing correspondence and infinite time control games CORRESPONDENCE_THINKING_TIME : think in correspondence as if the bot had that many seconds left on its clock ( default : 120 ), the actual thinking time will be decided by the engine MONGODB_URI : connect URI of your MongoDb admin user ( only the host, no slash after the host, do database specified, no query string ), if defined, your latest games or games downloaded from an url ( version 2 only ) will be added to the database on every startup, by default this config var is not defined USE_MONGO_BOOK : set it to 'true' to use the MongoDb book specified by MONGODB_URI DISABLE_ENGINE_FOR_MONGO : set it to 'true' to disable using engine completely when a MongoDb book move is available ( by default the bot may ignore a MongoDb book move at its discretion and use the engine instead for better performance and to allow for more varied play ) MONGO_VERSION : MongoDb book builder version, possible values are 1 ( default, builds a book from bot games as downloaded from lichess as JSON ), 2 ( builds a book from bot games as downloaded from lichess as PGN, or from an arbitrary url specified in PGN_URL ) PGN_URL : url for downloading a multi game PGN file for MongoDb book builder ( version 2 only ) MAX_GAMES : maximum number of games to be built by MongoDb book builder GENERAL_TIMEOUT : timeout for event streams in seconds ( default : 15 ) ENGINE_THREADS : engine Threads uci option ( default : 1 ) ENGINE_HASH : engine Hash uci option in megabytes ( default : 16 ) ENGINE_CONTEMPT : engine Contempt uci option in centipawns ( default : 24 ) ENGINE_MOVE_OVERHEAD : engine Move Overhead uci option in milliseconds ( default : 500 ) ALLOW_PONDER : set it to 'true' to make the bot think on opponent time BOOK_DEPTH : up to how many plies into the game should the bot use the book, choosing too high book depth is running the risk of playing unsound moves ( default : 20 ) BOOK_SPREAD : select the move from that many of the top book moves, choosing to high book spread is running the risk of playing unsound moves ( default : 4 ) BOOK_RATINGS : comma separated list of allowed book rating brackets, possible ratings are 1600, 1800, 2000, 2200, 2500 ( default : '2200,2500') BOOK_SPEEDS : comma separated list of allowed book speeds, possible speeds are bullet, blitz, rapid, classical ( default : 'blitz,rapid' ) LOG_API : set it to 'true' to allow more verbose logging, logs are available in the Inspection / Console of the browser USE_SCALACHESS : set it to 'true' to use scalachess library and multi variant engine ACCEPT_VARIANTS : space separated list of variant keys to accept ( default : 'standard' ), for non standard variants USE_SCALACHESS has to be set to 'true' , example : 'standard crazyhouse chess960 kingOfTheHill threeCheck antichess atomic horde racingKings fromPosition' ACCEPT_SPEEDS : space separated list of speeds to accept ( default : 'bullet blitz rapid classical' ), to allow correspondence set ALLOW_CORRESPONDENCE to 'true' DISABLE_RATED : set it to 'true' to reject rated challenges DISABLE_CASUAL : set it to 'true' to reject casual challenges DISABLE_BOT : set it to 'true' to reject bot challenges DISABLE_HUMAN : set it to 'true' to reject human challenges GAME_START_DELAY : delay between accepting challenge and starting to play game in seconds ( default : 2 ) CHALLENGE_INTERVAL : delay between auto challenge attempts in minutes ( default : 30 ) CHALLENGE_TIMEOUT : start attempting auto challenges after being idle for that many minutes ( default : 60 ) USE_NNUE : space separated list of variant keys for which to use NNUE ( default: 'standard chess960 fromPosition' ) USE_LC0 : set it to 'true' to use Lc0 engine, only works with Windows and goorm installation, on Heroku and Gitpod you should not use it or set it to false USE_POLYGLOT : set it to 'true' to use polyglot opening book WELCOME_MESSAGE : game chat welcome message ( delay from game start : 2 seconds , default : 'coded by @hyperchessbotauthor' ) GOOD_LUCK_MESSAGE : game chat good luck message ( delay from game start : 4 seconds , default : 'Good luck !' ) GOOD_GAME_MESSAGE : game chat good game message ( delay from game end : 2 seconds , default : 'Good game !' ) DISABLE_SYZYGY : set it to 'true' to disable using syzygy tablebases, note that syzygy tablebases are always disabled when USE_LC0 is set to 'true', syzygy tablebases are only installed for deployment on Heroku APP_NAME : Heroku app name ( necessary for interactive viewing of MongoDb book ) ABORT_AFTER : abort game after that many seconds if the opponent fails to make their opening move ( default : 120 ) DECLINE_HARD : set it to 'true' to explicitly decline unwanted challenges ( by default they are only ignored and can be accepted manually )
pmarcum
BibFile Manager acts as a cross-referencing "electronic file cabinet" to help researchers organize, annotate, and easily retrieve research materials like journal articles. An ASCII .bib file is generated every time a new journal article is added to the reference library through BibFile Manager. BibFile Manager is a Google Apps Script attached to a Google Sheet. The script provides a PDF viewer that can be used to make comments (annotations) within a journal article, and to tag the paper with user-defined topics. Annotations are treated as separate documents for the purpose of topic-tagging, and therefore can be found independently of the host paper in search queries. A somewhat crude (at the moment) but efficient search engine is also made available through BibFile Manager which uses the tagged topics as search keys to find specific papers and/or annotations.
armankarimpour
Welcome to Hyper Bot ! Create your own permanent Hyper Bot ( runs on Heroku, no Lc0 ) If you want to create your own permanent bot, do the following: Sign up to GitHub https://github.com/join , if you have not already. With your GitHub account visit https://github.com/hyperchessbot/hyperbot , then click on Fork. Create a BOT account if you do not already have one. To create one use an account that has not played any games yet, log into this account, then visit https://hypereasy.herokuapp.com/auth/lichess/bot , approve oauth and then on the page you are taken to click on 'Request upgrade to bot'. Create an API access token with your BOT account at https://lichess.org/account/oauth/token ( should have scopes Read incoming challenges / Create, accept, decline challenges / Play games with the bot API ) Sign up to Heroku https://signup.heroku.com/ , if you have not already. At Heroku create a new app using New / Create new app. Choose Europe for region. In the app's dashboard go to the Deploy tab. Use the GitHub button to connect the app to your forked repo. Press Search to find your repositories, then select hyperbot. You need to deploy the master branch. Enable Automatic Deploys and press Deploy Branch, for the initial deploy. Wait for the build to finish. In Heroku Settings / Reveal Config Vars create a new variable TOKEN and set its value to your newly created access token, then create a new variable BOT_NAME and set its value to your bot's lichess username. For more detailed instructions and screenshots on setting up your Heroku app refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Creating-and-configuring-your-app-on-Heroku#creating-and-configuring-your-app-on-heroku . Congratulations, you have an up and running lichess bot. If you want to use 3-4-5 piece tablebases on Heroku, refer to this guide https://github.com/hyperchessbot/hyperbot/wiki/Update-Heroku-app-to-latest-version-using-Gitpod#enabling-syzygy-tablebases . Upgrade to bot and play games in your browser To upgrade an account, that has played no games yet, to bot, and to make this bot accept challenges and play games in your browser, visit https://hypereasy.herokuapp.com . For detailed instructions see https://lichess.org/forum/off-topic-discussion/hyper-easy-all-variants-lichess-bot-running-in-your-browser#1 . Update Heroku app to latest version using Gitpod Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Update-Heroku-app-to-latest-version-using-Gitpod#update-heroku-app-to-latest-version-using-gitpod . Creating a MongoDb account Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Creating-a-MongoDb-account#creating-a-mongodb-account . Build external multi game PGN file with MongoDb book builder ( version 2 ) Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Build-book-from-external-multi-game-PGN-file#build-book-from-external-multi-game-pgn-file . Install bot on Windows ( runs Lc0 ) Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Install-bot-on-Windows-(-runs-Lc0-)#install-bot-on-windows--runs-lc0- . Install bot on goorm.io ( runs Lc0 ) Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Install-bot-on-goorm.io-(-runs-Lc0-)#install-bot-on-goormio--runs-lc0- . Download a net for Lc0 Dowload a net from https://lczero.org/dev/wiki/best-nets-for-lc0 . Rename the weights file 'weights.pb.gz', then copy it to the 'lc0goorm' folder. Overwrite the old file. Update to latest version on Windows / goorm Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Update-to-latest-version-on-Windows-or-goorm#update-to-latest-version-on-windows--goorm . Explanation of files Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Explanation-of-files#git . Contribute to code Refer to this Wiki https://github.com/hyperchessbot/hyperbot/wiki/Contribute-to-code#contribute-to-code . Discussion / Feedback Discuss Hyper Bot on Discord https://discord.gg/8m3Muay . Post issues on GitHub https://github.com/hyperchessbot/hyperbot/issues . Getting assistance in lichess PM You can seek assistance in lichess PM using your BOT account. Open an issue at https://github.com/hyperchessbot/hyperbot/issues with the GitHub account on which your forked Hyper Bot, with the title 'Identifying lichess account'. Give a link to your lichess account in the issue. After identification you can PM https://lichess.org/@/hyperchessbotauthor . Seeking assistance in lichess PM without verifying your lichess account with your GitHub account may get you blocked. The block may be lifted once you identify your lichess account with your GitHub account. Config vars KEEP_ALIVE_URL : set this to the full link of your bot home page ( https://[yourappname].herokuapp.com , where change [yourappname] to your Heroku app name ) if you want your bot to be kept alive from early morning till late night Heroku server time, keeping alive a free Heroku bot for 24/7 is not possible, because a free Heroku account has a monthly quota of 550 hours ALWAYS_ON : requires paid Heroku account, set it to 'true' to keep the bot alive 24/7, you have to set KEEP_ALIVE_URL to your bot's full home page link for ALWAYS_ON to work ( see also the explanation of KEEP_ALIVE_URL config var ) ALLOW_CORRESPONDENCE : set it to 'true' to allow playing correspondence and infinite time control games CORRESPONDENCE_THINKING_TIME : think in correspondence as if the bot had that many seconds left on its clock ( default : 120 ), the actual thinking time will be decided by the engine MONGODB_URI : connect URI of your MongoDb admin user ( only the host, no slash after the host, do database specified, no query string ), if defined, your latest games or games downloaded from an url ( version 2 only ) will be added to the database on every startup, by default this config var is not defined USE_MONGO_BOOK : set it to 'true' to use the MongoDb book specified by MONGODB_URI DISABLE_ENGINE_FOR_MONGO : set it to 'true' to disable using engine completely when a MongoDb book move is available ( by default the bot may ignore a MongoDb book move at its discretion and use the engine instead for better performance and to allow for more varied play ) MONGO_VERSION : MongoDb book builder version, possible values are 1 ( default, builds a book from bot games as downloaded from lichess as JSON ), 2 ( builds a book from bot games as downloaded from lichess as PGN, or from an arbitrary url specified in PGN_URL ) PGN_URL : url for downloading a multi game PGN file for MongoDb book builder ( version 2 only ) MAX_GAMES : maximum number of games to be built by MongoDb book builder GENERAL_TIMEOUT : timeout for event streams in seconds ( default : 15 ) ENGINE_THREADS : engine Threads uci option ( default : 1 ) ENGINE_HASH : engine Hash uci option in megabytes ( default : 16 ) ENGINE_CONTEMPT : engine Contempt uci option in centipawns ( default : 24 ) ENGINE_MOVE_OVERHEAD : engine Move Overhead uci option in milliseconds ( default : 500 ) ALLOW_PONDER : set it to 'true' to make the bot think on opponent time BOOK_DEPTH : up to how many plies into the game should the bot use the book, choosing too high book depth is running the risk of playing unsound moves ( default : 20 ) BOOK_SPREAD : select the move from that many of the top book moves, choosing to high book spread is running the risk of playing unsound moves ( default : 4 ) BOOK_RATINGS : comma separated list of allowed book rating brackets, possible ratings are 1600, 1800, 2000, 2200, 2500 ( default : '2200,2500') BOOK_SPEEDS : comma separated list of allowed book speeds, possible speeds are bullet, blitz, rapid, classical ( default : 'blitz,rapid' ) LOG_API : set it to 'true' to allow more verbose logging, logs are available in the Inspection / Console of the browser USE_SCALACHESS : set it to 'true' to use scalachess library and multi variant engine ACCEPT_VARIANTS : space separated list of variant keys to accept ( default : 'standard' ), for non standard variants USE_SCALACHESS has to be set to 'true' , example : 'standard crazyhouse chess960 kingOfTheHill threeCheck antichess atomic horde racingKings fromPosition' ACCEPT_SPEEDS : space separated list of speeds to accept ( default : 'bullet blitz rapid classical' ), to allow correspondence set ALLOW_CORRESPONDENCE to 'true' DISABLE_RATED : set it to 'true' to reject rated challenges DISABLE_CASUAL : set it to 'true' to reject casual challenges DISABLE_BOT : set it to 'true' to reject bot challenges DISABLE_HUMAN : set it to 'true' to reject human challenges GAME_START_DELAY : delay between accepting challenge and starting to play game in seconds ( default : 2 ) CHALLENGE_INTERVAL : delay between auto challenge attempts in minutes ( default : 30 ) CHALLENGE_TIMEOUT : start attempting auto challenges after being idle for that many minutes ( default : 60 ) USE_NNUE : space separated list of variant keys for which to use NNUE ( default: 'standard chess960 fromPosition' ) USE_LC0 : set it to 'true' to use Lc0 engine, only works with Windows and goorm installation, on Heroku and Gitpod you should not use it or set it to false USE_POLYGLOT : set it to 'true' to use polyglot opening book WELCOME_MESSAGE : game chat welcome message ( delay from game start : 2 seconds , default : 'coded by @hyperchessbotauthor' ) GOOD_LUCK_MESSAGE : game chat good luck message ( delay from game start : 4 seconds , default : 'Good luck !' ) GOOD_GAME_MESSAGE : game chat good game message ( delay from game end : 2 seconds , default : 'Good game !' ) DISABLE_SYZYGY : set it to 'true' to disable using syzygy tablebases, note that syzygy tablebases are always disabled when USE_LC0 is set to 'true', syzygy tablebases are only installed for deployment on Heroku APP_NAME : Heroku app name ( necessary for interactive viewing of MongoDb book ) ABORT_AFTER : abort game after that many seconds if the opponent fails to make their opening move ( default : 120 ) DECLINE_HARD : set it to 'true' to explicitly decline unwanted challenges ( by default they are only ignored and can be accepted manually )
Cazeho
Computer science 50 artificial inteligence is a course by Harvard University. This course explores the concepts and algorithms at the foundation of modern artificial intelligence, diving into the ideas that give rise to technologies like game-playing engines, handwriting recognition, and machine translation. Through hands-on projects, students gain exposure to the theory behind graph search algorithms, classification, optimization, reinforcement learning, and other topics in artificial intelligence and machine learning as they incorporate them into their own Python programs. By course’s end, students emerge with experience in libraries for machine learning as well as knowledge of artificial intelligence principles that enable them to design intelligent systems of their own.
nivaangupta
A news website that provides summarised news on trending topics, popular topics and searched topics. It is coded in python using the streamlit, BeautifulSoup, urllib, newspaper and nltk library. The app is further deployed on AWS via an EC2 instance and made available publicly for viewing news in the internet. It uses NLP and Web Scraping.
udayansawant
Trends-in-Programming-Languages We’re always staying on the pulse of the software development industry so that we can better prepare our students for rapidly – changing technology job market. Many of the students and developers in general are interested in working at top startups and tech companies. How can we tell what programming languages and technologies are used by the most people? How about what languages are growing, and which are shrinking so that we can tell which are most worth investing time in? One excellent source of data is Stack Overflow, a programming question and answer site with more than 16 million questions on programming topics. By measuring the number of questions about each technology, we can get an approximate sense of how many people are using it. We're going to use open data from the Stack Exchange Data Explorer to examine the relative popularity of languages like R, Python, Java and JavaScript have changed over time. Each Stack Overflow question has a tag, which marks a question to describe its topic or technology. For instance, there's a tag for languages like R or Python, and for packages like ggplot2 or pandas. The dataset used, contains one observation for each tag in a year. The dataset also includes both the number of questions asked in that tag in the year and the total number of questions asked in that year Rather than just the counts of the tags, the concern here is the percentage change: the fraction of questions that year have that tag What are the most asked - about tags? It's sure been fun to visualize and compare tags over time. The dplyr and ggplot2 tags may not have as many questions as R, but we can tell they're both growing quickly as well. We might like to know which tags have the most questions overall, not just within a particular year. #The TIOBE Programming Community index is an indicator of the popularity of programming languages. The index is updated once a month. The ratings are based on the number of skilled engineers world-wide, courses and third-party vendors. Popular search engines such as Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube and Baidu are used to calculate the ratings. It is important to note that the TIOBE index is not about the best programming language or the language in which most lines of code have been written. (https://www.tiobe.com/tiobe-index/) Comparing R and Python There is a lot of heated discussion over the topic, but there are some great, thoughtful articles as well. Some suggest Python is preferable as a general-purpose programming language, while others suggest data science is better served by a dedicated language and toolchain. The origins and development arcs of the two languages are compared, often to support differing conclusions. For individual data scientists, some common points to consider: • Python is a great general programming language, with many libraries dedicated to data science. • Many (if not most) general introductory programming courses start teaching with Python now. • Python is the go-to language for many ETL and Machine Learning workflows. • Many (if not most) introductory courses to statistics and data science teach R now. • R has become the world’s largest repository of statistical knowledge with reference implementations for thousands, if not tens of thousands, of algorithms that have been vetted by experts. The documentation for many R packages includes links to the primary literature on the subject. • R has a very low barrier to entry for doing exploratory analysis, and converting that work into a great report, dashboard, or API. • R with RStudio is often considered the best place to do exploratory data analysis. (https://blog.rstudio.com/2019/12/17/r-vs-python-what-s-the-best-for-language-for-data-science/)
helena-skowronska
An improved search engine for BUW.
m-makhkamova
An app enables you to discover e-library full of books in diverse topics for different ages. Search you favorite book, read descriptions, rate it and give your feedback.
Naoghuman
`Lib-Tag` is a library to use and handle easily [Tag]s in your [JavaFX] & [Maven] application. A `Tag` is a simple [String] which can be used for example in a [Button], [Label] or another [JavaFX] components. Suchlike tagged topics can be easily searched or analyzed for a `Tag`.
DineshBahadurShahi
A Streamlit-based web application that offers summarized news from various sources. Users can access trending news, search by custom topics, or explore news in specific categories. This project uses RSS feeds from Google News and the Newspaper3k library to provide concise summaries and relevant images for each news article.
saranshqm
The medical literature is enormous. Pubmed, a database of medical publications maintained by the U.S. National Library of Medicine, has indexed over 23 million medical publications. Further, the rate of medical publication has increased over time, and now there are nearly 1 million new publications in the field each year, or more than one per minute. The large size and fast-changing nature of the medical literature has increased the need for reviews, which search databases like Pubmed for papers on a particular topic and then report results from the papers found. While such reviews are often performed manually, with multiple people reviewing each search result, this is tedious and time consuming. In this problem, we will see how text analytics can be used to automate the process of information retrieval.
sumit0002
Your PPC account is never perfect. Hopefully, that doesn’t come as a surprise to you. The truth of the matter is that no matter how hard you work on building an account and optimizing it according to best practices, you will probably miss something. An even truer statement is that the longer you work in an account, the easier it is for things to slip past your ever-watchful eye. What is a PPC account audit? An account audit is a dive into your account to determine areas that could use further attention or work to improve performance. We’ll outline the actual process of the audit shortly. When and why should I audit? There’s never a bad time to audit your account because you’ll typically find something to help improve performance. However, you don’t particularly want to audit your account after a recent strategy change or account update. You could be auditing based on skewed information and nobody wants that. The most important time to audit your account is if you’re having performance issues. It’s also a good idea to periodically audit an account if it has been managed by the same person or team for a long time. Who should perform the audit? This is a tricky question, because it really depends. If there is a particular issue in the account that needs auditing, take the time yourself and dig in to the areas that may be impacting performance. However, if you’re talking about a more comprehensive check, it may be better to outsource the project and get fresh eyes. No matter how much you try to deny it, as an account manager you have a slight inability to look at something you uploaded and thought would work and say “Nope, not working, have to stop it.” And as we’ve already mentioned a couple times, it’s very easy to overlook the “basics” and assume you have everything set up correctly or just skip stuff because there’s no way you’d set your campaign to target the Search and Display networks at the same time, right? Where should you be looking? Let’s get to the meat and potatoes of this guide, shall we? The following checklist outlines all the different account areas you can dive in to during an account audit and what kinds of items to look for. The Basics of an Account Audit Date Range First things first as you need to make sure you’re looking at a long enough range of time to analyze relevant data. It doesn’t do you any good to look at 30-day’s worth of conversion data and to make changes based on solely that information. Odds are that data isn’t statistically relevant enough. At the very least, we like to observe at least 3-months’ worth of data. If we’re diagnosing a specific issue, a year’s worth of data is preferable when doing a general audit. KPIs Knowing the most important metrics to a client is the best way to ground your audit in success. If it’s an account you’re managing, we would imagine you have KPI’s picked out. It may be worth a quick check with your client to make sure you’re focusing correctly. Also, if you’re helping a fellow account manager whose account you don’t typically look at, determine the key metrics to dive in to. Settings This is usually one of our favorite areas of an account to audit because specific settings tend to be something that are set up when a campaign is started and then never looked at again. A big win in this area is if a campaign is targeting Search and Display traffic within one campaign, which we find more often than you may guess. From here you can also check out device bid modifiers, ad delivery method, ad rotation (optimizing for clicks when goals are based around conversions?), location/language targeting, and ad scheduling. Modifiers can sometimes impact performance more than expected. It’s worth double checking to see if changes were made when performance came into question. Account Structure Campaigns The first item to look at with campaigns is whether the naming structure makes sense and is easily understandable. Essentially, are the campaigns numbered 1-20 or do they have unique names that explain what kind of ad groups I’m going to find? As we talked about before, are the campaigns opted in to the Search or Display network only? Are Interest Category or Topics campaigns broken out in to their own campaigns or folded in to a general Display campaign? Reviewing campaign structure is where we start to determine if the rest of the account structure is going to follow a sensible method or if the remainder of the audit is going to require some Sherlock Holmes-style decoding on our part. Ad Groups Assuming the campaign structure is laid out in a regimented way, the next item to look at is how the ad groups are set up. For instance, if you’ve got general product categories as your campaigns, are the ad groups the subcategories for the main category? Does each ad group have a maximum of 20 keywords in it? You want to make sure you don’t have an ad group that’s too wide reaching, as it will make ad copy writing to match the terms difficult. Keywords When auditing keywords, you want to review the match types. If most the terms are broad match, some expansion for increased ROI could be completed by adding modified broad, phrase, and exact match terms. If the account is relying predominantly on broad match, is there a logical negative keyword strategy in place to weed out irrelevant traffic? Further, has broad modified match been implemented? Are bids set too high or low to produce results or maintain goals? Finally, we like to take a look at a search term report and see if some keywords that bring a lot of traffic or conversions to the account still need to be added to the account structure to increase profitable reach. Quality Score When it comes to Quality Score, you must realize what you may uncover here could take some time to correct. So, unlike settings or some structure issues, there isn’t a single way to begin correcting course. The most important part of this portion of the audit is to pull a few key reports and analyze them. The team at PPC Hero adamantly stands by using pivot tables to dig in to determining your Quality Score picture on an average position level. Be sure you save all this work and reporting (not that you shouldn’t be doing that with everything) so you can come back in a few weeks or a month after making Quality Score relevant changes and compare your progress. Remarketing First things first, are remarketing campaigns implemented? If there are, go to the shared library section of the account and look at the audiences that are set up for remarketing. Are they all collecting members? Is there an audience set up for each abandonment level? Can you find the cookie codes in the website code? Have all the cookies been set up with lengths that make sense? Analytics Not all accounts will have Analytics. Yes, this sounds crazy, but you first need to determine if there is an Analytics account (Google or otherwise) and if not, why not. Get one. It’s more than worth it. If there is an account, make sure it’s accurately attached to the paid search account. Has tracking code been placed on the website (ecommerce enabled, if applicable)? Are conversions or goals set up? Does the conversion data in Analytics match the engine interface (or at least close to it)? How are metrics performing (bounce rate, time on site, etc.)? Pull a site search report and see if there are new keyword opportunities to add to the paid search account. Have you looked through multi-channel funnels for any insights? For more details on our products and services, please feel free to visit us at Best Online Marketing Company, Online Marketing Company, Online Marketing Companies, Online Marketing & Social Media Marketing
ChidozieGabriel
Search for popular posts on a topic (using React library)
riazulrocky
Fetches and displays the latest trending search topics for a specified region using the Pytrends library.
Angi-Adema
This server side API was designed to provide a search tool for Library of Congress research topics.
R-Llewellyn96
Targeted Tweet Analyser which uses Stanford's Natural Language Processing Library to perform sentiment analysis and a targeted keyword search for different topics.
SpartanDeBoss
Giphy Search is a search engine for finding and sharing animated GIFs. It has a vast library of GIFs covering various topics and moods. Its user-friendly interface and powerful search capabilities make it easy to express yourself in a fun and creative way.
vladbobu
PHPGtrends is a PHP library offering an interface to Google Trends, enabling easy data retrieval for trends analysis, including search interest over time, regional interest, related topics, and queries.
benthomas-24
This Jupyter notebook analyzes Google search trends for three key political topics—Tariffs, Gerrymandering, and Immigration—over a 6-month period (April-October 2025). Using the pytrends library, the analysis explores search interest patterns across multiple geographic levels.
Sobhan026
TextFusion is a Python library for text processing, offering text search, topic modeling, and regex-based data extraction/validation. It enables document search, clustering, and format validation (URLs, emails, dates). Ideal for building text-centric applications with easy-to-use, powerful tools.