If you seek answers, you must ask questions. Good questions. This is an basic concept in life that many people overlook but has huge payoffs if executed correctly. It is especially important in the tech field (and if you are a DBC student) where learning and understanding is everything.
Good questions are specific. They contain all necessary information and clearly define the problem you are trying to solve. Think about it. Before you ask a question, ask the question to yourself and pretend as though you have no prior knowledge of the situation. You’ll realize that it is critical to include all pertinent information in a clear, succinct, and direct way.
Another helpful exercise you can practice before asking questions is to formulate your question into a google search. You don’t want unnecessary words in your search query, otherwise you will get unintended answers to a different question. Of course, you can be a little more wordy and use proper english in an actual question to a human being. These tips are most helpful when formulating a title and stating your problem of the question.
Lastly, you should be able to provide a solid example of where you are stuck. It’s usually better to offer some concrete code. It doesn’t matter if it works or not, as long as the person reviewing it can see where you are going wrong. Never be afraid to ask questions! Those who ask the most get the most! And once you have your question answered, teach others! Somebody will eventually have the same question as you and now you will be a resource of knowledge for them. So ask away!


Introduction
The last post showed how we can find and fix insecure dependencies in a project. In addition to the problem of dependencies issues to fix, which can be present in a large amount in a project, there is another way to harden your own code.
In a running application on the Internet, there is a “noise floor”. That means, any application that presents itself in public is exposed to certain attacks after some time. This can come from botnets, but also people who want to “test”, whether you can get something from the page through hacking.
In order to arm your own application against such attacks before the release, there are DAST systems, short for ‘Dynamic Application Security Testing’. Here, a tool tries to execute different attack patterns from the outside with different inputs and then evaluates the results for potential vulnerabilities. In principle, this is exactly what the later malicious attacker or botnet is trying to use against the application. This article differs from the last one in that it does not analyze code, but unleashes a “real” attacker and possible attack requests on the own application.
A popular DAST system for doing this is the open source tool OWASP ZAP.
The following describes how to integrate OWASP ZAP into Jenkins. Many descriptions are based on the great documentation Jenkins at your Service! Integrating ZAP in Continuous Delivery:
The individual sections are divided into:
The steps described here have been performed on a Mac OS X. This applies in particular to the chapter where OWASP ZAP is installed as a desktop application. You can also perform the steps on another operating system. However, for this you have to look up the corresponding command line equivalents in another OS.
Installing OWASP ZAP in Jenkins
Stopping old docker container
Those who follow from the old chapter: For the following explanations, we do not need the git server anymore. We can stop it with:
docker stop <containerid_gitserver>
Installation
Next we install OWASP ZAP in Jenkins.
Installation of necessary plugins
For installation, we use the Docker infrastructure, which we described in the last chapter.
Next we need:
- the official ‘OWASP ZAP Plugin’, which we will use for the scans against our application
- the ‘Custom Tool Plugin’ - for easy installation and
- the ‘HTML Publisher Plugin’, to view the results in the builds.
To do this, follow these steps:
Click on ‘Official OWASP ZAP’:
Also choose ‘Custom Tool’. We can do that via the filter field in the top right corner. Afterwards we click on ‘Download now and install after restart’ and ‘Restart Jenkins when installation is complete and no jobs are running’:
We now go to the standard Jenkins page:
After some time, the login screen of Jenkins should reappear and you can log in.
Configuring Custom Tools
We are looking for the installation package ‘OWASP ZAP 2.7.0’ for Linux:
On the GitHub release 2.7.0 page you can find the link to the linux release: https://github.com/zaproxy/zaproxy/releases/download/2.7.0/ZAP_2.7.0_Linux.tar.gz
And set it as an installation source:
As input under ‘custom tool’ we use:
- ‘custom tool’
- name :
ZAP_2.7.0
- install automatically
- download URL for binary archive:
https://github.com/zaproxy/zaproxy/releases/download/2.7.0/ZAP_2.7.0_Linux.tar.gz
- subdirectory of extracted archive:
ZAP_2.7.0
and finally click on ‘Save’.
Configuring the port for ZAP
Under ‘ZAP’:
We set the port to something rare, like 12123:
- default host:
localhost
- default port:
12123
‘Save’
Configuring a ZAP job
Now we create our first ‘OWASP ZAP scan job’:
Enter ‘zap_scan_demo’ and click ‘Ok’.
Now for ‘Tool Selection’: ZAP_2.7.0
.
We deliver where we want OWASP ZAP to be installed:
- path:
/var/jenkins_home/owaspzap
- persist session:
owasp_webgoat_zap_session
Configuring the target URL
Next, we need to specify the target URL, the URL we want to attack.
For this we need the following information:
- session properties
- include in context: which URLs are in the test frame? We do not want to scan URLs outside this and which may be liable to prosecution.
- authentification: Here you can set how the scanner can log in to the application and how it notices this. Any application with a login that you want to test inside needs this setting.
- attack mode
- starting point: The address from which we want to start the scan.
- spider scan: Here we can choose if the scanner tries to find further pages using existing links in the root page. This makes sense, as we don’t want to test just one page.
- active scan: Here we can select the scan policy. As long as we haven’t created one yet, the default policy of OWASP ZAP will be taken.
- finalize run: Here you can define how the report should be generated.
Using a small sample application that is vulnerable to XSS, I’ll first explain how we can configure each item. Then I’ll go into the topic of authentication in applications and how to set them in the scanner. With the shown it should be possible to configure a larger project at the end.
Configuring OWASP ZAP
Installation
To make the settings easier, we install the original application of OWASP ZAP locally.
To be able to understand everything better we use a fixed version : 2.7.0
. Therefore we use a specific git hash in the URL to install specifically version 2.7.0
:
brew cask install https://raw.githubusercontent.com/caskroom/homebrew-cask/645dbb8228ec2f1f217ed1431e188687aac13ca5/Casks/owasp-zap.rb
You can now launch the application from your Mac by typing OWASP ZAP
into Spotlight:
Now click ‘No, I do not want to persist this session at this moment in time
’:
Then select ‘Start’:
Configuring Proxy ZAP
We click on the little wheel:
and set the following data for ‘Local Proxies’:
- address:
<IP_ADDRESS>
- port:
9000
and save with Ok
.
Configuring FoxyProxy
In the browser we configure a proxy for localhost:9000
.
For that, you can use the extension FoxyProxy in Firefox (under Add-ons) as well as in Chrome (under Extensions).
First we install the extension.
Then we open it by clicking on the icon at the top right of the browser:
And set this:
- Proxy Type:
HTTP
- Title or Description (optional):
OWASP ZAP <IP_ADDRESS>:9000
- IP address, DNS name, server name:
<IP_ADDRESS>
- Port:
9000
Save
Now we can select the proxy:
The icon changes to:
Now the traffic runs through the proxy.
Example application XSS
We launch an application that is vulnerable to XSS:
docker run -ti --rm -p <IP_ADDRESS>:1185:1185 \
-d secf00tprint/victim_easy_xss_server
When we open the application we see text input fields for comments. Here you can inject code:
open http://<IP_ADDRESS>:1185
We determine the IP on the docker network:
docker inspect <containerid_victim_easy_xss_server>|grep "IPA"
Jenkins Session Properties
Then we enter under ‘Session Properties’:
- Context Name:
zap_scan_demo
- Include in Context:
http://<determined_IP>:1185/.*
, e.g.http://<IP_ADDRESS>:1185/.*
Under ‘Attack Mode’ we enter the root URL:
http://<determined_IP>:1185/
e.g.
http://<IP_ADDRESS>:1185/
‘Save’
Then we build the item for the first time.
‘Build Now’
Then ZAP should be installed in the folder /var/jenkins_home/owaspzap
.
Checking the vulnerability in the Example Application
If we start our proxy and call http://<IP_ADDRESS>:1185
in the browser,
this should appear in OWASP ZAP:
We now go back to the browser and enter the following in the GET-field:
- Comment (using GET):
Test
‘Show’
Result:
The URL shows http://<IP_ADDRESS>:1185/?comment=Test&enter_comment=Show
and the comment appears:
If we click on ‘Back’, enter
<script>alert(1)</script>
x and click on ‘Save’, we see a pop-up:
This means the application is vulnerable to XSS.
OWASP ZAP should find this. Let’s take a closer look now:
Configuring Scan Policy
We can use the icon with the mixer to set how we want to scan:
First we click on ‘Add’
and select the following values:
- Scan policy
- Policy:
XSS
- Default alert threshold:
Medium
- Default attack strength:
Low
- Information gathering: Threshold:
OFF
, Strength:Default
- Server security: Threshold:
OFF
, Strength:Default
Under ‘Injection’ we set everything to ‘Threshold’: OFF
and Strength: Default
, except entries with cross-site scripting. These we set to Low
:
‘Miscellaneous’, ‘External Redirect’, ‘Threshold’ we switch to OFF
, Strength to Default
and ‘Script Active Scan Rules’ to Low
, Default
:
‘Ok’
Then ‘XSS’ and ‘Export’ and save the file as ‘XSS.policy’:
‘Save’
If we look at the file, we see that it is an XML file that adheres to a certain format.
The individual entries can be looked up:
Policy abbreviations for active and passive scans
We remember the location of the file where we put it, because we need it afterwards for Jenkins.
XSS Scan
We now look in the ‘History’ of OWASP ZAP for the request in which we entered ‘Test’:
and select ‘Attack’, ‘Active Scan’:
Under ‘Policy’ we select ‘XSS’:
and click on ‘Start Scan’.
If we now click on ‘Alerts’
we can see that an XSS has been found:
We also want to reproduce this finding in Jenkins.
Jenkins Attack Mode
First, we need to copy the policy in Jenkins. To do this, type the following command on the command line in the directory where XSS.policy
was placed:
docker cp XSS.policy <containerid_jenkins>:/var/jenkins_home/owaspzap/policies/
If we now open the configuration page OWASP ZAP in Jenkins we can select the policy.
Attack Mode:
- Starting point:
http://<determined_IP>:1185/?comment=test&enter_comment=Show
e.g.http://<IP_ADDRESS>:1185/?comment=test&enter_comment=Show
- Spider Scan: True
- Recurse: True
- Subtree Only: Max Children to Crawl:
2
- Active Scan
- Policy:
XSS
wählen
Jenkins Report
To generate a corresponding report,
we set ‘Finalize Run’:
- Generate Reports: True
- Clean Workspace Reports: True
- Filename:
JENKINS_ZAP_VULNERABILITY_REPORT_${BUILD_ID}
- Generate Report: True
- Format: choose xml and html
Under ‘Add post-build action’, ‘Archive the artifacts’:
- Archive the artifacts
- Files to archive:
logs/*,reports/*
and ‘Add post-build action’, ‘Publish HTML Reports’:
‘Add’
- Publish HTML reports: Reports
- HTML directory to archive:
reports/
- Index page[s]:
JENKINS_ZAP_VULNERABILITY_REPORT_${BUILD_ID}
- Report title:
ZAP Scan Demo
and finally we click on ‘Save’.
Final Scan
To start the final scan we select ‘Build now’:
The performed scan should find the XSS:
Authentication
In the following section I will explain how to set up authentication. To make it clearer I take 2 applications: OWASP WebGoat and OWASP Juice Shop:
OWASP Juice Shop
To start this application we type in the following command on the command line
docker run --rm -p <IP_ADDRESS>:3000:3000 -d bkimminich/juice-shop
and open the started application in the browser:
open http://<IP_ADDRESS>:3000
The proxy for OWASP ZAP should be set in the browser (cf. chapter Configuring FoxyProxy).
Now we go to the login mask:
We’ll sign up with:
- User:
' or 1=1;--
- Password: anything
In the ‘History’ in OWASP ZAP we should see a POST:
Username / Password Parameter
The OWASP-ZAP plugin in Jenkins needs for a successful authentication which parameters are used for the login:
In this case, you can determine them from the POST request:
{"email":"' or 1=1;--","password":"p"}
We can put that down in Jenkins:
We can also take the login credentials
- Username:
' or 1=1;--
- Password: beliebig
and the login URL from ZAP:
http://<IP_ADDRESS>:3000/rest/user/login
Whereby we still have to exchange the IP with the IP which is present in the Docker network, e.g.:
http://<IP_ADDRESS>:3000/rest/user/login
We’ll put that in Jenkins:
Logged-in String
To determine when the user is logged in, a logged-in string must be specified in Jenkins:
If you click on the question mark on the right you will see how it is determined:
The Logged in indicator, when present in a response message (either the header or the body), signifies that the response message corresponds to an authenticated request.
Therefore we look at the response in OWASP ZAP for a successful login:
And save this response under the name response.raw.out
:
Right mouse button, ‘Save raw’, ‘Response’, ‘All’:
Now we log out of Juicy Shop
and try to log in with wrong credentials.
We use
- User name:
test
- Password:
test
And search the POST request in ZAP:
Then we click on Response:
And save this one:
Right mouse button, ‘Save raw’:
‘Response’, ‘All’:
We’ll take another text file:
- Save As:
response2.out
- File Format:
Raw
If we now compare the two responses (e.g. using vim tools vimdiff response.out.raw response2.out.raw
),
we see that a login can be recognized by the occurrence of the string authentication
in the response.
That means we set in Jenkins the following Reg-Ex for the Logged-In Indicator:
.*\Qauthentication\E.*
Logged-out String
To determine when we will be logged out, we look at which string can only be found on login page. To do this, hover the mouse over ‘Login’ in the browser, press the right mouse button and examine the element:
We use the string TITLE_LOGIN
and put it in Jenkins:
.*\QTITLE_LOGIN\E.*
Missing data
To complete our scan we enter the following parameters:
- Session Properties
- Include in Context:
http://<determined_IP>:3000/.*
e.g.http://<IP_ADDRESS>:3000/.*
Authentication should look like this:
For the ‘Attack Mode’ we set:
- Starting Point:
http://<determined_IP>:3000/
, e.g.http://<IP_ADDRESS>:3000/
. Attention: It is important to set the final slash, otherwise the spider and scanner may not work properly. - Spider Scan
- Recurse: True
- Subtree Only: True
- Max Children To Crawl:
2
- Active Scan
- Policy:
Default Policy
, which scans with MEDIUM strength - Recurse: True
Finalize Run’ and the Post-Build actions we leave as usual:
Start Scan
Now we can start the build / scan. This will take some time.
OWASP Web Goat
Another application we will use to illustrate authentication is OWASP WebGoat.
We’ll launch it with you:
docker run -p <IP_ADDRESS>:10394:8080 -it webgoat/webgoat-8.0 /home/webgoat/start.sh
open http://<IP_ADDRESS>:10394/WebGoat/
Creating a user
First we have to register a user:
We use
- Username:
webgoat
- Password:
webgoat
accept the terms of service and click on ‘Sign up’:
Logged-in / Logged-out Indicators
When calling the URL http://<IP_ADDRESS>:10394/WebGoat/
we are redirected to http://<IP_ADDRESS>:10394/WebGoat/login
.
If we now log in with the credentials, have OWASP ZAP recorded, and take a closer look at requests and responses for a successful and unsuccessful login, we see:
- Login-Parameter (POST):
username=webgoat&password=webgoat
- Username Parameter:
username
- Password Parameter:
password
- Login-URL:
http://<IP_ADDRESS>:8080/WebGoat/login
, die IP und Port sind diejenigen im Dockernetz. Beides kann überdocker inspect <containerid_webgoat>|grep "IPA"
(IP) bzw aus dem obigen docker-Aufruf ausgelesen werden (Port). - Username:
webgoat
- Password:
webgoat
For a successful login:
For a non-successful login:
In the header the location is different:
This is what we use for the Logged-In Indicator:
.*\QLocation: http://<IP_ADDRESS>:8080/WebGoat/welcome.mvc\E.*
For the Logged-out-Indicator we take the URL of the login page:
.*\Qhttp://<IP_ADDRESS>:8080/WebGoat/login\E.*
If this is in one of the responses, we assume that the system has logged out the user.
Final setting WebGoat
The final setting for the scan then looks as follows:
Best Practices
Due to the duration and traffic such a scan can take, it is recommended to run it only once overnight or once a week.
A daily scan can be set via ‘Build Triggers’:
Summary
This article summarizes how to install and use OWASP ZAP in the Continuous Integration System Jenkins.


Bite Size Bayes¶
Copyright 2020 Allen B. Downey
License: Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Review¶
In the previous notebook we used a Bayes table to interpret medical tests.
In this notebook we’ll solve an expanded version of the cookie problem with 101 Bowls. It might seem like a silly problem, but it’s not: the solution demonstrates a Bayesian way to estimate a proportion, and it applies to lots of real problems that don’t involve cookies.
Then I’ll introduce an alternative to the Bayes table, a probability mass function (PMF), which is a useful way to represent and do computations with distributions.
Here’s the function, from the previous notebook, we’ll use to make Bayes tables:
import pandas as pd
def make_bayes_table(hypos, prior, likelihood):
"""Make a Bayes table.
hypos: sequence of hypotheses
prior: prior probabilities
likelihood: sequence of likelihoods
returns: DataFrame
"""
table = pd.DataFrame(index=hypos)
table['prior'] = prior
table['likelihood'] = likelihood
table['unnorm'] = table['prior'] * table['likelihood']
prob_data = table['unnorm'].sum()
table['posterior'] = table['unnorm'] / prob_data
return table
101 Bowls¶
In Notebook 4, we saw that the Bayes table works with more than two hypotheses. As an example, we solved a cookie problem with five bowls.
Now we’ll take it even farther and solve a cookie problem with 101 bowls:
Bowl 0 contains no vanilla cookies,
Bowl 1 contains 1% vanilla cookies,
Bowl 2 contains 2% vanilla cookies,
and so on, up to
Bowl 99 contains 99% vanilla cookies, and
Bowl 100 contains all vanilla cookies.
As in the previous problems, there are only two kinds of cookies, vanilla and chocolate. So Bowl 0 is all chocolate cookies, Bowl 1 is 99% chocolate, and so on.
Suppose we choose a bowl at random, choose a cookie at random, and it turns out to be vanilla. What is the probability that the cookie came from Bowl \(x\), for each value of \(x\)?
To solve this problem, I’ll use np.arange
to represent 101 hypotheses, numbered from 0 to 100.
import numpy as np
xs = np.arange(101)
The prior probability for each bowl is \(1/101\). I could create a sequence with 101 identical values, but if all of the priors are equal, we only have to probide one value:
prior = 1/101
Because of the way I numbered the bowls, the probability of a vanilla cookie from Bowl \(x\) is \(x/100\). So we can compute the likelihoods like this:
likelihood = xs/100
And that’s all we need; the Bayes table does the rest:
table = make_bayes_table(xs, prior, likelihood)
Here’s a feature we have not seen before: we can give the index of the Bayes table a name, which will appear when we display the table.
table.index.name = 'Bowl'
Here are the first few rows:
table.head()
| prior | likelihood | unnorm | posterior | |
|---|---|---|---|---|
| Bowl | ||||
| 0 | 0.009901 | 0.00 | 0.000000 | 0.000000 |
| 1 | 0.009901 | 0.01 | 0.000099 | 0.000198 |
| 2 | 0.009901 | 0.02 | 0.000198 | 0.000396 |
| 3 | 0.009901 | 0.03 | 0.000297 | 0.000594 |
| 4 | 0.009901 | 0.04 | 0.000396 | 0.000792 |
Because Bowl 0 contains no vanilla cookies, its likelihood is 0, so its posterior probability is 0. That is, the cookie cannot have come from Bowl 0.
Here are the last few rows of the table.
table.tail()
| prior | likelihood | unnorm | posterior | |
|---|---|---|---|---|
| Bowl | ||||
| 96 | 0.009901 | 0.96 | 0.009505 | 0.019010 |
| 97 | 0.009901 | 0.97 | 0.009604 | 0.019208 |
| 98 | 0.009901 | 0.98 | 0.009703 | 0.019406 |
| 99 | 0.009901 | 0.99 | 0.009802 | 0.019604 |
| 100 | 0.009901 | 1.00 | 0.009901 | 0.019802 |
The posterior probabilities are substantially higher for the high-numbered bowls.
There is a pattern here that will be clearer if we plot the results.
import matplotlib.pyplot as plt
def plot_table(table):
"""Plot results from the 101 Bowls problem.
table: DataFrame representing a Bayes table
"""
table['prior'].plot()
table['posterior'].plot()
plt.xlabel('Bowl #')
plt.ylabel('Probability')
plt.legend()
plot_table(table)
plt.title('One cookie');
The prior probabilities are uniform; that is, they are the same for every bowl.
The posterior probabilities increase linearly; Bowl 0 is the least likely (actually impossible), and Bowl 100 is the most likely.
Two cookies¶
Suppose we put the first cookie back, stir the bowl thoroughly, and draw another cookie from the same bowl. and suppose it turns out to be another vanilla cookie.
Now what is the probability that we are drawing from Bowl \(x\)?
To answer this question, we can use the posterior probabilities from the previous problem as prior probabilities for a new Bayes table, and then update with the new data.
prior2 = table['posterior']
likelihood2 = likelihood
table2 = make_bayes_table(xs, prior2, likelihood2)
plot_table(table2)
plt.title('Two cookies');
The blue line shows the posterior after one cookie, which is the prior before the second cookie.
The orange line shows the posterior after two cookies, which curves upward. Having see two vanilla cookies, the high-numbered bowls are more likely; the low-numbered bowls are less likely.
I bet you can guess what’s coming next.
Three cookies¶
Suppose we put the cookie back, stir, draw another cookie from the same bowl, and get a chocolate cookie.
What do you think the posterior distribution looks like after these three cookies?
Hint: what’s the probability that the chocolate cookie came from Bowl 100?
We’ll use the posterior after two cookies as the prior for the third cookie:
prior3 = table2['posterior']
Now, what about the likelihoods? Remember that the probability of a vanilla cookie from Bowl \(x\) is \(x/100\). So the probability of a chocolate cookie is \((1 - x/100)\), which we can compute like this.
likelihood3 = 1 - xs/100
That’s it. Everything else is the same.
table3 = make_bayes_table(xs, prior3, likelihood3)
And here are the results
plot_table(table3)
plt.title('Three cookies');
The blue line is the posterior after two cookies; the orange line is the posterior after three cookies.
Because Bowl 100 contains no chocolate cookies, the posterior probability for Bowl 100 is 0.
The posterior distribution has a peak near 60%. We can use idxmax
to find it:
table3['posterior'].idxmax()
67
The peak in the posterior distribution is at 67%.
This value has a name; it is the MAP, which stands for “Maximum Aposteori Probability” (“aposteori” is Latin for posterior).
In this example, the MAP is close to the proportion of vanilla cookies in the dataset: 2/3.
Exercise: Let’s do a version of the dice problem where we roll the die more than once. Here’s the statement of the problem again:
Suppose you have a 4-sided, 6-sided, 8-sided, and 12-sided die. You choose one at random, roll it and get a 1.  What are the posterior probabilities for the other dice?
And here’s a solution using a Bayes table:
hypos = ['H4', 'H6', 'H8', 'H12']
prior = 1/4
likelihood = 1/4, 1/6, 1/8, 1/12
table = make_bayes_table(hypos, prior, likelihood)
table
| prior | likelihood | unnorm | posterior | |
|---|---|---|---|---|
| H4 | 0.25 | 0.250000 | 0.062500 | 0.400000 |
| H6 | 0.25 | 0.166667 | 0.041667 | 0.266667 |
| H8 | 0.25 | 0.125000 | 0.031250 | 0.200000 |
| H12 | 0.25 | 0.083333 | 0.020833 | 0.133333 |
Now suppose you roll the same die again and get a 6. What are the posterior probabilities after the second roll?
Use idxmax
to find the MAP.
# Solution
prior2 = table['posterior']
likelihood2 = 0, 1/6, 1/8, 1/12
table2 = make_bayes_table(hypos, prior2, likelihood2)
table2
| prior | likelihood | unnorm | posterior | |
|---|---|---|---|---|
| H4 | 0.400000 | 0.000000 | 0.000000 | 0.000000 |
| H6 | 0.266667 | 0.166667 | 0.044444 | 0.551724 |
| H8 | 0.200000 | 0.125000 | 0.025000 | 0.310345 |
| H12 | 0.133333 | 0.083333 | 0.011111 | 0.137931 |
# Solution
table2['posterior'].idxmax()
'H6'
Probability Mass Functions¶
When we do more than one update, we don’t always want to keep the whole Bayes table. In this section we’ll replace the Bayes table with a more compact representation, a probability mass function, or PMF.
A PMF is a set of possible outcomes and their corresponding probabilities. There are many ways to represent a PMF; in this notebook I’ll use a Pandas Series.
Here’s a function that takes a sequence of outcomes, xs
, and a sequence of probabilities, ps
, and returns a Pandas Series that represents a PMF.
def make_pmf(xs, ps, **options):
"""Make a Series that represents a PMF.
xs: sequence of values
ps: sequence of probabilities
options: keyword arguments passed to Series constructor
returns: Pandas Series
"""
pmf = pd.Series(ps, index=xs, **options)
return pmf
And here’s a PMF that represents the prior from the 101 Bowls problem.
xs = np.arange(101)
prior = 1/101
pmf = make_pmf(xs, prior)
pmf.head()
0 0.009901
1 0.009901
2 0.009901
3 0.009901
4 0.009901
dtype: float64
Now that we have a priod, we need to compute likelihoods.
Here are the likelihoods for a vanilla cookie:
likelihood_vanilla = xs / 100
And for a chocolate cookie.
likelihood_chocolate = 1 - xs / 100
To compute posterior probabilities, I’ll use the following function, which takes a PMF and a sequence of likelihoods, and updates the PMF:
def bayes_update(pmf, likelihood):
"""Do a Bayesian update.
pmf: Series that represents the prior
likelihood: sequence of likelihoods
"""
pmf *= likelihood
pmf /= pmf.sum()
The steps here are the same as in the Bayes table:
Multiply the prior by the likelihoods.
Add up the products to get the total probability of the data.
Divide through to normalize the posteriors.
Now we can do the update for a vanilla cookie.
bayes_update(pmf, likelihood_vanilla)
Here’s what the PMF looks like after the update.
pmf.plot()
plt.xlabel('Bowl #')
plt.ylabel('Probability')
plt.title('One cookie');
That’s consistent with what we got with the Bayes table.
The advantage of using a PMF is that it is easier to do multiple updates. The following cell starts again with the uniform prior and does updates with two vanilla cookies and one chocolate cookie:
data = 'VVC'
pmf = make_pmf(xs, prior)
for cookie in data:
if cookie == 'V':
bayes_update(pmf, likelihood_vanilla)
else:
bayes_update(pmf, likelihood_chocolate)
Here’s what the results look like:
pmf.plot()
plt.xlabel('Bowl #')
plt.ylabel('Probability')
plt.title('Three cookies');
Again, that’s consistent with what we got with the Bayes table.
In the next section, I’ll use a PMF and bayes_update
to solve a dice problem.
The dice problem¶
As an exercise, let’s do one more version of the dice problem:
Suppose you have a 4-sided, 6-sided, 8-sided, 12-sided, and a 20-sided die. You choose one at random, roll it and get a 7.  What are the posterior probabilities for the other dice?
Notice that in this version I’ve added a 20-sided die and the outcome is 7, not 1.
Here’s a PMF that represents the prior:
sides = np.array([4, 6, 8, 12, 20])
prior = 1/5
pmf = make_pmf(sides, prior)
pmf
4 0.2
6 0.2
8 0.2
12 0.2
20 0.2
dtype: float64
In this version, the hypotheses are integers rather than strings, so we can compute the likelihoods like this:
likelihood = 1 / sides
But the outcome is 7, so any die with fewer than 7 sides has likelihood 0.
We can adjust likelihood
by making a Boolean Series:
too_low = (sides < 7)
And using it to set the corresponding elements of likelihood
to 0.
likelihood[too_low] = 0
likelihood
array([0. , 0. , 0.125 , 0.08333333, 0.05 ])
Now we can do the update and display the results.
bayes_update(pmf, likelihood)
pmf
4 0.000000
6 0.000000
8 0.483871
12 0.322581
20 0.193548
dtype: float64
The 4-sided and 6-sided dice have been eliminated.
Exercise: Suppose you have the same set of 5 die. You choose a die, roll it six times, and get 6, 7, 2, 5, 1, and 2 again. Use idxmax
to find the MAP. What is the posterior probability of the MAP?
# Solution
sides = np.array([4, 6, 8, 12, 20])
prior = 1/5
pmf = make_pmf(sides, prior)
# Solution
outcomes = [6, 7, 2, 5, 1, 2]
for outcome in outcomes:
likelihood = 1 / sides
too_low = (sides < outcome)
likelihood[too_low] = 0
bayes_update(pmf, likelihood)
pmf
4 0.000000
6 0.000000
8 0.915845
12 0.080403
20 0.003751
dtype: float64
# Solution
MAP = pmf.idxmax()
MAP
8
# Solution
pmf[MAP]
0.91584527196901
Summary¶
In this notebook, we extended the cookie problem with more bowls and the dice problem with more dice.
I defined the MAP, which is the quantity in a posterior distribution with the highest probability.
Although the cookie problem is not particularly realistic or useful, the method we used to solve it applies to many problems in the real world where we want to estimate a proportion.
In the next notebook we’ll use the same method to take another step toward doing Bayesian statistics.


3
1 In this way, you who are wives should submit to your own husbands, so that, even if some are disobedient to the word, through their wives' behavior they may be won without a word,
2 because they will have seen your pure behavior with honor for themselves.
3 Let it not be done with outward ornaments—braided hair, jewels of gold, or fashionable clothing.
4 But let it be done instead with the inner person of the heart, and the lasting beauty of a gentle and quiet spirit, which is precious in the sight of God.
5 For holy women once adorned themselves in this way. They had confidence in God and they submitted to their own husbands.
6 In this way Sarah obeyed Abraham and called him lord. You are now her children if you do what is good and if you are not afraid of trouble.
7 In the same way, you husbands should live with your wives according to knowledge as the weaker female partner, recognizing them as fellow recipients of the gift of life. Do this so that your prayers are not hindered.
8 Finally, all of you, be likeminded, compassionate, loving as brothers, tenderhearted, and humble.
9 Do not pay back evil for evil or insult for insult; on the contrary, continue to bless, because for this you were called, that you might inherit a blessing.
10 "The one who wants to love life and to see good days should stop his tongue from evil and his lips from speaking deceit.
11 Let him turn away from what is bad and do what is good. Let him seek peace and pursue it.
12 The eyes of the Lord see the righteous, and his ears hear their requests. But the face of the Lord is against those who do evil."
13 Who is he who will harm you, if you desire what is good?
14 But if you do suffer because of righteousness, you are blessed. Do not fear what they fear. Do not be troubled.
15 Instead, set apart the Lord Christ in your hearts as holy. Always be ready to answer everyone who asks you why you have confidence in God. Do this with meekness and respect.
16 Have a good conscience so that the people who insult your good life in Christ may be ashamed because they are speaking against you as if you were evildoers.
17 It is better, if God desires, that you suffer for doing good than for doing evil.
18 Christ also suffered once for sins. He who is righteous suffered for us, who were unrighteous, so that he would bring us to God. He was put to death in the flesh, but he was made alive in the spirit.
19 In the spirit, he went and preached to the spirits who are now in prison.
20 They were disobedient when the patience of God was waiting in the days of Noah, in the days of the building of an ark, and God saved a few people—eight souls—through the water.
21 This is a symbol of the baptism that saves you now, not as a washing away of dirt from the body, but as the appeal of a good conscience to God, through the resurrection of Jesus Christ.
22 He is at the right hand of God. He went into heaven. Angels, authorities, and powers must submit to him.


Constructors and Destructors of HeatAPI
|
CHeatApp() |
This default Constructor creates a new instance of a CHeatApp |
|
~CHeatApp() |
This default Destructor releases any base resources allocated by the CHeatApp |
Interception Information and Control
|
initializeApp |
Launches an application with the given path and executable name. The app will be initially suspended. |
|
attachToApp |
Attaches to a closed application. |
|
attachToRunningApp |
Attaches to a running application |
|
detachFromApp |
Detaches from (stops interception of) the application that is currently being intercepted. |
|
deinitializeApp |
Terminates the process HEAT is currently attached to and removes all intercepts from the intercept list. |
|
isReady |
Returns true if an application is ready to run and be intercepted, false otherwise |
|
isRunning |
Returns true if the application is running |
|
setIsRunning |
Allows procedure to set running state |
|
setIsReady |
Allows procedure to set ready state |
|
setIsInjected |
Allows procedure to set injected state |
|
getProcessId |
Returns the ID of the current process |
|
getProcessHandle |
Returns the handle of the current process. |
|
getThreadId |
Returns the ID of the current thread. |
|
getThreadsInCurrentProcess |
Returns an array of thread IDs being used by the process |
|
runApp |
Begins execution of the process |
|
pauseApp |
Suspends execution of the process |
|
setPauseState |
For Externally setting the pause state of the application |
|
resumeApp |
Continues execution of the process |
|
terminateApp |
Terminates execution of the process |
|
interceptFunc |
Intercepts a function and redirects it. |
|
unInterceptFunc |
Stops intercepting calls from the Application Under Test |
|
deInitOnProcessTerminate |
Automatically unintercept all functions and detach from the process if the given process ID terminates. |
|
forceInject |
Injects HEAT into the attached process. |
|
delayedInject |
Injects HEAT into a process that hasnít been initialized yet. |
Application Execution Information and Control
|
runApp |
Resumes execution of the process. |
|
pauseApp |
Pauses execution of the process. |
|
setPauseState |
Forces the pause state of the process. |
|
resumeApp |
Resumes execution of the current process if it is paused |
|
terminateApp |
Terminates execution of the current process |
|
getProcessId |
Returns the process ID of the current process handled by this CHeatApp instance. |
|
getThreadId |
Returns the thread ID of the current process handled by this CHeatApp instance |
|
getThreadsInCurrentProcess |
The thread IDs for all of the threads associated with the current process handled by this CHeatApp are stored in threadList |
|
isRunning |
Returns true if an application is currently running and being intercepted, false otherwise |
|
getProcessHandle |
Gets a handle to the attached process. |
|
isReady |
Returns true if HEAT is ready to accept commands. If false, only initializeApp, attachToApp, or attachToRunningApp can be called. |
|
isRunning |
Determines if the app is executing. Returns false once the app has terminated. |
|
setIsRunning |
Allows the caller to override the value returned from isRunning. |
|
setIsReady |
Allows the caller to override the value returned from isReady |
|
setIsInjected |
Allows the caller to override the current injection state |


Math API
Usage
https://math.vercel.app?from=[LaTeX Math Equation]
Block notation
https://math.vercel.app?from=\frac{1}{\Gamma(s)}\int_{0}^{\infty}\frac{u^{s-1}}{e^{u}-1}\mathrm{d}u
Inline notation
https://math.vercel.app?inline=\frac{1}{\Gamma(s)}\int_{0}^{\infty}\frac{u^{s-1}}{e^{u}-1}\mathrm{d}u
Color
By default, the text color is black. You can manually change this behavior by passing `color` parameter.
https://math.vercel.app?color=red&from=\frac{1}{\Gamma(s)}\int_{0}^{\infty}\frac{u^{s-1}}{e^{u}-1}\mathrm{d}u
Background Color
By default, the background is transparent. You can manually change this behavior by passing `bgcolor` parameter. `auto` or any CSS color name can be used.
https://math.vercel.app?color=white&bgcolor=auto&from=\frac{1}{\Gamma(s)}\int_{0}^{\infty}\frac{u^{s-1}}{e^{u}-1}\mathrm{d}u
Online Editor
Preview
HTML
Markdown
URL
Resources
Source Code (GitHub)Author (Twitter)
Math API: LaTeX Math as SVG image - DEV Community 👩💻👨💻


Bootstrap 3+ Responsive Admin Dashboard Web App UI Framework
Bootkit is a Bootstrap based web UI kit, powered by Gulp, Bower and SCSS. Its very easy to customise and developer friendly. It is fully responsive admin dashboard template and very much adaptive with any size viewport including iPhone, iPad, android phone and tablet. It has a huge collection of reusable UI components and integrated with latest jQuery plugins.
Bootkit is slick, fat free and well documented. Use Bootkit to boost up user experience of your application, and give it a face lift in almost no time.
demo
│
├── assets/
│
├── bower_components/
│
├── build
│ ├── js/
│ └── sass/
│
├── dist
│ ├── css
│ │ ├── main.css
│ │ └── main.min.css
│ │
│ └── js
│ ├── main.js
│ └── main.min.js
│
├── imgs/
│
├── bower.json
│
├── gulpfile.js
│
├── package.json
│
└── *.html


What is NFC?
What can I do with NFC?
- Mobile Payments
- Sharing Data between Phones
- Contact Info on Conference Badge
- Pair with Bluetooth Device
- Mass Transit Card
- Smart Poster
- Hack Stuff
Devices
Tags
Tags hold a tiny amount of data
Think bytes
not kilobytes, megabytes, or gigabytes
Tag Types
Common properties
- UID
- Type
- Technology
- Capacity
- Is Locked
- Is Lockable
Each tag type
- Stores data in different binary format
- Has different security features
- Has different ways to read and write
NDEF
NFC Data Exchange Format
NDEF Message
NDEF Record
NDEF Record
- TNF (Type Name Format)
- Type
- Payload
- Record Id
TNF - Type Name Format
Indicates the structure of the value of the type field
TNF Constants
- Empty
- Well Known
- Mime Media
- External
Type
Identifier describing the type of the Payload
Must follow rules implied by TNF
Payload
Data for the user application
Empty Record
Text Record
hello, world
- TNF = Well Known
- Type = T
- Payload = 2 + en + hello, world
URI Record
http://arduino.cc
- TNF = Well Known
- Type = U
- Payload = 0x3 + arduino.cc
Mime Media Record
{ "message": "hello, world" }
- TNF = Mime Media
- Type = application/json
- Payload = { "message": "hello, world" }
Helper Methods
- message.addEmptyRecord();
- message.addTextRecord("hello, world");
- message.addUriRecord("http://arduino.cc");
- message.addMimeMediaRecord(
"text/json", { "message": "hello, world" }
);
NDEF Message
One or more NDEF Records
NDEF Record
Contains a payload of data
Information describing the payload
NDEF Library
for Arduino
https://github.com/don/NDEF
I2C
SPI
Setup
Write Tag
Read Tag
Memory
you will run out


Team 23 Awesomeness Translator
Enter into the required fields the information that you would like to be translated!
Full Name:
Email:
Language:
Description:


nips nips2000 nips2000-54 nips2000-54-reference knowledge-graph by maker-knowledge-mining
Source: pdf
Author: Jason Weston, Sayan Mukherjee, Olivier Chapelle, Massimiliano Pontil, Tomaso Poggio, Vladimir Vapnik
Abstract: We introduce a method of feature selection for Support Vector Machines. The method is based upon finding those features which minimize bounds on the leave-one-out error. This search can be efficiently performed via gradient descent. The resulting algorithms are shown to be superior to some standard feature selection algorithms on both toy data and real-life problems of face recognition, pedestrian detection and analyzing DNA micro array data.


delving into android apps
This one’s a bit off topic..
But from my last post, about LimitlessLED’s. The android app that they tell you to use from the play store (https://play.google.com/store/apps/details?id=com.lierda.wificontroller&hl=en) is functional, but terribly slow at starting up, and giving you access to your light. More often then not, my wife an I would find ourselves just using the physical light switch instead.
So Finally I found a pretty awesome app for controlling LED lights, (https://play.google.com/store/apps/details?id=tv.piratemedia.lightcontroler&hl=en) and Eliot, being a good bloke, as made his code open source. This app is awesome as it starts up instantly AND is has a widget you can put on your lockscreen or on a page! Although, his app, out of the box, only controls the RGBW lights, but because I have both in my home (RGBW and dual white) I decided to have a go at developing an app that suits my need (well not so much developing, more just copying and editing other code :P )
I took Eliot’s app code and, so far, I have modified it to control the white lights instead! I plan to make the app do both, but It wont be for another few weeks now, as I am in the final weeks of study at Uni.
Let me know if anyone’s interested in the app, and I’ll post the .apk and source code up on github, and if I’m really keen, put it up on the play store.
But big thanks to Eliot for making his code open source!


https://www.irs.gov/pub/irs-drop/n-14-21.pdf
"Q-1: How is virtual currency treated for federal tax purposes?
A-1: For federal tax purposes, virtual currency is treated as property. General tax
principles applicable to property transactions apply to transactions using virtual
currency."
(edited)


The text-transform property is used to specify uppercase and lowercase letters in a text. It can be used to turn everything into uppercase or lowercase letters, or capitalize the first letter of each word.
Text Transform into uppercase letters
Text Transform into lower case letters
Text Transform into Capital


b e a t r i c e a i s p u r o |
2012 | ||
Throughout my fifteen-year career, I have been involved in the planning and management of hundreds of outstanding design and outreach projects. I have extensive experience designing print and web collateral and rebranding corporate identities. I have developed successful marketing and outreach campaigns, and produced numerous websites. In addition to superior research and analytical skills, I am capable of managing multiple projects and delivering quality work while meeting deadlines successfully. As the first webmaster and designer at Caltech, I collaborated extensively with staff and faculty in creating and developing promotional material, both online and in print. I served as designer and editor of the original Caltech Alumni Newsletter, supervised staff, and taught classes in design and HTML. Also, as a native Spanish speaker, I translated documents and facilitated bilingual discussions for geologists conducting research in Mexico. I translated several storefront sites (MLB/Copeland's/Victory) into Spanish. I recently concluded a web usability study for Intergraph Corporation where I restructured the intergraph.com site's information architecture and created new wireframes with intuitive navigation. I am extremely well-organized, resourceful, proactive, and energetic. I believe my design skills, project management experience, and effective communication skills will be a valuable asset to your group. Below are some links to design samples and my LinkedIn profile, which contains several recommendations. I look forward to speaking with you soon. Sincerely,
|
|||
:: LinkedIn profile
|
|||
| :: sample sites | |||


Yort.Zip.InStore Quick Start
Creating an Order (Taking Payment)
Basic Process
- Create an instance of ZipClient
- Call ZipClient.CreateOrderAsync
- If the response from of step 2 has a success status, use ZipClient.GetStatus to poll at one second (or longer) intervals until an accepted, declined or cancelled status is reached. Prior to the order being accepted, declined or cancelled Zip will return a status with a result of Error and a message of Order not found. Handle any transient errors thrown from the polling request.

- Once a final status is reached, you can determine whether payment was approved or not by checking the outcome. You need to record the OrderId of the result somewhere if you want to be able to process refunds in the future.
NB This is only a simple/demo implementation. A production quality implementation needs much more robust logic to handle power failure/crash/network outages and other problems.
Add the Nuget package
Install the Nuget package;
PM> Install-Package Yort.Zip.InStore
[]
Full Code Sample
A full (demo quality) code sample for creating payment, with minimum comments/noise. See the following sections for a breakdown of what's going on and why.
IZipClient client = new ZipClient
(
new ZipClientConfiguration("YourClientId", "YourClientSecret", ZipEnvironment.NewZealand.Test)
);
var request = new CreateOrderRequest()
{
TerminalId = "2531",
Order = new ZipOrder()
{
Amount = 10.5M,
CustomerApprovalCode = "AA05",
MerchantReference = Guid.NewGuid().ToString(),
Operator = "Kermit The Frog",
PaymentFlow = ZipPaymentFlow.Payment,
}
};
CreateOrderResponse result = await client.CreateOrderAsync(request);
var statusRequest = new OrderStatusRequest() { OrderId = result.OrderId };
var done = false;
while (!done)
{
await Task.Delay(1000);
status = await client.GetOrderStatusAsync(statusRequest);
if (status.Result == ZipOrderStatus.Cancelled) throw new OperationCanceledException();
done = ZipOrderStatus.IsTerminalStatus(statusResponse.Status);
}
if (statusResponse.Status != ZipOrderStatus.Complete)
throw new InvalidOperationException("Payment failed: " + statusResponse.Status);
return status.OrderId;
Configure and Create A ZipClient Instance
The ZipClient is the main class in this library to use for accessing the Zip API functionality. To create an instance first you must create a ZipClientConfiguration object that tells the client how to behave. This sample configures a client for accessing the sandbox/text version of the API.
You'll need a client id and secret issued by Zip for the sandbox environment for this to work.
Normally you would create the Zip instance on start-up or first use, and then re-use it across requests instead of creating a new one each time. This allows HTTP connection pooling and improves performance. The ZipClient instance is thread-safe in so much as you can run multiple requests through the same instance for different payments from different threads.
WARNING: If you are injecting an instance of HttpClient via the httpClient constructor argument, make sure the 'AllowAutoRedirect' property on the inner most handler (and any intermediate ones) is set to false. The Zip API returns redirect responses in some situations that must be handled manually by the ZipClient instance for correct behaviour to be applied.
//Zip will issue a client id and secret for each environment,
//you need to contact Zip to get these.
var config = new ZipClientConfiguration
(
"YourClientId",
"YourClientSecret",
ZipEnvironment.NewZealand.Test
);
//We use IZipClient as the type for the variable holding
//the ZipClient instance here as it makes it easier if we
//want a test implementation later.
IZipClient client = new ZipClient(config);
Call Create Order
Now we can create an order. Create a CreateOrderRequest with details of the payment to take, and pass it to the ZipClient.CreateOrderAsync method.
//We'll set the minimum required properties for this example
var request = new CreateOrderRequest()
{
TerminalId = "2531",
Order = new ZipOrder()
{
Amount = 10.5M,
CustomerApprovalCode = "AA05",
MerchantReference = Guid.NewGuid().ToString(),
Operator = "Kermit The Frog",
PaymentFlow = ZipPaymentFlow.Payment,
}
};
//Note, this method could throw exceptions. Production quality code
//would handle them appropriately.
CreateOrderResponse result = await client.CreateOrderAsync(request);
Poll for Status
Now we need to wait for the customer to approve or decline the payment request via the Zip app or website. If they approve the payment then it will be sent by Zip to the payment processor, and if the payment processor accepts then we'll get a completed status. If either the customer or the payment processor declines the response we'll get a cancel/declined or error response.
var done = false;
// Create a status request. You can create a new one on each loop or
// reuse the same one, which is more efficient so that's what we do here.
// Unfortunately the Zip status endpoint doesn't use the merchant reference, but
// instead the order id returned by the initial create request. If that initial
// request is interrupted by a crash, power failure, timeout/network error etc.
// you must retry it with duplicate checking enabled until such time as you
// receive an order id you can status check against.
var statusRequest = new OrderStatusRequest() { OrderId = result.OrderId };
OrderStatusResponse status = null;
//Production quality code would also have a timeout, in case the user
//is unable to approve or cancel the order in a timely fashion at
//the till. There should also be an option for the operator to manually
//cancel, in the case where the payment amount has been incorrectly entered
//or the consumer is unable to cancel themselves.
var done = false;
while (!done)
{
await Task.Delay(1000); // Wait one second between poll requests
//Request the current status
status = await client.GetOrderStatusAsync(statusRequest);
//Detect if we got a final status
if (status.Result == ZipOrderStatus.Cancelled) throw new OperationCanceledException();
done = ZipOrderStatus.IsTerminalStatus(statusResponse.Status);
}
//If the payment reached a final status other than complete, throw an exception to notify the caller.
if (statusResponse.Status != ZipOrderStatus.Complete)
throw new InvalidOperationException("Payment failed: " + statusResponse.Status);
// At this point if the customer approved the payment then status.Result
// should be "Completed" and the payment plan should be in place.
// You need to keep the Zip order id for future use
// with refunds.
return status.OrderId;
Cancelling an Order
To cancel a Zip order that is still pending approval (not accepted, declined or cancelled) you will need the OrderId returned in the CreateOrderResponse. Cancellation is successful if the CancelOrderAsync method does not throw an exception. The CancelOrderRequest instance returned will contain the order id of the cancelled order as confirmation.
try
{
var cancelRequest = new CancelOrderRequest() { OrderId = createOrderResult.OrderId, Operator = "Test", TerminalId = "2531" };
var cancelResponse = await client.CancelOrderAsync(cancelRequest);
//Cancellation succeeded
}
catch (Exception) // Production code should catch specific exception types
{
//Cancellation failed
}
Refunding an Order
Once an order has been approved you can make one or more refunds against it, up to the total value of the original order. For each refund create a RefundOrderRequest, specify the order id that was returned when the order was created, the refund amount and a unique reference for the refund request. If you get interrupted (power failure, crash, network outage) or suffer a transient error sending a refund, resend the same request again until you get a valid response. Using the same refund details on the retry requests should ensure idempotency and prevent multiple refunds being created if the earlier attempts did actually succeed.
var createRefundRequest = new RefundOrderRequest()
{
MerchantRefundReference = System.Guid.NewGuid().ToString(),
OrderId = createOrderResult.OrderId,
Amount = 1,
Operator = "Test",
TerminalId = "2531"
};
try
{
var refundResponse = await client.RefundOrderAsync(refundRequest);
//Refund succeeded, refundResponse.Id will contain the id of the new refund.
}
catch (Exception) // Production code should catch specific exception types
{
//Refund failed
}


ProjectLibre is a project management software system. It intends to be a complete desktop replacement for Microsoft Project. ProjectLibre runs on the Java Platform, allowing it to run on the Linux, Mac OS or MS Windows operating systems.
Features:
- Microsoft Project replacement
- Gantt Chart
- New and updated version of OpenProj with hundreds of updates/bug fixes
- Earned Value Costing
- PERT Charts
- Project Management software
- RBS Chart
- New version of OpenProj
|
|


This is regular text
Something here
Something here
Something here
Something here
This is muted text
This is primary text
This is info text
This is success text
This is warning text
This is danger text
This is light text
This is dark text
Primary Text color
Muted Text color
Danger Text color
Green 500 Text color
Yellow 500 Text color


Is Huddersfield Town v Birmingham City on TV? Channel details, kick-off time, latest news and match odds
Birmingham City latest | Pep Clotet's side head to West Yorkshire as Championship action returns for Birmingham City.
by Tom Leach, https://www.birminghammail.co.uk/authors/tom-leach/What time is kick-off?
Birmingham will take on Huddersfield Town at the John Smith Stadium on 3pm on Saturday, October 23.
Is Huddersfield Town v Birmingham City on TV?
Saturday's game will not be available on TV in the UK.
This weekend Sky Sports have selected three LIVE television games, both shown on Sky Sports Football.
They have opted to show QPR's trip to face Fulham, Middlesbrough v Hull City and Charlton's clash with Cardiff City at The Valley.
But, those looking to watch the game outside the UK can watch LIVE on the club's website with an iFollow subscription.
Birmingham City latest
This is your round up of all things Birmingham City; the one-stop shop that will keep you updated on the latest goings on at the club and beyond.
Transfers, injuries, match-days and managers, we’ve got you covered.
We’ll be bringing the very latest on the Blues throughout the week and around the clock.
Make sure you keep yourself updated with our handy daily catch up...
Must reads...
- The EFL charge that will interest Birmingham City and Garry Monk
- The exciting transfer promise Birmingham City have made their fans
- Birmingham City's plan to resolve the big issue that's angered fans
- Sunjic, Colin, Camp - How Birmingham City's players rate this season
- A new striker, Jude and contracts - Blues' January priorities
For all your latest BCFC news, opinion, analysis and transfer gossip, click here
You can follow our Blues reporter Brian Dick on Twitter, and his email address is<EMAIL_ADDRESS>Will the game be on Quest's EFL highlights show?
Besides Hull's trip to face Middlesbrough on Sunday, all the rest of the Championship action will be available on Quest on Saturday night.
It is part of a four year deal which will bring 90 minutes of match highlights, hosted by Colin Murray, at 9pm.
Quest are also broadcasting 10 hour-long highlights shows capturing the action from every round of midweek fixtures.
In addition, they have been presenting eight hour-long highlights shows from the Carabao Cup and Checkatrade Trophy as part of the arrangement.
Quest is available in 27 million homes across Freeview, Freesat, Sky, Virgin Media and BT TV. With a monthly reach of 12.4 million, Quest is Discovery’s largest channel in the UK.
The EFL highlights will headline Quest’s line-up of sports events throughout the year which are delivered in conjunction with Eurosport.
Each show will feature every goal from every Saturday and Friday night EFL fixture plus analysis from a selection of pundits.
Where to find Quest
Freeview – 37
Sky – 144
Virgin – 172
Freesat – 167
Birmingham City TV fixtures
Birmingham City v Queens Park Rangers
Wednesday, December 11 (7.45pm) - Sky Sports Football
Birmingham City v West Bromwich Albion
Saturday, December 14 (12.30pm) - Sky Sports Football
Form Guide
Birmingham City: LLWWL
Huddersfield Town: LWWDD
Match odds
Birmingham City win: 18/11
The draw: 2/1
Huddersfield Town win: 8/5
(Odds supplied by Oddschecker)


Stars: 4.5
Location: 1230 Grant Ave San Francisco
Menu: Deep Fried Salmon Roll, Blue Jake Bean Tempura, sea bass with wasabi noodles
License: Yes
Style: Japaness
Reviews: "Greet restaurant"
Open hours: 11:30-20:00
Stars: 4
Location: 3406 18th St San Francisco
Menu: tea leaf salad, Yamo house oil noodle with chicken, Summer roll
License: Yes
Style: Japaness
Reviews: "Not as high quality food as the other famous Burmese restaurants in SF", "I don't understand the high reviews."
Open hours: 11:00-21:30
Stars: 4
Location: 849 Vallejo St San Francisco
Menu: pork stewed in soy sauce, Kung Pao Chicken
License: Yes
Style: Chinese
Reviews: "Good food, nice host"
Open hours: 11:00-20:00
Stars: 3.5
Location: 620 Broadway San Francisco
Menu: Bun rieu, combo pho, pork spring rolls
License: Yes
Style: vietnamese
Reviews: "superbly flavored grilled beef! more intense and robust than cheese steak.", "I tried this place based on the number of reviews, but was definitely disappointed."
Open hours: 9:00-3:00


This module exists to demonstrate the use of an RxJS observable on events, taking advantage of operators like map. Here I'll simply show the power of a reactive observable, which is like a much more powerful version of a promise.
Double click the button below, and see the count of double clicks indicated below.


Reveal.js
Slideshows for the 21st century
It runs on the Web
And therefore on almost any device
It runs on the Web
And can do anything a Web App can do.
It's made for slideshows
so it can make bullet points
You can show images
Have you seen
the hidden slides?
Excercises
- Copy this slideshow and open in browser
- Insert an empty slide
- Create a slide with bullet points
- Play with the appearance of bullets by adding and removing: class="fragment"
- Add another image
- Add another video
- Change the size of the image
- Play with the animations and transitions
- Embed a google map
- Start hacking some JS code!
Oh yeah,
don't forget to try the escape button!


{$Think.session.admin_infor.admin_name} {$Think.session.admin_infor.admin_account} {$Think.session.admin_role.role_name?$Think.session.admin_role.role_name:'未授权'}


REGAL SEGADE LTD is one of the leading export trading company in Nigeria. We are a diversified and Integrated company registered under the Corporate Affairs Commission (CAC) and licensed by the Nigeria Export Promotion Council (NEPC) to carry out a number of business operations among which are exportation of agricultural commodities, mineral resources, export brokerage, consultancy and haulage.Our business is built on the ethos of giving our customers exactly what they want, where and when they need it.
Through our experience in the industry, we have been able to export top quality commodities to different countries in the world including Germany, Portugal, Israel, Turkey, United Kingdom (U.K), United Arab Emirates (U.A.E), Jordan etc.