Here you can add your email details and select your preferences for using this tool.
This tool automatically searches in your emails and downloads all the relevent invoices
Note: This tool only works with Gmail
Instructions
1. Go to your Google account
2. On that page, go to "Less secure app access" and turn this feature on.
3. Now in the form below enter your Email address and email account password
4. Agree to the terms and conditions
5. If doing a full search for invoices in the gmail, then select the start date and finish date to search
6. If you want to use the weekly search and upload feature select it in preferences
7. Click submit, and the invoices will be downloaded and processed automatically.


Web Components + WebComponentsMonkeyPatch playground
The purpose of this example is to build some sort of playground that demonstrates how to use 'raw' Web Components with the latest standard, unprefixed naming conventions. E.g. createShadowRoot instead of webkitCreateShadowRoot. It's a work in progress!
Templates
Are templates available in this browser? ???
You shouldn't be seeing this content:It means your browser is rendering the template


This is an app that is intended to allow it's users to execute the Pomodoro style of studying. To learn more about Pomodoro technique, check out this article. It is currently in it's Minimum Viable Product (MVP) state, meaning that the timer can/will count down based on the times you select in the drop downs. This web applicaiton is not perfect by any means, please feel free to help make it better by contributing on the repository.


In this tutorial, we use the terms “amplitude” and “frequency” to refer to the physical signal parameters, and “intensity” and “pitch” to refer to how people perceive these two parameters, respectively.
Let’s start with the simple case of a single-frequency sinusoidal displacement signal
$$x(t)=Acos(2πft)$$
where A denotes amplitude, f denotes frequency and t denotes time.
One way to measure the output of a tactor is to attach an accelerometer (a sensor that measures acceleration) to it.
The time derivative of x(t) is the velocity x'(t). The time derivative of x'(t) is the acceleration x''(t). It follows that
$$x''(t)= -A(2πf)^2 cos(2πft)=-Bcos(2πft)$$
where
$$B=A(2πf)^2$$
denotes the amplitude of the measured acceleration function. The amplitude of the displacement A can be calculated as follows:
$$A=B/(2πf)^2$$
Vibrations with the same physical amplitude A but at two different frequencies f1 and f2 may not feel equally intense. This is because human sensitivity to vibrations is frequency-dependent. Human detection threshold, an inverse to human sensitivity, is defined as the minimum vibration amplitude at which the vibration is barely detectable. It is usually plotted on a log scale relative to 1 micron; i.e.,
$$20log_10 [A/(1μ)]$$
Sensation level (SL) is specified in dB above Human Detection Threshold. For example, at 200 Hz, human detection threshold is about −15.0 dB relative to 1 micron. If the output of a tactor is measured at 1.0 g, or equivalently 9.81 m⁄s^2 , then the corresponding displacement amplitude is 6.21 micron, or equivalently 15.9 dB re 1 micron. Therefore the vibration intensity is 30.9 dB SL.
While vibrations at 0-10 dB SL are above detection threshold, they take some effort to notice. Vibrations at 10-30 dB SL are noticeable and comfortable. At 30-40 dB SL, vibrations may start to feel too intense for some people. Most people find vibrations above 50 dB SL to be too strong or even painful.
Many factors affect the human detection threshold, including body site, contact area, signal duration, skin-surface temperature, age, activity level (it is harder to notice the phone in the pocket vibrating when one is moving about), etc. The way a tactor is attached to the skin (via double-sided tapes, Velcro straps, rubber band, etc.) can also significantly alter the measured output of a tactor. All these factors affect the sensation level and the perceived intensity of vibrations.
CONTACT US!
Ready to start your next project with us? Have a topic to suggest for our online tutorials?
Give us a call or send us an email!
Dr. Hong Z. Tan
+1.765.490.5776
Email


HouseRecommendation
Login
Sign Up
Welcome to HouseRecommendation!
View All House
Recommendation for Customers
Recommendation for Landlord


#include <DiscordObject.h>
|
| json | api_call (const std::string &url, const std::string &method="GET", const json &data=json(), const std::string &content_type="", const bool cache=true) |
| | helper function to communicate with the http api More...
|
| |
|
| std::string | _token |
| | token to authentificate with the discord api More...
|
| |
◆ DiscordObject() [1/2]
| DiscordCPP::DiscordObject::DiscordObject |
( |
| ) |
|
|
inline |
◆ DiscordObject() [2/2]
| DiscordCPP::DiscordObject::DiscordObject |
( |
const std::string & |
token | ) |
|
◆ api_call()
| json DiscordCPP::DiscordObject::api_call |
( |
const std::string & |
url, |
|
|
const std::string & |
method = "GET" , |
|
|
const json & |
data = json() , |
|
|
const std::string & |
content_type = "" , |
|
|
const bool |
cache = true |
|
) |
| |
|
protected |
helper function to communicate with the http api
- Parameters
-
| [in] | url | Relative url |
| [in] | method | (optional) Method of the http request. Default is GET. |
| [in] | data | (optional) JSON data to send |
| [in] | content_type | (optional) the Content-Type of data |
| [in] | cache | (optional) wether to cache results or not (only GET requests can be cached) |
- Returns
- json::value API response
- Exceptions
-
◆ _token
| std::string DiscordCPP::DiscordObject::_token |
|
protected |
token to authentificate with the discord api
◆ id
| std::string DiscordCPP::DiscordObject::id |
The documentation for this class was generated from the following files:


"The #1 problem with the low-code movement is proprietary lock-in which is unacceptable for critical business apps. Budibase helps you create apps faster, which developers love because their internal tickets disappear and the entire thing is open source!"
Shawn (@swyx), Head of Dev Experience at Temporal; Ex Amazon and Netlify


Ticket 154 at GitHub. Ensure default theme and pieceStyle are set
This shows the default: theme == blue, pieceStyle == merida
This shows how to override the theme and style by using classes in HTML.
This shows how to override the theme and style by using parameters in the configuration.


Terms of Use
Overview
The Vulekamali Data Portal, contains national and provincial budget data from National Treasury (NT) and related data contributed by third parties.
Users are encouraged to utilise this data to leverage public participation in policy making and governance, to create value for developers, businesses, researchers, civil society and the public at large.
Subject to certain limitations summarized below, you are free to use the data on this portal and published through our APIs (Application Programming Interface) freely and flexibly, for both commercial and non-commercial purposes, at no cost.
1. Introduction
These Terms of Use manage the relationship between you (the user of this portal) and National Treasury (the portal owner) when you use the portal or the services this website provides. You may not use this website or any data obtained from it, if you do not agree to be legally bound by these Terms of Use, and any other terms or policies on this portal.
You are encouraged to use and re-use the data that is available on this portal and published through our APIs freely and flexibly, subject to the conditions set out in these Terms of Use.
Users are encouraged to utilise this data to leverage public participation in policy making and governance, to create value for developers, business, researchers, civil society and the public at large.
2. Usage of data
This portal contains data published by National Treasury (NT) as well as data owned and contributed by third parties.
2.1 Usage of data published by National Treasury
You may use, download, copy, publish, distribute and transmit the data published by NT and obtained from this portal and API freely and flexibly, including for commercial and non-commercial purposes, subject to the following conditions. You must:
- Acknowledge and reference the source of the data as National Treasury and the date of publication.
- Note how the data has been modified in your representation(s) thereof.
- Ensure that the data is not used to mislead others.
- Ensure that the use of the data does not affect the level of protection of individuals and their personal information provided for in applicable legislation.
- Not use the portal or the data in an unlawful way or to commit unlawful acts including committing a criminal offence, gaining unauthorised access to other computer systems and/or transmitting unlawful material.
- Not claim or imply that NT endorses your products, services, analysis or interpretation of the data.
- Adhere to all sections of this Terms of Use policy.
2.2 Usage of data contributed by third parties
This website contains data owned and contributed by third parties. You may use, download, copy, publish, distribute and transmit this third party data, subject to the following conditions. You must:
- Acknowledge and reference the source of the data as the name of the contributor, the date of publication, the location where the source data was downloaded as National Treasury and the date that the data was accessed.
- Note how the data has been modified in your representation(s) thereof.
- Abide by the terms of the licence under which the contributed data is published.
- Ensure that the data is not used to mislead others.
- Ensure that the use of the data does not affect the level of protection of individuals and their personal information provided for in applicable legislation.
- Not use the website or the data in an unlawful way or to commit unlawful acts including committing a criminal offence, gaining unauthorised access to other computer systems or transmitting unlawful material.
- Not claim or imply that NT endorses your products, services, analysis or interpretation of the data.
- Adhere to all sections of this Terms of Use policy.
3. Usage and Intellectual Property
- The trademarks and logos on this portal are not subject to the usage terms in the section above. These remain the property of NT and any other third party whose marks or logos may appear on the website or in the datasets. The trademarks and logos may only be used with prior written consent of NT or the appropriate third party.
- NT will not make claims to any intellectual property arising from applications or analysis of the data, or that of any data contributed by third parties, unless indicated as part of a specific event or work commissioned by the NT or one of its partners.
4. Contributing Data
NT encourages you to contribute relevant and appropriate data to be published on this website. You may only contribute data if you agree to these conditions:
- You own the data, or are authorised by the owner to publish it.
- If you are contributing data on behalf of an organisation, you have the organisation’s permission to contribute data on their behalf.
- You may only contribute data under your real name and/or under the real name of the relevant organisation.
- You provide as much metadata and background information on your dataset as possible, to help other users get the most value from your data.
- You contribute your data under one of the licences supported by the website, and agree to be bound by the terms of that licence.
- You agree that the website’s users may use your data under the terms of your chosen license.
- The data is error-free and accurate to the best of your knowledge.
- The data and supporting materials are not deliberately misleading.
- The data contributes meaningfully to the analysis, understanding, or use of South African budget data.
- Your data does not contain or install any viruses, worms, malware, trojan horses, bots or other harmful or destructive content.
- You agree not to hold NT liable for the safekeeping, curation, accuracy or use of the contributed data.
- You may request to remove data you have contributed by contacting us at<EMAIL_ADDRESS>- NT does not guarantee to publish a contributed dataset.
- Your contribution may be rejected or removed without notice if it violates applicable laws or this Terms of Use.
If you have any questions or concerns about contributing your data, please contact us at<EMAIL_ADDRESS>5. Discussions and Forum Contributions
You are entirely responsible for any comments, discussion forum posts, and links that you make on the portal. When you contribute such content to the portal, you agree that:
- the content does not contain or install any viruses, worms, malware, trojan horses, bots or other harmful or destructive content;
- the content is not spam, is not machine- or randomly-generated, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing);
- the content is not pornographic, does not contain threats or incite violence, and does not violate the privacy or publicity rights of any third party;
- your content is not named in a manner that misleads readers into thinking that you are another person or organisation;
your content does not in any way include a derogatory language and/or defamation of character of anyone; and - NT may remove content that does not adhere to these Terms of Use, without notification.
6. Disclaimer
- NT will endeavour to ensure that the NT data available on this website is complete, validated and updated regularly. However, NT cannot be held responsible for any incorrect data reported by a third party, a department or a province. Reliance on any data displayed on this portal is at the user’s own risk.
- NT does not verify or endorse data contributed by third parties or other government institutions and cannot be held responsible for the quality or validity of contributed data.
- NT accepts no liability whatsoever arising from or connected to, the accuracy, reliability, currency or completeness of any material contained on this website or on any linked site.
7. Warranty
- The use of this portal, its data and APIs is at your sole risk. NT makes no warranties or representations that the portal, its data or APIs will meet your requirements; will be available on an uninterrupted, timely secure, or error-free basis; will be accurate, reliable, free of viruses or other harmful codes; or will be complete, free from errors or omissions.
- The data provided on this portal and published through our APIs is made available on an “as is” basis and NT expressly disclaims all warranties of any kind related to the portal, its data and APIs, including warranties of merchantability, title, fitness for a particular purpose, non-infringement, compatibility, security, and accuracy and makes no express or implied representations or warranties regarding the content of the portal and that the portal has been compiled or supplied to meet the user's individual requirements. You are encouraged to report any possible errors, malfunctions or offensive material by using the feedback link.
- NT does not monitor or endorse any works derived from data available on this site, or any links to associated portal or entities, unless indicated otherwise.
- NT does not vouch for any analyses conducted with data retrieved from this site or through our APIs.
- Where there are links on the portal to resources maintained by third parties, NT makes no representations or warranties as to the accuracy of, or any other aspect relating to those resources, including but not limited to the security or trustworthiness of such resources.
8. Privacy
- NT may electronically collect personal information that you may provide to us when you sign up to our website or newsletter, or automatically when you visit our website or use its services. Personal information does not include de-identified or anonymous information.
- This personal information may be used to measure the number of visits, average time spent on the website, and determine the areas of use of the website in order to improve content. It may also be used to contact you with information about the website and its services. You may at any time request that we discontinue sending you such materials.
- NT takes your privacy seriously and will do everything reasonably possible to comply with all relevant laws that affect your information.
- Although NT may provide your information to service providers that handle information on its behalf, it will usually not share the information with third parties or other public entities for secondary or unrelated purposes unless otherwise disclosed at the point of collection. By providing information to NT through this website, you are consenting to such transfers.
- You acknowledge that it is possible for internet-based communications to be intercepted. Without the use of encryption, the internet is not a secure medium and privacy cannot be ensured. NT will not be responsible for any damages that the user or any third party may suffer as a result of the transmission of confidential information or disclosed information that you make to NT, or that you expressly or implicitly authorise NT to make, or for any errors or any changes made to any transmitted information.
9. Updating these Terms of Use
- This is version of 1.0 of the Terms of Use policy.
- NT reserves the right to change, modify, add to or remove from portions or the whole of these terms and conditions of use from time to time. Changes to these terms and conditions of use will take effect upon such changes being posted to this portal. It is your obligation to periodically check these terms and conditions of use at this portal for changes or updates. Your continued use of this portal following the posting of changes or updates will be considered notice of your acceptance to abide by and be bound by these terms and conditions of use, including such changes or updates.
- Should NT make any substantial changes, it may notify you by placing a notice on the portal.
10. Contact Information for Feedback and Requests
Should you come across any inconsistencies in the data or any problematic data on this portal that may need to be corrected or see any derogatory and defamatory posts on the portal, please do let us know by contacting us at<EMAIL_ADDRESS>We will endeavour to respond to all queries and comments as soon as possible.
11. Choice of Law
- These Terms of Use will be governed by the laws of the Republic of South Africa - the Promotion of Access to Information (PAIA) Act, the Protection of Personal Information (POPI) Act and any other relevant frameworks that require a professional and collegial conduct at all times, and the user consents to the jurisdiction of the High Court of South Africa, Gauteng Division, Pretoria in the event of any dispute.
- If any of the provisions of the Terms of Use are found by a court of competent jurisdiction to be invalid or unenforceable, that provision will be enforced to the maximum extent permissible so as to give effect to the intent of the Terms of use and the remainder of the Terms of Use will continue in full force.
- The Terms of Use constitutes the entire agreement between NT and the user with regard to the use of the data and this website.


Jamendo Mood (BETA)
What is your mood ?
Info
10 Most Popular Artist by Country
Country
...
Argentina
Brasil
Germany
France
United Kingdom
Italy
Spain
USA
City
Search
Blues Mood
Jamendo
Top 10 Listened
(BETA)
Top Listen
Top Popular
Top Download
New Entry
Home
Loading charts ... please wait!
Using Jamendo API 3.0
Location not available for this artist


Back
Sales statistics
Dynamic Slope
The slope for each segment depends on the ratio between the current and the next value
Dynamic Height
The height of the segment is the overall percentage for that dataItem
Neck Ratio
The ratio between the bases of the whole funnel element


{{#partial "page"}}
Available in two, eye-popping screen sizes - 100" and 80" - our Laser TVs boast the latest in display technology. Whether you want to see the hottest
Netflix movies or enjoy your favorite dramas, you need not go back to the local theater and risk your health.
At 80 or 100 inches, Hisense Laser TV proves that size does matter.
View RangeHisense Laser TV is a fusion of stunning imagery and solid acoustics. Equipped with award-winning Harman Kardon audio, Hisense Laser TV does not simply stimulate your sight and hearing - it captivates them. And with its cuttin-gedge laser light source technology, the Laser TV brings every frame and image to life.
4K Ultra HD picture quality.
8.3 million Pixels crammed inside an 80" or 100" diagonal.
Wide color gamut with accurate and vibrant colors.
The result is true-to-life imagery with stunning detail and clarity. Hisense's Laser TV breathes life to every frame by providing razor-sharp visuals with beautifully natural motion.
With Hisense Laser TV, your living room is now your cinema.
The future of television, Hisense Laser TV is simple to install, positioned at only 11.4 inches from the wall.
The L5 uses a blue laser light source to create crisp images with stunning detail while minimizing unwanted light dispersion for a more natural viewing experience.
Powered by Texas Instruments, DLP laser technology provides cinema-grade detail and brightness.
Hisense's Pure Color enhances every image to produce true-to-life color with laser-grade precision.
With more than 5,000 apps to download from Google's Play Store, the L5 is smarter than most televisions.
The L5 uses a blue laser light source to create crisp images with stunning detail while minimizing unwanted light dispersion for a more natural viewing experience.
Comes with built-in high dynamic range capabilities that produce a wider range of color and contrast for incredible depth and detail.
The L5 comes with 30W speakers for superior audio performance and rich, detailed sound.
With years of expertise in multimedia, home appliances, intelligent information, and service industries, Hisense has become one of the world's leading technology and electronics companies. The Qingdaobased manufacturer has ranked No.1 in TV industries in China and South Africa, with its operations expanding to 54 overseas companies. Hisense technology is no joke either; the company utilizes 14 state-of-the-art production facilities in Europe, Central America, and South Africa and boasts 12 R&D centers worldwide.
Needless to say, Hisense is serious in its dedication to make consumer's lives simpler, better, and more convenient through carefully-designed and well-built products.
For inquiries and suggestions, contact us through the following contact details:


https://portswigger.net/burp/documentation/collaborator/deploying
Installation and execution
The Burp Collaborator server is included in the same executable file as Burp Suite Professional itself. No license key is required to run your own instance of the server. The server can be started directly from the command line using the --collaborator-server argument, for example:
sudo java -jar burp.jar --collaborator-server
The server will fail to start if it cannot bind to the ports it needs to run its services. You will need to stop any other processes that are using these ports. By default, Burp Collaborator server listens on the following ports:
DNS: UDP port 53
HTTP: TCP port 80
HTTP: TCP port 443
SMTP: TCP ports 25 and 587
SMTPS: TCP port 465
Further, on Unix-based systems, you may need to run the server with root privileges in order to bind to these ports. Alternatively, you can configure the server to run on non-standard ports, and use port mapping to redirect the original ports.
When launching the Collaborator server, it is desirable to configure the JVM's memory handling and garbage collection, based on the expected usage. If you are running the Collaborator server on a desktop machine for a small number of expected users, you can reduce the amount of memory used by the JVM. The following command allows the heap to fluctuate between 10 and 200 MB, and for the JVM to spend 5% of its time in garbage collection, which typically uses less memory:
sudo java -Xms10m -Xmx200m -XX:GCTimeRatio=19 -jar burp.jar --collaborator-server
If you are running the Collaborator server on a dedicated machine to support a larger number of users, then it is efficient to fix the size of the heap to the amount of physical memory available, typically leaving 1Gb available for the operating system, JVM and any other running processes. For example:
sudo java -Xmx3g -Xms3g -jar burp.jar --collaborator-server
If the server is expected to be heavily used and has more than 4Gb of physical memory, it is recommended to switch to the G1 garbage collector, which significantly reduces the JVM pauses that can occur during garbage collection. For example:
sudo java -Xmx12g -Xms12g -XX:+UseG1GC -jar burp.jar --collaborator-server
To make full use of the Collaborator server's capabilities, you will generally also need to create a suitable configuration file.
Basic set-up on a closed network
A common use case for a private Collaborator server is to support a single tester (or a small team) working on a private closed network. If you are testing an application on a closed network with no Internet access, then of course the default public Collaborator server cannot be used.
In this situation, you can launch a basic Collaborator server instance using one of the commands in Installation and Execution, without the need for any configuration file. You then simply need to configure Burp to use your machine's IP address as its Collaborator server.
In this set-up, the Collaborator will not support custom DNS resolution or valid trusted HTTPS connections. However, you will still be able to use the basic Collaborator features to detect issues like external HTTP interactions.
Running on non-standard ports
If you wish to run the Collaborator server as a non-root user, you will need to configure it to run on non-standard ports. You will also need to configure your operating system to map the original ports to the custom ports you are using. Typically, you will need to configure mappings for incoming TCP and UDP connections, and also for outgoing UDP responses.
You can configure the Collaborator server to use non-standard ports using its configuration file. For example:
{
"serverDomain" : "burpcollaborator.example.com",
"eventCapture": {
"http": {
"ports" : 8080
},
"https": {
"ports" : 8443
},
"smtp": {
"ports" : [8025, 8587]
},
"smtps": {
"ports" : 8465
}
},
"dns": {
"ports" : 8053
}
}
Note that the "ports" value can be a single port number or an array of port numbers, if you want to listen for a service on multiple ports. By default, the Collaborator server listens for SMTP interactions on ports 25 and 587.
DNS configuration
Burp Collaborator by default runs a DNS service for a specific domain, and to make use of this you will need a dedicated domain or subdomain for the Collaborator to use. You can omit the DNS capability and access the Collaborator server only by IP address; however, this configuration is less effective at detecting various vulnerabilities.
If you are running Burp Collaborator on the public Internet, you can purchase a dedicated domain (e.g. example.com), or use a subdomain of a domain that you already own and use (e.g. burpcollaborator.example.com). If your installation will be restricted to an internal network, you can choose any dedicated internal domain.
The Collaborator server needs to know which domain it controls so that it can serve the appropriate DNS records. This is configured in the Collaborator configuration file. For example:
{
"serverDomain": "burpcollaborator.example.com"
}
You will also need to configure your domain so that DNS for the domain is delegated to your Collaborator server. The details of this will depend on your set-up. Most domain registrars provide a web interface allowing you to configure the authoritative DNS servers for your domain.
If you are using example.com as the domain for your Collaborator server, you will need to configure the domain to use the following name servers:
ns1.example.com
ns2.example.com
You will also need to configure glue records to associate each of these with the IP address of your Collaborator server. If your domain registrar requires each configured DNS server for the domain to reside on a different IP address, then you might need to configure two public IP addresses on your Collaborator server.
Note: It is not possible to avoid the use of the Collaborator DNS service by simply editing the hosts file of the target server being tested. When employing the Collaborator server in its testing, Burp uses randomly generated subdomains of the main configured domain. Host files do not support wildcards and so cannot be used to route queries with randomly generated subdomains.
SSL configuration
Burp Collaborator runs HTTPS and SMTPS services for capturing interactions initiated by tested systems, and to serve polling requests made by Burp Suite. Typically, SSL connections to the Collaborator server will only succeed if the Collaborator has been configured with a valid wildcard SSL certificate for the domain name being used. SSL certificates can be configured using the Collaborator configuration file.
If you do not have a valid wildcard SSL certificate for your domain, then Burp Collaborator can create a self-signed certificate. For example, the following configuration will create a self-signed wildcard certificate for *.burpcollaborator.example.com:
"ssl": {
"hostname" : "burpcollaborator.example.com"
}
Using a self-signed certificate may be sufficient if you are able to install the certificate as trusted on the target server you are testing, or if the target application does not validate SSL certificates.
If you have purchased a valid wildcard SSL certificate for your domain, you can obtain the certificate from your Certificate Authority (CA), and install it in your Collaborator server. In this example, we have generated a Certificate Signing Request (CSR) using OpenSSL, and the CA has provided the certificate and an intermediate certificate.
With OpenSSL, the default format for keys is the traditional SSLeay format. These need to be converted to PKCS8 before the Collaborator server can import them. The OpenSSL command to do this conversion is:
openssl pkcs8 -topk8 -inform PEM -in keys/burpcollaborator.example.com.key -outform PEM -out keys/burpcollaborator.example.com.key.pkcs8 -nocrypt
SSL certificates can be configured using the Collaborator configuration file. The following example configuration file demonstrates how to load the private key, the certificate, and the intermediate certificate:
"ssl": {
"certificateFiles" : [
"keys/burpcollaborator.example.com.key.pkcs8",
"keys/burpcollaborator.example.com.crt",
"keys/intermediate.crt"]
}
Note: The certificate files must be specified in the correct order: private key, certificate, intermediate certificate(s).
Alternatively, you can generate a CSR using the Java keytool, and import the resulting certificate into the Java keystore of the server. In this situation, you can configure the Collaborator to load the certificate using:
"ssl": {
"keystore": {
"path" : "myKeystore.jks",
"password" : "myPassword"
}
If you have configured separate network interfaces for interaction events and polling, you will need to configure SSL separately for each interface.
Interaction events and polling
The Collaborator server supports two types of incoming communications from clients:
Interaction events - These occur when a target application being tested initiates some kind of interaction with the Collaborator server, for example a DNS lookup or an HTTP request.
Polling requests - These occur when an instance of Burp asks the Collaborator server whether any interaction events have occurred resulting from its payloads.
By default, the Collaborator server handles both interaction events and polling requests on the same network interface. If you wish, you can configure the Collaborator to use different interfaces (or ports) for serving polling requests. This facility can be used to work around firewall restrictions, or to control access to the polling function at the network layer.
You can configure a separate polling interface using the optional "polling" section of the Collaborator configuration file. If you do this, you can use the same wildcard SSL certificate for both interfaces, and let the Collaborator server's DNS service direct polling requests to the correct interface. With this set-up, you will only need to configure the server location in the Burp Collaborator Server options, and Burp will automatically prepend "polling." to the server domain when performing polling requests. The Collaborator's DNS service will resolve the polling subdomain to the public IP address of the separate polling interface. This provides the benefit of using separate interaction and polling interfaces while simplifying the configuration of the Burp client.
Metrics
The Collaborator server captures various usage metrics allowing administrators to monitor the performance and load of the server. These metrics can be useful to validate that the Collaborator machine is sufficiently powerful for its level of usage. Note that the metrics do not contain any data extracted from specific interaction events and polling requests.
Metrics data is accessible via the polling interface of the Collaborator server, and access can be controlled through the use of a shared secret URL path and a client IP address whitelist. Metrics are disabled by default but can be enabled using the optional "metrics" section of the Collaborator configuration file. For example:
"polling" : {
"publicAddress" : "<IP_ADDRESS>"
},
"metrics": {
"path" : "jnaicmez8",
"addressWhitelist" : ["<IP_ADDRESS>/24"]
},
With this configuration, metrics would be available to clients on the <IP_ADDRESS>/24 network at the URL:
https://<IP_ADDRESS>/jnaicmez8/metrics
Collaborator logging
You can configure logging to standard output, via the logLevel value in the configuration file. The available values are:
OFF - Nothing is logged.
ERROR - Unexpected exceptions are logged.
INFO - Information about configuration and services is logged at startup. This is the default value.
DEBUG - Details of Collaborator interactions and polling are logged, including source IP address and interaction IDs. Note that this might disclose sensitive information in the log output.
Testing the installation
When the server is deployed, you can use Burp Suite to test that is operating correctly. In Burp Suite Professional, configure the details of your server in the Burp Collaborator Server options, and run the health check function. Burp will then attempt to exercise each of the expected Collaborator functions, and will provide feedback of the success or failure of each function.
Collaborator configuration file format
All options for Burp Collaborator server are controlled using a configuration file. By default, the Collaborator server looks for a file called collaborator.config in the current working directory. This location can be overridden from the command line using the --collaborator-config argument, for example:
sudo java -jar burp.jar --collaborator-server --collaborator-config=myconfig.config
The configuration file uses a JSON format, with support for comments. Where IP addresses are required, you can configure either a single address or a list of addresses. For example, either of the following could be used to configure the local address(es) of a network interface:
"localAddress" : "<IP_ADDRESS>"
"localAddress" : ["<IP_ADDRESS>", "<IP_ADDRESS>"]
A complete sample configuration file, together with an explanation of each available option, is shown below:
{
"serverDomain" : "burpcollaborator.example.com",
"workerThreads" : 10,
"eventCapture": {
"localAddress" : ["<IP_ADDRESS>", "<IP_ADDRESS>"],
"publicAddress" : "<IP_ADDRESS>",
"http": {
"ports" : 80
},
"https": {
"ports" : 443
},
"smtp": {
"ports" : [25, 587]
},
"smtps": {
"ports" : 465
},
"ssl": {
"certificateFiles" : [
"keys/burpcollaborator.example.com.key.pkcs8",
"keys/burpcollaborator.example.com.crt",
"keys/intermediate.crt" ]
}
},
"polling" : {
"localAddress" : "<IP_ADDRESS>",
"publicAddress" : "<IP_ADDRESS>",
"http": {
"port" : 9090
},
"https": {
"port" : 9443
},
"ssl": {
"hostname" : "collaboratorpolling.example.com"
}
},
"metrics": {
"path" : "jnaicmez8",
"addressWhitelist" : ["<IP_ADDRESS>/24"]
},
"dns": {
"interfaces" : [{
"name": "ns1",
"localAddress" : "<IP_ADDRESS>",
"publicAddress" : "<IP_ADDRESS>"
}, {
"name" : "ns2",
"localAddress" : "<IP_ADDRESS>",
"publicAddress" : "<IP_ADDRESS>"
}],
"ports" : 53
},
"logLevel" : "INFO"
}
The definitions of the supported fields in the configuration file are shown below:
serverDomain The domain or subdomain which the Collaborator server will control DNS for. This setting is required for DNS functionality.
workerThreads The number of threads used by the Collaborator to process incoming requests.
eventCapture.localAddress By default, the Collaborator will listen on all local interfaces for capturing interaction events. If specified, it will only listen on the configured interfaces.
eventCapture.publicAddress The public IP address used for capturing interaction events.
eventCapture.http.ports The ports for listening for HTTP interaction events. This should only be changed from the default if port 80 is being forwarded.
eventCapture.https.ports The ports for listening for HTTPS interaction events. This should only be changed from the default if port 443 is being forwarded.
eventCapture.smtp.ports The ports for listening for SMTP interaction events. This should only be changed from the default if ports 25 and 587 are being forwarded.
eventCapture.smtps.ports The ports for listening for SMTPS interaction events. This should only be changed from the default if port 465 is being forwarded.
eventCapture.https.hostname Used to generate a self-signed certificate. See SSL configuration for more details.
polling.localAddress By default, the Collaborator will use the same network interface for capturing interaction events and serving polling requests. If specified, it will use a different interface for polling requests.
polling.publicAddress The public address used for serving polling requests.
polling.http.port The port to be used for polling over HTTP. This can be non-standard and Burp Suite will need to be configured to use it.
polling.https.port The port to be used for polling over HTTPS. This can be non-standard and Burp Suite will need to be configured to use it.
polling.https.hostname Used to generate a self-signed certificate. See SSL configuration for more details.
metrics.path URL path under at which the metrics page can be accessed.
metrics.whitelist A whitelist of client IP addresses allowed to access the metrics page.
dns.ports Ports for listening for DNS queries. This should only be changed from the default if port 53 is being forwarded.
dns.interfaces A list of local interfaces for listening for DNS queries. If your registrar requires that you configure a different IP address for each authoritative name server, you can use multiple network interfaces and configure their locations with this option.
dns.interfaces.name The hostname to use for the name server running on this interface. A different hostname should be used for each name server (e.g. ns1, ns2, etc.).
dns.interfaces.localAddress The local address to bind to for this name server.
dns.interfaces.publicAddress The public IP address corresponding to the configured local address. Typically, you will need to use the configured hostname and public IP address in your DNS record for your domain.
logLevel The level of logging required to standard output.


Bootstrap includes a responsive, mobile-first fluid grid system that appropriately scales up to 12 columns as the device or viewport size increases. It includes predefined classes for easy layout options, as well as powerful mixins for generating more semantic layouts.
| Tiny grid Phones (<480px) | Small grid Tablets (<768px) | Medium-large grid Desktops (>768px) | |
|---|---|---|---|
| Grid behavior | Horizontal at all times | Collapsed to start, horizontal above breakpoints | |
| Class prefix | .col- |
.col-sm- |
.col-xs- |
| # of columns | 12 | ||
| Nestable | Yes | ||
| Offsets | N/A | Yes | |
| Column ordering | N/A | Yes |
Using a single set of grid classes, you can create a basic grid system that starts out stacked on mobile and tablet devices before becoming horizontal on desktop devices.
Combining Mobile with DesktopDon't want your columns to simply stack in smaller devices? Use the small device grid system by adding .col-*
classes to the existing .col-xs-*
ones. See the example below for a better idea of how it all works.
Build on the previous example by creating even more dynamic and powerful layouts with tablet .col-sm-*
classes.
Move columns to the right using .col-offset-*
classes. These classes increase the left margin of a column by *
columns. For example, .col-offset-4
moves .col-xs-4
over four columns.
To nest your content with the default grid, add a new .row
and set of .col-xs-*
columns within an existing .col-xs-*
column. Nested rows should include a set of columns that add up to 12.
Easily change the order of our built-in grid columns with .col-md-push-*
and .col-md-pull-*
modifier classes.


I am a PhD student in the college of Engineering, Department of Computer Science, at North Carolina State University. I am currently a Research Assistant in the HINTS lab supervised by Dr. Thomas Price. I LOVE teaching and I am so passionate about helping students learn how to code. I am currently working on developing support features in block-based programming environments, investigating their effect on students’ performance and understanding students’ perceptions on these support features. If you want to know more about my research projects, click on "Research tab" above.
I am originally from Egypt. I got my bachelor's degree in Bioinformatics, Faculty of Computer and Information Sciences in Ain Shams University in Egypt in 2012. I earned my Master's degree from the British University in Egypt in 2016 and my thesis topic was on DNA Steganography (don't be surprised :D, I know this is completely unrelated to my current work but I love both :)).


Convert the output of npm ls --json to a dependency graph. For more info, visit the GitHub repo: https://github.com/pmuellr/npmls2dg
Drop a .json file on this page to have it's dependency graph rendered, like the sample below. Here's a sample you can download: npmls2dg.json
Generate the .json file by redirecting the output of npm ls into a .json file, in one of your projects' root directories. Here's an example using the --production flag, which only processes your dependencies and not your devDependencies.
npm ls --json --production > deps.json


|
GPGPU-Sim
|
Go to the source code of this file.
Functions | |
| uint32_t | _log2 (uint64_t num) |
| bool | is_pow2 (int64_t val) |
| int | powers (int base, int n) |
| double | logtwo (double x) |
| double | gate_C (double width, double wirelength, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | gate_C_pass (double width, double wirelength, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | drain_C_ (double width, int nchannel, int stack, int next_arg_thresh_folding_width_or_height_cell, double fold_dimension, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | tr_R_on (double width, int nchannel, int stack, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | R_to_w (double res, int nchannel, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | pmos_to_nmos_sz_ratio (bool _is_dram, bool _is_wl_tr) |
| double | horowitz (double inputramptime, double tf, double vs1, double vs2, int rise) |
| double | cmos_Ileak (double nWidth, double pWidth, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | simplified_nmos_leakage (double nwidth, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| int | factorial (int n, int m) |
| int | combination (int n, int m) |
| double | simplified_pmos_leakage (double pwidth, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | cmos_Ig_n (double nWidth, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | cmos_Ig_p (double pWidth, bool _is_dram, bool _is_cell, bool _is_wl_tr) |
| double | cmos_Isub_leakage (double nWidth, double pWidth, int fanin, enum Gate_type g_type, bool _is_dram, bool _is_cell, bool _is_wl_tr, enum Half_net_topology topo) |
| double | cmos_Ig_leakage (double nWidth, double pWidth, int fanin, enum Gate_type g_type, bool _is_dram, bool _is_cell, bool _is_wl_tr, enum Half_net_topology topo) |
| double | shortcircuit_simple (double vt, double velocity_index, double c_in, double c_out, double w_nmos, double w_pmos, double i_on_n, double i_on_p, double i_on_n_in, double i_on_p_in, double vdd) |
| double | shortcircuit (double vt, double velocity_index, double c_in, double c_out, double w_nmos, double w_pmos, double i_on_n, double i_on_p, double i_on_n_in, double i_on_p_in, double vdd) |
| uint32_t _log2 | ( | uint64_t | num | ) |
Definition at line 41 of file basic_circuit.cc.
| double cmos_Ig_leakage | ( | double | nWidth, |
| double | pWidth, | ||
| int | fanin, | ||
| enum Gate_type | g_type, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr, | ||
| enum Half_net_topology | topo | ||
| ) |
Definition at line 601 of file basic_circuit.cc.
| double cmos_Ig_n | ( | double | nWidth, |
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 450 of file basic_circuit.cc.
| double cmos_Ig_p | ( | double | pWidth, |
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 473 of file basic_circuit.cc.
| double cmos_Ileak | ( | double | nWidth, |
| double | pWidth, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 364 of file basic_circuit.cc.
| double cmos_Isub_leakage | ( | double | nWidth, |
| double | pWidth, | ||
| int | fanin, | ||
| enum Gate_type | g_type, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr, | ||
| enum Half_net_topology | topo | ||
| ) |
Definition at line 496 of file basic_circuit.cc.
Definition at line 420 of file basic_circuit.cc.
| double drain_C_ | ( | double | width, |
| int | nchannel, | ||
| int | stack, | ||
| int | next_arg_thresh_folding_width_or_height_cell, | ||
| double | fold_dimension, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 163 of file basic_circuit.cc.
Definition at line 412 of file basic_circuit.cc.
| double gate_C | ( | double | width, |
| double | wirelength, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 99 of file basic_circuit.cc.
| double gate_C_pass | ( | double | width, |
| double | wirelength, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 131 of file basic_circuit.cc.
| double horowitz | ( | double | inputramptime, |
| double | tf, | ||
| double | vs1, | ||
| double | vs2, | ||
| int | rise | ||
| ) |
Definition at line 337 of file basic_circuit.cc.
| bool is_pow2 | ( | int64_t | val | ) |
Definition at line 61 of file basic_circuit.cc.
| double logtwo | ( | double | x | ) |
Definition at line 90 of file basic_circuit.cc.
| double pmos_to_nmos_sz_ratio | ( | bool | _is_dram, |
| bool | _is_wl_tr | ||
| ) |
Definition at line 319 of file basic_circuit.cc.
Definition at line 78 of file basic_circuit.cc.
| double R_to_w | ( | double | res, |
| int | nchannel, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 288 of file basic_circuit.cc.
| double shortcircuit | ( | double | vt, |
| double | velocity_index, | ||
| double | c_in, | ||
| double | c_out, | ||
| double | w_nmos, | ||
| double | w_pmos, | ||
| double | i_on_n, | ||
| double | i_on_p, | ||
| double | i_on_n_in, | ||
| double | i_on_p_in, | ||
| double | vdd | ||
| ) |
Definition at line 773 of file basic_circuit.cc.
| double shortcircuit_simple | ( | double | vt, |
| double | velocity_index, | ||
| double | c_in, | ||
| double | c_out, | ||
| double | w_nmos, | ||
| double | w_pmos, | ||
| double | i_on_n, | ||
| double | i_on_p, | ||
| double | i_on_n_in, | ||
| double | i_on_p_in, | ||
| double | vdd | ||
| ) |
Definition at line 725 of file basic_circuit.cc.
| double simplified_nmos_leakage | ( | double | nwidth, |
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 389 of file basic_circuit.cc.
| double simplified_pmos_leakage | ( | double | pwidth, |
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 427 of file basic_circuit.cc.
| double tr_R_on | ( | double | width, |
| int | nchannel, | ||
| int | stack, | ||
| bool | _is_dram, | ||
| bool | _is_cell, | ||
| bool | _is_wl_tr | ||
| ) |
Definition at line 251 of file basic_circuit.cc.


Made with ♥ by VCUarts
Contributers: Mark Luetke & Cody Whitby
A terminal is an interface for typing text based commands.
Efficiency, Efficiency, Efficiency.
Most modern professional web development tools are command line based. Not knowing even the most basic terminal commands is a serious handicap.
It's not hard.
Everything is going to be fine.
X-Code must be installed. Available for free in the App Store.
$ cd
$ ls
$ mkdir
$ touch
$ open
Change directory
#change to root directory
$ cd ~
#change to myproject directory
$ cd github/projects/myproject
#move back a single directory
$ cd ..
#move back three directories
$ cd ../../../
Tip: use TAB to autocomplete
List directory contents
$ ls
aDirectory anotherFile.txt aPic.jpg
myFile.txt file.txt
create a new directory
#create mydirectory within the current directory
$ mkdir mydirectory
create a new file
#create mynewfile.txt within the current directory
$ mkdir touch mynewfile.txt
open a file or directory
#open the current directory in finder
$ open .
#open textfile.txt with it's the default program
$ open textfile.txt
#open textfile.txt with pages
$ open -a pages textfile.txt
Terminal Cheatsheet for Mac ( basics )
There are many more commands that exist, so many that it is possible to work exclusively from the command line.
Like many things in web development, this is yet another very deep rabbit hole...Git is an open source program for tracking changes in files
Git saves the entire history of a project allowing you to restore to any point. It pretty much makes efficient collaborative programming possible and you WILL need to understand it if you do any sort of professional development work with a team.
Efficiency, Efficiency, Efficiency. Professional developers live in their terminal and the command line is the native implementation of Git.
$ git init
$ git status
$ git add
$ git commit
$ git fetch
$ git pull
$ git push
creates a .git directory
$ git init
displays the status of our repo, any changes, new files, deleted files, etc.
$ git status
tell git to track new files
$ git add filename.txt
$ git add .
take a snapshot of changes and new files
$ git commit
$ git commit -m "message describing the changes"
check a remote repo for changes
$ git fetch
pull down any changes from a remote and apply them to the local project
$ git pull
add any commits to the remote repo
$ git push
$ git init
$ git add .
$ git commit -m "initial project commit"
First you must create a new project on GitHub
$ git remote add origin http://yournewprojecturl.com/something.git
$ git push origin master
After making changes to a project
$ git status
$ git add .
$ git commit -m "message about what we changed"
$ git push
Pull down a project to use locally
$ cd directory/you/want
$ git clone https://github.com/user/project.git
# or clone into a folder with a different name
$ git clone https://github.com/user/project.git new-folder
Made with ♥ by VCUarts
Contributers: Mark Luetke & Cody Whitby


EditorX
Prototype built with Python and OpenCV
Upload an image of your document to get started.
Upload Complete


This guide will explain how to create a module for that allows a third party application to exchange instrumented events and automated actions with the Adept task learning system. Conceptually, we will be creating a bridge between the third party app and the JMS messaging spine used by Adept. This bridge is typically called a "mediator" in Adept terminology. The goal is to use our application and let it train the Adept system to build a procedure and then for Adept to play back the procedure and control the application.
First we will need to create a class that extends the TLModule class. Next we will create a main class that will handle all of the bridging logic and implement the various event handlers. Then we will need to define the actions that we will submit to the JMS messaging spine. These actions are defined in an xml file called an "action model". Finally, we will write some event handlers that translate the application's native events into Adept actions and perform automation when the actions are invoked.
The first step to integrate with the Adept task learning system is to extend the TLModule class. The purpose of this class is to manage the lifecycle of module and define startup parameters. A typical implementation would look like this:
public class RemoteXmlProcessManager extends TLModule { }The next step is to override some methods so that Adept will run the module in the same Java VM:
@Override protected StartupMode getDefaultStartupMode() { return StartupMode.IN_JVM; } @Override public void startInJvm() throws SpineStartupException { // Create main class and start it } @Override public void stop() { // Stop main class } @Override public boolean isRunning() { // return running status of main class }Note that we could have chosen to run our module in a separate Java VM by returning StartupMode.NEW_CONSOLE and by overriding the startNewJvm() method.
Once we have created our module class, we need to connect it to the main Adept system by adding it to the createModules() method of the ProcessManager class.
if (isEnabled.get(ShellService.Modules.REMOTEXML)) { TLModule remotexml = new RemoteXmlProcessManager(); modules.add(remotexml); nameToModuleMap.put(ShellService.Modules.REMOTEXML, remotexml); }First we need to check if the module is enabled (You will need to create a new entry in the SellService.Modules enum). Next we create the module and add it to the modules list. Finally, we need to register our service name in the nameToModuleMap collection.
Now that we have created our module and connected it to the Adept system, we need to create a main class that does most of the heavy lifting. This class is responsible for loading the action model and implementing handlers for instrumentation and automation events. A typical class definition might look something like this:
public class RemoteXmlMain implements IMozillaEventListener, ActionExecutor { }Note that this class implements two interfaces. The IMozillaEventListener interface is used to handle instrumentation events from your third party app (in this case, we are hadling events from Firefox and Thunderbird). The ActionExecutor interface is used to handle automation events from the Adept system. More detail on these interfaces is provided in sections below.
The constructor for our main class might look something like this:
public RemoteXmlMain() { // Load services loadServices(); // Load action model loadActionModel(); // Build gui buildGui(); }The loadServices() method is used to connect to the third party application and register the main class as an event listener for instrumentation. The loadActionModel() method is used to load the action model from an xml file and register the main class as an event listener for automation. A typical implemenation might look like this:
private void loadActionModel() { try { Bridge bridge = Bridge.newInstance(APP_NAME); actionModel = bridge.getActionModel(); URL url = ActionModels.class.getResource("/remotexml_model.xml"); actionModel.load(url, this, NAMESPACE); } catch (PALException e) { log.error("Failed to load action model", e); } }Note that the APP_NAME parameter is just a string for your application's module name:
private static final String APP_NAME = "remotexml-mediator";And the NAMESPACE parameter is just a string groups all of your events into a common namespace:
public static final String NAMESPACE = "mozilla";In the above example, we are getting a reference to our xml action model file from the class loader getResource() method. This means that the action model should be in the application's classpath or contained with your module's jar file. Another option is to load the model from a common directory location. Next we call the actionModel.load() method passing in our xml file url, the ActionExecutor class (this) and the namespace for the events.
The action model xml file defines all the actions (events) used by our third party application. For each action, we define some meta data as well as all of the input and output parameters and their types. For example, Firefox implements an OpenUrlEvent action:
<actionModel version="1.0"> <action id="OpenUrlEvent"> <description>Firfox open url event</description> <metadata key="name" value="Open URL"/> <metadata key="fancyName" value="Open: ,#url"/> <metadata key="icon" value="./fapps/icon_firefox.png"/> <effectsType type="has_side_effects"/> <inputParam id="url"> <description>URL</description> <typeRef typeId="url"/> </inputParam> </action> </actionModel>The <action> tag defines a new action and the id parameter names the action. It is a good idea to have some kind of mapping convention between the Adept action ids and the third party events. In this case, we are simply using the event class name as the id. the <description> tag is a description of the action and tells the user what the event does. The various <metadata> tags provide additional information about the action to the Adept system. For example, what kind of icon to associate with the action. Finally, the <inputParam> tag is used to define the inputs to the action. In the example above, we have one input, the url that was just opened. As above, the id parameter names the input and the <typeRef> tag specifies the input type. In this case, we are creating a new type called "url". The url type is defined as:
<type id="url"> <description>A url such as http://www.yahoo.com</description> <atom> <javaType>java.lang.String</javaType> </atom> </type>This basically defines a new type called "url" that is mapped to a java String type. By defining our own types, we are helping the Adept system to manage the various inputs/outputs of the actions within a given procedure.
Now that we have defined the action model, we need to create the event handler for our instrumentation interface. In this example, we are going to implement the IMozillaEventListener interface:
public void notifyEventReceived(IMozillaEvent event) { }The notifyEventReceived() method will get called by our third party application each time an event is received. The main job of this method is to check the type of event received, extract the relevant data from the event and invoke the correct action with the Adept system. Here is an example of the open url event:
if (event instanceof IOpenUrlEvent) { IOpenUrlEvent openUrlEvent = (IOpenUrlEvent) event; String url = openUrlEvent.getUrl(); TypeName openUrlName = new TypeName("OpenUrlEvent", NAMESPACE); ActionDef openUrlActionDef = (ActionDef) actionModel.getType(openUrlName); try { ActionInvocation openUrlAction = openUrlActionDef.invoke(null, url); openUrlAction.setStatus(ActionInvocation.Status.RUNNING); } catch (PALException e) { log.error("Failed to invoke open url action", e); } }First we check the type using the instanceof operator. Next we cast our event to be the correct type. Then we extract the url parameter from the event. Finally we create an action definition and invoke it. The action definition is obtained from the action model by calling the getType() method. Note that the type name is a combination of the event name from our xml file and the namespace used above. Once we have our action definition, we call the invoke method, passing in the url. Note that this method takes a variable number of arguments if we had more than one input parameter (order is important). Once we have invoked the action, we need to set the status to RUNNING.
Automation of the third party application is handled via the ActionExecutor interface:
public void execute(ActionInvocation invocation) throws PALException { }The execute method will get called by the Adept system a procedure is executed that contains an automation action. The main job of this method is to check the event type, extract the relevant data and invoke the correct automation method. Here is an example of the open url event:
String name = invocation.getDefinition().getName().toString(); if (name.equals("TypeName[mozilla.OpenUrlEvent]")) { String url = invocation.getValue("url").toString(); firefoxAuto.openUrl(url); }First we test the name of the type of our action invocation. The easiest way to do this is with a simple string comparison. Note that the type name is based on the namespace and the id of the action from the model. Next we get the url that the Adept system is trying to open by calling the getValue() method. Finally, we call the automation method of the third party application to actually open the url.


The aim of this notebook is to perform basic exploratory data analysis (EDA), which in this competition include:
I also show the basic of the so-called 'stacked-emsemble model' to boost our prediction accuracy!
First, let's start with looking at what's inside of the given csv file.
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory
from subprocess import check_output
print(check_output(["ls", "../input"]).decode("utf8"))
# Any results you write to the current directory are saved as output.
# for visualization
import matplotlib.pyplot as plt
import seaborn as sns
# import data
train = pd.read_csv('../input/train.csv')
test = pd.read_csv('../input/test.csv')
train.head()
There seems to be several data types.
print(train.dtypes)
Yes, there are...but what is 'object'? Let's just have a look at one example 'SaleCondition'.
print(train['SaleCondition'].unique())
Essentially, 'object' is string. There needs to be a way to convert string to float or int. This is where LabelEncoder kicks in.
# string label to categorical values
from sklearn.preprocessing import LabelEncoder
for i in range(train.shape[1]):
if train.iloc[:,i].dtypes == object:
lbl = LabelEncoder()
lbl.fit(list(train.iloc[:,i].values) + list(test.iloc[:,i].values))
train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values))
test.iloc[:,i] = lbl.transform(list(test.iloc[:,i].values))
print(train['SaleCondition'].unique())
In this way we can convert strings to categorical values.
Now let's see whether there are nan in the data.
# search for missing data
import missingno as msno
msno.matrix(df=train, figsize=(20,14), color=(0.5,0,0))
The white elements have nan there. There seems to be some columns containing nan.
# Which columns have nan?
print('training data+++++++++++++++++++++')
for i in np.arange(train.shape[1]):
n = train.iloc[:,i].isnull().sum()
if n > 0:
print(list(train.columns.values)[i] + ': ' + str(n) + ' nans')
print('testing data++++++++++++++++++++++ ')
for i in np.arange(test.shape[1]):
n = test.iloc[:,i].isnull().sum()
if n > 0:
print(list(test.columns.values)[i] + ': ' + str(n) + ' nans')
Actually, there are many columns in the test set to have nan. 'LotFrontage', 'MasVnrArea' and 'GarageYrBlt' have many nans in the both sets, so we just drop them. For others, there are a few nans in each column, so we just replace them with the median of the corresponding column.
Let's organize the data a bit better.
# keep ID for submission
train_ID = train['Id']
test_ID = test['Id']
# split data for training
y_train = train['SalePrice']
X_train = train.drop(['Id','SalePrice'], axis=1)
X_test = test.drop('Id', axis=1)
# dealing with missing data
Xmat = pd.concat([X_train, X_test])
Xmat = Xmat.drop(['LotFrontage','MasVnrArea','GarageYrBlt'], axis=1)
Xmat = Xmat.fillna(Xmat.median())
# check whether there are still nan
import missingno as msno
msno.matrix(df=Xmat, figsize=(20,14), color=(0.5,0,0))
OK, there are no nan any more! Let's check our columns again.
print(Xmat.columns.values)
print(str(Xmat.shape[1]) + ' columns')
There are many '...SF'. Maybe we make a new feature which takes the sum of the all.
# add a new feature 'total sqfootage'
Xmat['TotalSF'] = Xmat['TotalBsmtSF'] + Xmat['1stFlrSF'] + Xmat['2ndFlrSF']
print('There are currently ' + str(Xmat.shape[1]) + ' columns.')
Now let's have a look at the target distribution. As this is a regression task, we want the target to be normally distributed.
# normality check for the target
ax = sns.distplot(y_train)
plt.show()
Well, it is right-skewed. We use log-transform to make them normally distributed.
# log-transform the dependent variable for normality
y_train = np.log(y_train)
ax = sns.distplot(y_train)
plt.show()
This is (approximately) normal distribution! As a custom, let's have a look at correlation matrix.
# train and test
X_train = Xmat.iloc[:train.shape[0],:]
X_test = Xmat.iloc[train.shape[0]:,:]
# Compute the correlation matrix
corr = X_train.corr()
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))
# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)
# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, cmap=cmap, vmax=.3, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
plt.show()
Which features are important? Let a random forest regressor tell us about it.
# feature importance using random forest
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=80, max_features='auto')
rf.fit(X_train, y_train)
print('Training done using Random Forest')
ranking = np.argsort(-rf.feature_importances_)
f, ax = plt.subplots(figsize=(11, 9))
sns.barplot(x=rf.feature_importances_[ranking], y=X_train.columns.values[ranking], orient='h')
ax.set_xlabel("feature importance")
plt.tight_layout()
plt.show()
Surprisingly, only two features are dominant: 'OverallQual' and 'TotalSF'. So instead of using all the 77 features, maybe just using the top 30 features is good enough (dimensionality reduction, in a way).
Here, we make a new feature called 'Interaction': simply the multiplication between the top 2 features. Also, we normalize the data via z-scoring.
# use the top 30 features only
X_train = X_train.iloc[:,ranking[:30]]
X_test = X_test.iloc[:,ranking[:30]]
# interaction between the top 2
X_train["Interaction"] = X_train["TotalSF"]*X_train["OverallQual"]
X_test["Interaction"] = X_test["TotalSF"]*X_test["OverallQual"]
# zscoring
X_train = (X_train - X_train.mean())/X_train.std()
X_test = (X_test - X_test.mean())/X_test.std()
# heatmap
f, ax = plt.subplots(figsize=(11, 5))
cmap = sns.cubehelix_palette(light=1, as_cmap=True)
sns.heatmap(X_train, cmap=cmap)
plt.show()
Let' see how the important features are related to our target "SalePrice".
# relation to the target
fig = plt.figure(figsize=(12,7))
for i in np.arange(30):
ax = fig.add_subplot(5,6,i+1)
sns.regplot(x=X_train.iloc[:,i], y=y_train)
plt.tight_layout()
plt.show()
Basically we can see clear linear relationships in many panels. We do not see a lot of outliers, which is good. Maybe let's just remove some outlier data points found in the 'totalSF' and 'GrLivArea', which are apparently out of the linear regression line.
# outlier deletion
Xmat = X_train
Xmat['SalePrice'] = y_train
Xmat = Xmat.drop(Xmat[(Xmat['TotalSF']>5) & (Xmat['SalePrice']<12.5)].index)
Xmat = Xmat.drop(Xmat[(Xmat['GrLivArea']>5) & (Xmat['SalePrice']<13)].index)
# recover
y_train = Xmat['SalePrice']
X_train = Xmat.drop(['SalePrice'], axis=1)
Now it is time to have fun with the stacked-emsembling model!
The intuitive idea of 'emsembling' is that we may be able to get better prediction performance if we average predictions by multiple models, rather than relying on a single model. There are always pros and cons in machine learning algorithms, so averaging multiple model predictions may compensate one another.
Here we use three models: XGBoost, Neural Network, and SVR.
Let's start with XGBoost. There are some parameters in XGBoost that can be optimized. We use 'GridSearch' to explore which combination of parameters yield the best prediction in this dataset.
# XGBoost
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
print("Parameter optimization")
xgb_model = xgb.XGBRegressor()
reg_xgb = GridSearchCV(xgb_model,
{'max_depth': [2,4,6],
'n_estimators': [50,100,200]}, verbose=1)
reg_xgb.fit(X_train, y_train)
print(reg_xgb.best_score_)
print(reg_xgb.best_params_)
Moving on to neural network: we simply use Keras for easy implementation of multi-layer perceptron.
We can again take advantage of grid search, but that requires Keras' wrapper 'KerasRegressor' (or 'KerasClassifier') to utilize scikit_learn's gird search. Here we try to select the best ones with respect to 'optimizer', 'batch_size', and 'epochs'.
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
def create_model(optimizer='adam'):
model = Sequential()
model.add(Dense(X_train.shape[1], input_dim=X_train.shape[1], kernel_initializer='normal', activation='relu'))
model.add(Dense(16, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
model.compile(loss='mean_squared_error', optimizer=optimizer)
return model
model = KerasRegressor(build_fn=create_model, verbose=0)
# define the grid search parameters
optimizer = ['SGD','Adam']
batch_size = [10, 30, 50]
epochs = [10, 50, 100]
param_grid = dict(optimizer=optimizer, batch_size=batch_size, epochs=epochs)
reg_dl = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
reg_dl.fit(X_train, y_train)
print(reg_dl.best_score_)
print(reg_dl.best_params_)
Finally we implement our last regressor, which is SVR (support vector regressior). We can do that easily using sklearn. Again, we use grid search to optimize some of the SVR's hyperparameters.
# SVR
from sklearn.svm import SVR
reg_svr = GridSearchCV(SVR(kernel='rbf', gamma=0.1), cv=5,
param_grid={"C": [1e0, 1e1, 1e2, 1e3],
"gamma": np.logspace(-2, 2, 5)})
reg_svr.fit(X_train, y_train)
print(reg_svr.best_score_)
print(reg_svr.best_params_)
Alright, so far we have three models. Emsemble methods are simply averaging predicted results across models to improve overall accuracy. This method is based on the idea that prediction by each model may be independent of one another and thus averaging predictions across models may compensate one another and yield better solution.
Stacking methods are part of emsemble methods, but they use weighted averaging of predictions by models. The idea is, of course, you want to assign more weights on better models and less weights on worse ones, based on the dataset. To determine the weights, we treat predictions by models as new features (predictors) and train a linear model to predict our targets.
Here is the very nice documentation about the stacked-emsemble model. 'https://blogs.sas.com/content/subconsciousmusings/2017/05/18/stacked-ensemble-models-win-data-science-competitions/'
So let's first make a new matrix where each column represents prediction by each model.
# second feature matrix
X_train2 = pd.DataFrame( {'XGB': reg_xgb.predict(X_train),
'NN': reg_dl.predict(X_train).ravel(),
'SVR': reg_svr.predict(X_train),
})
X_train2.head()
We train a linear regressor for this new training matrix and predict our target! We use Lasso GLM to avoid overfitting. We predict our target 'SalePrice', but do not forget to convert it back to ordinal scale! It has been in log-scale for normality.
# second-feature modeling using linear regression
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit(X_train2, y_train)
# prediction using the test set
X_test2 = pd.DataFrame( {'XGB': reg_xgb.predict(X_test),
'DL': reg_dl.predict(X_test).ravel(),
'SVR': reg_svr.predict(X_test),
})
# Don't forget to convert the prediction back to non-log scale
y_pred = np.exp(reg.predict(X_test2))
Finally, we submit our prediction!
# submission
submission = pd.DataFrame({
"Id": test_ID,
"SalePrice": y_pred
})
submission.to_csv('houseprice.csv', index=False)
Note that, here we used a grid-search to optimize hyperparameters, but it is still not good enough because explored parameter spaces are still narrow. We could still optimize hyperparameters and go further up by:D


Start Resume
My CV
Jobs
Jobs Available
Job, Description and Location
Id
Job
Description
Location
Creation Time
Modification Time


np:number of point
(2-90):
edge information
(number 1-np represent each node)
src
dst
weight
ok
TopoSort
animation
by clicking
CriticalPath
next


--- layout: post title: HP Offering Outsourced Social Media Analytics and Management Services date: '2012-04-19T09:27:51-07:00' tags: tumblr_url: http://alexhwilliams.tumblr.com/post/21384593201/hp-offering-outsourced-social-media-analytics-and ---
http://bit.ly/HVXhzU


Usage is easy - give each icon a class of "XIVJob icon-AAA" and it will display that job code.
ie: class="XIVJob icon-ACN" will result in an Arcanist icon being produced.


BUG in the coinbase tx, please report this. │PHBA2061 4
^CTraceback (most recent call last): │CrisF 3
File "./stats.py", line 54, in <module> │SHossain 2
getblock_result = rpc_connection.getblock(str(block), 2) │Alright 0
File "/usr/local/lib/python3.6/dist-packages/slickrpc/rpc.py", line 72, in call │smk762 0
conn.perform() │jorian 0
KeyboardInterrupt
When ^c
(edited)


Fixing Dynamic DNS on Gargoyle
Note: I switched to inadyn
on my home server eventually. I left this article because it's still relevant
I was digging through the logs of my latest Gargoyle installation (a router firmware based on OpenWrt, with a better UI in my opinion), and found out that Dynamic DNS updates were …
more ...


About the band
Ramones[a] were an American punk rock band that formed in the New York City neighborhood of Forest Hills, Queens, in 1974. They are often cited as the first true punk rock group.[1][2] Despite achieving only limited commercial success initially, the band was highly influential in the United States, Argentina, Brazil and most of South America, as well as Europe, including the United Kingdom, the Netherlands, Germany, Sweden and Belgium.
All of the band members adopted pseudonyms ending with the surname "Ramone", although none of them were biologically related; they were inspired by Paul McCartney of the Beatles, who would check into hotels as "Paul Ramon". The Ramones performed 2,263 concerts, touring virtually nonstop for 22 years.[2] In 1996, after a tour with the Lollapalooza music festival, they played a farewell concert in Los Angeles and disbanded.[3] By 2014, all four of the band's original members had died – lead singer Joey Ramone (1951–2001), bassist Dee Dee Ramone (1951–2002), guitarist Johnny Ramone (1948–2004) and drummer Tommy Ramone (1949–2014).[4][5][6][7] The remaining surviving members of the Ramones—bassist C. J. Ramone (who replaced Dee Dee in 1989 and stayed with the band until its dissolution) and drummers Marky Ramone, Richie Ramone and Elvis Ramone—are still musically active.
Recognition of the band's importance built over the years, and they are now mentioned in many assessments of all-time great rock music, such as number 26 in Rolling Stone magazine's list of the "100 Greatest Artists of All Time"[8] and number 17 in VH1's "100 Greatest Artists of Hard Rock".[9] In 2002, the Ramones were ranked the second-greatest band of all time by Spin, trailing only the Beatles.[10] On March 18, 2002, the original four members and Tommy's replacement on drums, Marky Ramone, were inducted into the Rock and Roll Hall of Fame in their first year of eligibility, though Joey had died by then.[2][11] In 2011, the group was awarded a Grammy Lifetime Achievement Award.[12][13]


Estimate parameters in Dirichlet-Multinomial and compute profile log-likelihoods.
| Version: | 0.1.3-4 |
| Depends: | R (≥ 2.5.0) |
| Published: | 2013-04-24 |
| Author: | Torben Tvedebrink |
| Maintainer: | Torben Tvedebrink <tvede at math.aau.dk> |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| NeedsCompilation: | no |
| Citation: | dirmult citation info |
| In views: | Distributions |
| CRAN checks: | dirmult results |
| Reference manual: | dirmult.pdf |
| Package source: | dirmult_0.1.3-4.tar.gz |
| Windows binaries: | r-devel: dirmult_0.1.3-4.zip, r-release: dirmult_0.1.3-4.zip, r-oldrel: dirmult_0.1.3-4.zip |
| OS X binaries: | r-release: dirmult_0.1.3-4.tgz, r-oldrel: dirmult_0.1.3-4.tgz |
| Old sources: | dirmult archive |
| Reverse depends: | DEEPR, HMP, StructFDR |
| Reverse imports: | CorrBin, HMPTrees |
Please use the canonical form https://CRAN.R-project.org/package=dirmult to link to this page.


Tourist Spot 1
This is tourist spot 1, details about this spot can be obtained by contacting us directly via phone or email. This entire content is just a sample.
Tourist Spot 2
This is tourist spot 2, details about this spot can be obtained by contacting us directly via phone or email. This entire content is just a sample.
Tourist Spot 3
This is tourist spot 3, details about this spot can be obtained by contacting us directly via phone or email. This entire content is just a sample.
Get in touch!
We'd love to hear from you.


I am a passionate and optimistic person who takes up responsibilities with utter enthusiasm and see to it that I complete my tasks and assignments on schedule. I have so many goals and a great amount of perseverance to achieve each and every one of them.
I love football - stounch fan of #realmadrid -, reading, listening to music and a new found love in writing (Manasseh Azure indirectly coaxed me into it). I loathe hypocrites, so much but I love creating websites and intend using my skills to create websites for businesses am going to set up. To find out more about me, my friends and family, my C.V, blog and articles i have written, click the button below.


{% extends "global/Page.html" %} {% load static otree %} {% block title %} Round {{ player.round_number }} of {{ Constants.num_rounds }} {% endblock %} {% block content %}
In this period, you are matched with the following employer. Before you can see the actual wage selected by the employer, you need to make a guess of the selected wage. If your guess is exactly right, you will get 5 extra points. If it deviates by 5 points you will get 3 extra points. If it deviates by 10 points you will get 1 extra point. If it deviates by more than 10, you won’t get any extra points.
| Employer ID | {{ player.get_partner.participant.code }} |
| Wage selected by the employer | {{ group.random_wage|c }} |


The Google Sitemap Generator Admin Console lets you configure the way that Google Sitemap Generator works and the types of URLs that it generates. This document explains how to use the Admin Console to set up Google Sitemap Generator. Use this document with the reference document, which provides details on command lines, configuration settings, and status values.
In this document:
Before you configure Google Sitemap Generator, you might need to do some system configuration.
You can use the Admin Console locally without enabling HTTPS. If the web server does not have HTTPS enabled:
However, to use the Admin Console remotely, you must have HTTPS enabled on the web server and enable the remote access feature.
To set up HTTPs on Windows:
By default, the TCP port is set to 8181 and the SSL port is unset.
To set up HTTPS on Linux:
If the default Admin Console port, 8181, is already in use, you can change the port as follows:
This section describes the steps you'll need to take during your first-time setup of Google Sitemap Generator.
The first time that you log in to the Admin Console, open a browser on the web server, using this URL: https://localhost:8181
. When you see the log-in page, enter the password that you created during the installation process.
After you've enabled remote access, you can use the hostname or IP address of the server in the Admin Console URL, as in these examples:
https://apache31.example.com:8181
https://12.345.67.89:8181
Once you've logged in, you'll see that Google Sitemap Generator has detected the websites on your web server. For each site, there's a site status page, a site configuration page, and a set of Sitemap types that you can configure.
The state of Google Sitemap Generator at first log-in is as follows:
To use the Admin Console from your own computer, rather than from the web server, you'll need to enable remote access. You can use the Admin Console or a command.
To use the Admin Console:
To use a command, use one of the following:
SitemapService.exe remote_admin enable
/usr/local/google-sitemap-generator/bin/sitemap-daemon remote_admin enable
Note: You can use the command line tool to perform some other basic functions for Google Sitemap Generator, but it has a limited set of functionality. Refer to the Reference document for information about the command format and options.
When you first log in, you'll see that Google Sitemap Generator has already detected the sites and listed them on the Admin Console Dashboard. Sites are activated by default. You can enable or disable use of Google Sitemap Generator for any site.
To disable or enable a site:
When you configure Google Sitemap Generator, you set default values for all sites on a web server. You can then accept or supersede those values for each site on the web server. There are two types of configurations: site configuration and Sitemap type configuration.
The following table is an overview of the configuration process.
| Order | Type of configuration | How to View |
|---|---|---|
| 1 | Default site values for all sites on the web server. | Dashboard > Default site settings |
| 2 | Default Sitemap-type values for all sites on the web server. | Dashboard > Default site settings > Sitemaps |
| 3 | Site-specific site values that override default values. | Dashboard > a site name > Site configuration |
| 4 | Site-specific values for specific types of Sitemaps. | Dashboard > a site name > Sitemaps > a specific Sitemap type, such as Web, Mobile, and so on |
The next sections describe the steps for setting default values and site-specific values.
Your first step is to examine and configure the default values.
To specify default values for all sites:
Note: For Web Sitemaps, notice the Sitemap file submission section. If you chose the installation option to start with automatic submission disabled, the robots.txt setting is unselected, and the ping URLs are disabled. Do not fill these in until you are ready to allow automatic submission of Web Sitemaps.
After you've examined and configured the default values, you can configure site-specific values. First you'll set the site configuration, and then you'll set the values for the Sitemap types you'll be using.
To specify customized values on a per-site basis:
You're now done with the configuration.
Google Sitemap Generator saves and applies your settings each time you click the Save button.
Changes apply only to Sitemaps that have not yet been submitted to search engines. For example, suppose you specify new filters that exclude additional types of URLs from a Sitemaps file. The results are as follows:
Test your configuration by viewing sample Sitemap files, and then modifying the configuration until each type of Sitemap file is exactly what you want it to be.
Warning: It is important to execute this testing procedure. You are responsible for verifying that you are not exposing sensitive content or user data to the search engine.
The following steps use Web Sitemaps to illustrate the testing procedure. You can adapt this method to other types of Sitemaps except for Blog Search.
Perform the following steps for one site at a time.
When the testing time has passed, do this:
When you are satisfied with the Sitemaps file, do the following:
To change your password:
If you forget your password and need to reset it, use one of the following commands:
SitemapService.exe reset_password
/usr/local/google-sitemap-generator/bin/sitemap-daemon reset_password
The following table describes some issues that could arise and gives troubleshooting suggestions. Please share your findings with the community, to increase the information in this area.
| Issue | Suggested Investigations |
|---|---|
| Sitemaps files are generated but empty | In the Sitemap URL filter section of the default and site-specific Site configuration pages, is there a rule that includes URLs? If the default value, the asterisk wildcard (*), is missing from Included URL patterns, and if no other patterns are present, no URLs are included in generated Sitemaps files.
In the same section, are there exclusion rules that exclude all URLs? Is there live traffic on the site? Is it possible that the web server is down or that a network error has occurred? |
| Code Search Sitemap file is empty | Are the file extensions specified in the URL filters the same as the file extensions used by the actual files? |
Updated on


{% extends 'dashboard_layout.html' %} {% block title %}Add Weight{% endblock %} {%block breadcrumb %}
{{ error }}
Update your weight below by entering your current weight and click "Add Weight"


Guaranteed the 100% best most awesome source on the internet for all your sandwich needs.
We got BLTs, we got reubens, we got meatball sandwiches because subs ain't cool bro.
You know we're the best because our address is a pun. Sandwiches love puns.
Your life was meaningless before this site and it will be meaningless after.
Cheesy grin cheesy grin fromage frais. Cheese and biscuits melted cheese fromage frais caerphilly cottage cheese jarlsberg cream cheese emmental. Babybel cheese slices cheese and wine dolcelatte croque monsieur everyone loves cow chalk and cheese. Lancashire mozzarella stilton cheese and wine goat mozzarella stilton cheese strings. Fromage jarlsberg cheesecake.


{% load static %}
Password Reset
Password Reset SuccessFully
Your password has been set. You may go ahead and
Sign in
now.


Action title is required.
Enter a valid emailHtml.
Enter a subject.
Describe the alert in the email body.
Describe the alert in the email body HTML.


The responsibilities of renderer.js
file are:
- Respond to users, such as, when a user click on a button or want to quit
- Handle child processes
- Communicate with walkerHelper.js
- Send results to webview
- Show dialog boxes
- Close app
Let’s start writing the code:
const remote = require('electron').remote, cp = require('child_process'),
The remote
module helps to access modules
restricted to main process, such as,
dialog
module for opening directories and
displaying confirmation boxes. See
Using Electron’s remote module.
The child_process
module helps to execute
walkerHelper.js
as a child process. See
Child Process in Node.
walker = cp.fork('./walkerkHelper.js'), OPT = require('./options.js'),
The cp.fork('./walkerkHelper.js')
method returns
a new communicable child process. See
Create walkerHelper.js to control file walker.
The options.js returns an object storing app configuration. See Create app options module.
Duplicate File Finder app has five states:
started
, stopped
,
paused
, resumed
and
done
.
-
Application
close
button, shows a confirmation dialog box to close the current window. -
Add folder
button, shows directory selector dialog box. This button gets change when the state of app changes. The Add folder button get replace with following buttons when app change its state:-
Add folder
button shows when app state isstopped
-
Cancel
button shows when state isstarted
,paused
orresumed
. The Cancel button send the reset command towalkerHelper.js
which removes the all pending entries and emit thedone
event. -
New
button shows when state isdone
. The New button reset the GUI to default and change state tostopped
so theAdd folder
button appears.
-
-
Start button
starts the application for scanning the provided folders. This button also gets change when the state of app changes. The Start button replace with following four button:-
Start
button shows when the app state isstopped
. This button is used to start the folders scanning. The stat of application will change tostarted
when application successfully start scanning. -
Pause
button shows when state isstarted
orresumed
. This button is used to pause folder scanning. -
Resume
button shows when state ispaused
. This button is used to resume folder scanning. -
Finished
disabled button shows when scanning completed and state changed todone
-
- Heading div for added directories
- List of directories / folders to scan
- The WebView tag which loads the grid.html to display the duplicate results.
-
App status bar shows
Ready
,Paused
,Done
or a folder path (which is currently being scanned). - Delete location (path) from the list
-
Location status. The location (path) will not scan if
Excluded
-
Directory location (path).
Lets star writing the renderer.js file:
//renderer.js // 1 The close button appCloseBtn = document.querySelector('#close'), // 2 The Add folder button addBtn = document.querySelector('#addBtn'), // 3 The Start button startBtn = document.querySelector('#startBtn'), // 4 Heading div pathsDivHead = document.querySelector('#pathsHead'), // 5 Shows a list of directories added by Add folder button pathsDiv = document.querySelector('#paths'), // 6 WebView tag, loads grid.html webview = document.querySelector('webview'), // 7 App's status bar appStatusBar = document.querySelector('#status');
Next, write the following code:
let debug = false, dir = dirObject, dirs = [],
Set debug
to true if you want to see error
messages on Chromium devtools. dir
creates a
reference to dirObject
, see
Making GUI - Creating dirObject class. dirs
stores the dir
objects.
prevStatusBarMsg = '', appStatus = OPT.STOPPED;
The prevStatusBarMsg
stores the current working
path when a user hit the Pause
button and prints
the stored path on the status bar when user hit the
Resume
button.
The appStatus
stores the current app status, the
default status is STOPPED
.
//Show confirmation box before closing the window appCloseBtn.addEventListener('click', e =>{ const options = { type: 'warning', buttons: ['Yes', 'No'], message: 'Do you really want to quit?' } remote.dialog.showMessageBox(options, i => { if (i == 1) return; remote.getCurrentWindow().close(); }) });
A Yes No confirmation box will appear when a user hits the close button.
startBtn.addEventListener('click',()=>{ debug&&console.log(appStatus); if (dirs.length === 0) return switch (appStatus){ case OPT.STOPPED: startApp(); break; case OPT.PAUSED: resumeApp(); break; case OPT.STARTED: case OPT.RESUMED: pauseApp(); } });
As we already discussed , the startBtn
is used to
start, pause or resume the application.
addBtn.addEventListener('click', () =>{ debug&&console.log(appStatus); switch (appStatus){ case OPT.STOPPED: appStoppedAddBtnClicked(); break; case OPT.DONE: appDoneAddBtnClicked(); break; case OPT.PAUSED: case OPT.STARTED: case OPT.RESUMED: stopAppAddBtnClicked(); } });
If the app status is stopped the addBtn
displays
the directory selector dialog box by executing the
appStoppedAddBtnClicked()
method.
And, if the app status is done the
addBtn
displays the confirmation dialog box to
reset the whole app (file walker, dir objects and clear the
queue) by executing the
appDoneAddBtnClicked()
method.
If the app status is paused, started or resumed the addBtn
display the confirmation box to cancel the current scanning by
executing the stopAppAddBtnClicked()
method.
function appStoppedAddBtnClicked(){ let options = { properties: ['openDirectory', 'multiSelections'] } remote.dialog.showOpenDialog(options, (paths) => { if (!paths) return paths.forEach(path =>{ let isExist = dirs.some((dir) => { return dir.path == path }) if (isExist){ alert(path + ' already added in the list') ; return; } new dir(path); }) }) }
The appStoppedAddBtnClicked()
method shows the
directory selector dialog box. The new dir
object
will create or display a message if the selected path already
added.
function appDoneAddBtnClicked(){ const options = { type: 'warning', buttons: ['Yes', 'No'], message: 'Do you wan to start a new empty project?' } remote.dialog.showMessageBox(options, i => { if (i == 1) return; walker.send({walker:OPT.RESET}); dirs = []; pathsDiv.innerHTML = ''; pathsDivHead.className = 'hide'; addBtn.innerHTML = 'Add folder'; startBtn.innerHTML = 'Start'; startBtn.disabled = false; appStatusBar.innerHTML = 'Ready'; webview.style.height = ''; webview.reload(); appStatus = OPT.STOPPED; }) }
The appDoneAddBtnClicked()
method displays a
confirmation dialog box when addBtn
clicked.
After successful confirmation this method resets the whole
application.
function stopAppAddBtnClicked(){ const currAppStatus = appStatus; if (currAppStatus !== OPT.PAUSED){ pauseApp(); } const options = { type: 'warning', buttons: ['Yes', 'No'], message: 'Do you really want to cancel duplicate files search?' } remote.dialog.showMessageBox(options, i => { if (i == 1) { if (currAppStatus !== OPT.PAUSED){ resumeApp(); } return; } resumeApp(); walker.send({walker:OPT.RESET}); }) }
The stopAppAddBtnClicked()
method displays a
confirmation box to stop the current task. It first stores the
current status of app and then pause the application if it
already not paused, then it shows the confirmation box. After
successful confirmation it resume the app and send reset
command to walker
(child process of
walkerHelper.js), which empties the queue and then walker
returns the done
event.
function startApp(){ addBtn.disabled = true; startBtn.disabled = true; document .querySelectorAll('.delDir, .typeDir') .forEach(btn => { btn.className += ' disableBtn'; }); let obj = { walker:OPT.START, dirs:dirs } walker.send(obj); }
The startApp()
method disable all visible
buttons, starts the scanning by sending the
dirs
array (storing dir
objects
added by Add folder
button) and
OPT.START
command to
walker
(walkerHelper.js child process).
function resumeApp(){ startBtn.disabled = true; let obj = { walker:OPT.RESUME } walker.send(obj); } function pauseApp(){ startBtn.disabled = true; let obj = { walker:OPT.PAUSE } walker.send(obj); }
The resumeApp()
and
pauseApp()
methods are used to resume and pause
the application.
Next, the walker.on
receive the message from its
child process (walkerHelper.js), for example, when “file
walker” paused, stopped or done scanning :
walker.on('message', (m) => { switch (m.walker) { case OPT.WEBVIEW: webview.executeJavaScript(m.addRows, r => { r ? webview.style.height = r : ''; }); break; case OPT.DIR: appStatusBar.innerHTML = '📂 '+ m.dir; break; case OPT.PAUSED: appStatus = m.walker; startBtn.innerHTML = 'Resume'; startBtn.disabled = false; prevStatusBarMsg = appStatusBar.innerHTML; appStatusBar.innerHTML = 'Paused'; break; case OPT.STARTED: addBtn.innerHTML = 'Cancel'; addBtn.disabled = false; startBtn.disabled= false; case OPT.RESUMED: appStatus = m.walker; startBtn.innerHTML = 'Pause'; startBtn.disabled = false; appStatusBar.innerHTML = prevStatusBarMsg; break; case OPT.DONE: appStatus = m.walker; startBtn.innerHTML = 'Finished'; startBtn.disabled = true; addBtn.innerHTML = 'New'; appStatusBar.innerHTML = 'Done Scanned '+m.totalFiles+' files & '+m.totalDirs+' folders'; prevStatusBarMsg = ''; break; } });
To compare received message we’ll use switch case statement:
case OPT.WEBVIEW
walker
child process sent the duplicate files.
We’ll send these files to
webview
(grid.html).
case OPT.DIR
walker
sent the current working directory.
We’ll display it on the app’s status bar.
case OPT.PAUSED
walker
paused the scanning. We’ll update
the appStatus
to paused, replace the icon and
text of startBtn
and display the
Paused
message on app’s status bar.
case OPT.STARTED
walker
started the scanning. We’ll update
the addBtn's
icon and text.
case OPT.RESUMED
This code runs when walker
started or resumed.
We’ll update the startBtn
icon and text and
replace the status bar text with current working directory.
case OPT.DONE
walker
finished the scanning of provided folders.
We’ll update the startBtn
text to
Finished
and make it disabled. We’ll also
update the addBtn
icon and text to display the
New text. Lastly we’ll update the app’s status bar
by writing the Done
message, total scanned files
and folders.
function dirObject (path){ this.path = path; this.isIncluded = true; dirs.push (this); pathsDivHead.className = ''; // 8 The delete button let del = document.createElement('span'); del.className = 'icon-close delDir'; // 9 Include / Exclude button let type = document.createElement('span'); type.className = 'typeDir'; type.innerHTML = 'included'; //10 Directory path let textNode = document.createTextNode(path), div = document.createElement('div'); div.appendChild(del); div.appendChild(type); div.appendChild(textNode); pathsDiv.appendChild(div); del.addEventListener('click', () => { if (appStatus !== OPT.STOPPED) return; pathsDiv.removeChild(div); let index = dirs.indexOf(this); if (index !== -1) dirs.splice(index, 1); if (dirs.length === 0 ) pathsDivHead.className = 'hide'; }) type.addEventListener('click', () => { if (appStatus !== OPT.STOPPED) return; this.isIncluded = !this.isIncluded; if (this.isIncluded){ type.className = 'typeDir'; type.innerHTML = 'included'; } else { type.className = 'typeDir disableBtn'; type.innerHTML = 'excluded'; } }) }
The dirObject
is responsible to create an object
which holds the directory path and its status i.e. included or
excluded. When a user clicks on Add folder button and select a
folder, that folder then adds in the list as shown in above
image at point # 5. See tutorial
Creating the dirObject
class
for more information.
Click here to download the complete project (zip file).