|
Machine Learning with R Basel R Bootcamp |
from xkcd.com
By the end of this practical you will know how to:
In this practical, we will predict the Salary
of baseball players from the hitters_train
and hitters_test
datasets.
Open your BaselRBootcamp
R project. It should already have the folders 1_Data
and 2_Code
. Make sure that the data file(s) listed in the Datasets
section are in your 1_Data
folder
Open a new R script. At the top of the script, using comments, write your name and the date. Save it as a new file called Optimization_practical.R
in the 2_Code
folder.
Using library()
load the set of packages for this practical listed in the packages section above.
# Load packages necessary for this script
library(tidyverse)
library(caret)
library(party)
library(partykit)
Datasets
section as new objects.# hitters data
hitters_train <- read_csv(file = "1_Data/hitters_train.csv")
hitters_test <- read_csv(file = "1_Data/hitters_test.csv")
# Print dataframes to the console
hitters_train
hitters_test
dim()
function.# Print numbers of rows and columns
dim(XXX)
dim(XXX)
dim(hitters_train)
[1] 50 20
dim(hitters_test)
[1] 213 20
names()
function.# Print the names of each dataframe
names(XXX)
names(XXX)
names(hitters_train)
[1] "Salary" "AtBat" "Hits" "HmRun" "Runs"
[6] "RBI" "Walks" "Years" "CAtBat" "CHits"
[11] "CHmRun" "CRuns" "CRBI" "CWalks" "League"
[16] "Division" "PutOuts" "Assists" "Errors" "NewLeague"
names(hitters_test)
[1] "Salary" "AtBat" "Hits" "HmRun" "Runs"
[6] "RBI" "Walks" "Years" "CAtBat" "CHits"
[11] "CHmRun" "CRuns" "CRBI" "CWalks" "League"
[16] "Division" "PutOuts" "Assists" "Errors" "NewLeague"
View()
. Do they look ok?# Open each dataset in a window.
View(XXX)
View(XXX)
# Convert all character columns to factor
hitters_train <- hitters_train %>%
mutate_if(is.character, factor)
hitters_test <- hitters_test %>%
mutate_if(is.character, factor)
trainControl
ctrl_cv
as 10-fold cross-validation. Specifically,…method = "cv"
to specify cross validation.number = 10
to specify 10 folds.# Use 10-fold cross validation
ctrl_cv <- trainControl(method = "XX",
number = XX)
# Use 10-fold cross validation
ctrl_cv <- trainControl(method = "cv",
number = 10)
Salary
as a function of all features. Specifically,…Salary ~ .
.hitters_train
."glm"
for regular regression.ctrl_cv
.# Normal Regression --------------------------
salary_glm <- train(form = XX ~ .,
data = XX,
method = "XX",
trControl = XX)
# Normal Regression --------------------------
salary_glm <- train(form = Salary ~ .,
data = hitters_train,
method = "glm",
trControl = ctrl_cv)
salary_glm
. What do you see?salary_glm
Generalized Linear Model
50 samples
19 predictors
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 43, 45, 45, 46, 45, 46, ...
Resampling results:
RMSE Rsquared MAE
575 0.377 490
salary_glm
object. What happens? What does this error mean?# I get the following error:
# Error in plot.train(salary_glm) :
# There are no tuning parameters for this model.
# The problem is that method = "glm" has no tuning parameters so there is nothing to plot!
salary_glm$finalModel
.# Print final regression model
salary_glm$finalModel
Call: NULL
Coefficients:
(Intercept) AtBat Hits HmRun Runs
664.0169 -1.8086 12.7263 14.0206 -10.7594
RBI Walks Years CAtBat CHits
-5.1859 -8.6702 -62.3666 0.4883 -4.9553
CHmRun CRuns CRBI CWalks LeagueN
-8.3973 5.7164 4.3061 0.3754 144.0316
DivisionW PutOuts Assists Errors NewLeagueN
-75.0233 -0.0843 0.5934 -9.7698 223.6980
Degrees of Freedom: 49 Total (i.e. Null); 30 Residual
Null Deviance: 12600000
Residual Deviance: 5110000 AIC: 761
coef()
.# Print glm coefficients
coef(salary_glm$finalModel)
(Intercept) AtBat Hits HmRun Runs RBI
664.0169 -1.8086 12.7263 14.0206 -10.7594 -5.1859
Walks Years CAtBat CHits CHmRun CRuns
-8.6702 -62.3666 0.4883 -4.9553 -8.3973 5.7164
CRBI CWalks LeagueN DivisionW PutOuts Assists
4.3061 0.3754 144.0316 -75.0233 -0.0843 0.5934
Errors NewLeagueN
-9.7698 223.6980
It’s time to fit an optimized regression model with a Ridge penalty!
lambda_vec
which contains 100 values spanning a wide range, from very close to 0 to 1,000.# Vector of lambda values to try
lambda_vec <- 10 ^ (seq(-4, 4, length = 100))
Salary
as a function of all features. Specifically,…Salary ~ .
.hitters_train
."glmnet"
for regularized regression.ctrl_cv
.preProcess
argument to c("center", "scale")
to make sure the variables are standarised when estimating the beta weights (this is good practice for ridge regression as otherwise the different scales of the variables impact the betas and thus the punishment would also depend on the scale).lambda_vec
(we’ve done this for you below).# Ridge Regression --------------------------
salary_ridge <- train(form = XX ~ .,
data = XX,
method = "XX",
trControl = XX,
preProcess = c("XX", "XX"), # Standardise
tuneGrid = expand.grid(alpha = 0, # Ridge penalty
lambda = lambda_vec))
# Ridge Regression --------------------------
salary_ridge <- train(form = Salary ~ .,
data = hitters_train,
method = "glmnet",
trControl = ctrl_cv,
preProcess = c("center", "scale"), # Standardise
tuneGrid = expand.grid(alpha = 0, # Ridge penalty
lambda = lambda_vec))
salary_ridge
object. What do you see?salary_ridge
glmnet
50 samples
19 predictors
Pre-processing: centered (19), scaled (19)
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 46, 44, 44, 46, 45, 44, ...

The final values used for the model were alpha = 0 and lambda = 739.
salary_ridge
object. What do you see? Which value of the regularization parameter seems to be the best?# Plot salary_ridge object
plot(XX)
plot(salary_ridge)
# Print best regularisation parameter
salary_ridge$bestTune$lambda
[1] 739
# Get coefficients from best lambda value
coef(salary_ridge$finalModel,
salary_ridge$bestTune$lambda)
20 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 608.79
AtBat -8.96
Hits 6.28
HmRun -9.15
Runs 8.39
RBI 6.18
Walks 11.17
Years 12.10
CAtBat 30.42
CHits 32.50
CHmRun 26.36
CRuns 40.55
CRBI 35.48
CWalks 42.49
LeagueN 43.26
DivisionW -42.79
PutOuts 15.77
Assists 41.40
Errors -13.56
NewLeagueN 27.89
# Actually the look quite different! The reason why is that we have changed the scale using preProcess
# If you want the coefficients on the original scale, you'd need to convert them, or run your training again without any processing. However, this can lead to problems finding the optimal Lambda value...
It’s time to fit an optimized regression model with a Lasso penalty!
lambda_vec
which contains 100 values between 0 and 1,000.# Determine possible values of lambda
lambda_vec <- 10 ^ seq(from = -4, to = 4, length = 100)
Salary
as a function of all features. Specifically,…Salary ~ .
.hitters_train
."glmnet"
for regularized regression.ctrl_cv
.preProcess
argument to c("center", "scale")
to make sure the variables are standarised when estimating the beta weights (this is also good practice for lasso regression).lambda_vec
(we’ve done this for you below).# Lasso Regression --------------------------
salary_lasso <- train(form = XX ~ .,
data = XX,
method = "XX",
trControl = XX,
preProcess = c("XX", "XX"), # Standardise
tuneGrid = expand.grid(alpha = 1, # Lasso penalty
lambda = lambda_vec))
# Fit a lasso regression
salary_lasso <- train(form = Salary ~ .,
data = hitters_train,
method = "glmnet",
trControl = ctrl_cv,
preProcess = c("center", "scale"),
tuneGrid = expand.grid(alpha = 1, # Lasso penalty
lambda = lambda_vec))
salary_lasso
object. What do you see?salary_lasso
glmnet
50 samples
19 predictors
Pre-processing: centered (19), scaled (19)
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 44, 46, 45, 45, 44, 45, ...

The final values used for the model were alpha = 1 and lambda = 45.3.
salary_lasso
object. What do you see? Which value of the regularization parameter seems to be the best?# Plot salary_lasso object
plot(XX)
plot(salary_lasso)
# Print best regularisation parameter
salary_lasso$bestTune$lambda
[1] 45.3
# Get coefficients from best lambda value
coef(salary_lasso$finalModel,
salary_lasso$bestTune$lambda)
20 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 608.8
AtBat .
Hits .
HmRun .
Runs .
RBI .
Walks .
Years .
CAtBat .
CHits .
CHmRun .
CRuns 134.2
CRBI .
CWalks 108.9
LeagueN 88.9
DivisionW -58.1
PutOuts .
Assists 34.1
Errors .
NewLeagueN .
# Yep!
# I see that many features are now removed!
It’s time to fit an optimized decision tree model!
cp
we want to try. Using the code below, create a vector called cp_vec
which contains 100 values between 0 and 1.# Determine possible values of the complexity parameter cp
cp_vec <- seq(from = 0, to = 1, length = 100)
Salary
as a function of all features. Specifically,…Salary ~ .
.hitters_train
."rpart"
for decision trees.ctrl_cv
,cp
values you specified in cp_vec
.# Decision Tree --------------------------
salary_rpart <- train(form = XX ~ .,
data = XX,
method = "XX",
trControl = XX,
tuneGrid = expand.grid(cp = cp_vec))
# Decision Tree --------------------------
salary_rpart <- train(form = Salary ~ .,
data = hitters_train,
method = "rpart",
trControl = ctrl_cv,
tuneGrid = expand.grid(cp = cp_vec))
salary_rpart
object. What do you see?salary_rpart
CART
50 samples
19 predictors
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 46, 44, 44, 44, 44, 46, ...

The final value used for the model was cp = 0.0303.
salary_rpart
object. What do you see? Which value of the complexity parameter seems to be the best?# Plot salary_rpart object
plot(XX)
plot(salary_rpart)
cp
by running the following code. Does this match what you saw in the plot above?# Print best regularisation parameter
salary_rpart$bestTune$cp
[1] 0.0303
# Visualise your trees
plot(as.party(salary_rpart$finalModel))
# Actually, the tree just has one root and no nodes! This is due to the optimal complexity parameter being so high.
It’s time to fit an optimized random forest model!
mtry
we want to try. Using the code below, create a vector called mtry_vec
which is a sequence of numbers from 1 to 10.# Determine possible values of the random forest diversity parameter mtry
mtry_vec <- 1:10
Salary
as a function of all features. Specifically,…Salary ~ .
.hitters_train
."rf"
for random forests.ctrl_cv
.mtry_vec
.# Random Forest --------------------------
salary_rf <- train(form = XX ~ .,
data = XX,
method = "XX",
trControl = XX,
tuneGrid = expand.grid(mtry = mtry_vec))
# Random Forest --------------------------
salary_rf <- train(form = Salary ~ .,
data = hitters_train,
method = "rf",
trControl = ctrl_cv,
tuneGrid = expand.grid(mtry = mtry_vec))
salary_rf
object. What do you see?salary_rf
Random Forest
50 samples
19 predictors
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 46, 45, 46, 45, 45, 45, ...
Resampling results across tuning parameters:
mtry RMSE Rsquared MAE
1 353 0.608 259
2 339 0.628 246
3 333 0.634 240
4 331 0.634 240
5 331 0.628 241
6 332 0.630 240
7 331 0.627 239
8 329 0.623 238
9 329 0.623 238
10 328 0.614 238
RMSE was used to select the optimal model using the smallest value.
The final value used for the model was mtry = 10.
salary_rf
object. What do you see? Which value of the regularization parameter seems to be the best?# Plot salary_rf object
plot(XX)
plot(salary_rf)
mtry
by running the following code. Does this match what you saw in the plot above?# Print best mtry parameter
salary_rf$bestTune$mtry
[1] 10
resamples()
, calculate the estimated prediction accuracy for each of your models. To do this, put your model objects in the named list (e.g.; glm = salary_glm
, …). See below.# Summarise accuracy statistics across folds
salary_resamples <- resamples(list(glm = XXX,
ridge = XXX,
lasso = XXX,
rpart = XXX,
rf = XXX))
# Summarise accuracy statistics across folds
salary_resamples <- resamples(list(glm = salary_glm,
ridge = salary_ridge,
lasso = salary_lasso,
dt = salary_rpart,
rf = salary_rf))
salary_resamples
object with summary(salary_resamples)
. What does this tell you? Which model do you expect to have the best prediction accuracy for the test data?# Print summaries of cross-validation accuracy
# I see below that the random forest model has the lowest mean MAE, so I
# would expect it to be the best model in the true test data
summary(salary_resamples)
Call:
summary.resamples(object = salary_resamples)
Models: glm, ridge, lasso, dt, rf
Number of resamples: 10
MAE
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
glm 253 377 497 490 559 743 0
ridge 147 211 319 314 354 596 0
lasso 187 216 297 320 386 514 0
dt 170 262 396 354 423 500 0
rf 45 175 273 238 318 336 0
RMSE
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
glm 274.8 490 533 575 735 901 0
ridge 176.5 257 387 409 477 916 0
lasso 211.2 233 379 407 458 893 0
dt 267.0 381 429 464 491 812 0
rf 47.2 228 330 328 382 625 0
Rsquared
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
glm 0.013772 0.1228 0.203 0.377 0.701 0.893 0
ridge 0.131450 0.4330 0.671 0.612 0.808 0.973 0
lasso 0.017893 0.1669 0.581 0.501 0.784 0.965 0
dt 0.000986 0.0235 0.156 0.305 0.463 0.955 0
rf 0.122475 0.3378 0.740 0.614 0.783 0.981 0
criterion_test
.# Save salaries of players in test dataset as criterion_test
criterion_test <- XXX$XXX
criterion_test <- hitters_test$Salary
predict()
, save the prediction of your regular regression model salary_glm
for the hitters_test
data as a new object called glm_pred
. Specifically,…salary_glm
.hitters_test
.# Save the glm predicted salaries of hitters_test
glm_pred <- predict(XXX, newdata = XXX)
# Save predictions for glm
glm_pred <- predict(salary_glm, newdata = hitters_test)
ridge_pred
, lasso_pred
, rpart_pred
and rf_pred
.ridge_pred <- predict(XXX, newdata = XXX)
lasso_pred <- predict(XXX, newdata = XXX)
rpart_pred <- predict(XXX, newdata = XXX)
rf_pred <- predict(XXX, newdata = XXX)
# Save predictions from other models
ridge_pred <- predict(salary_ridge, newdata = hitters_test)
lasso_pred <- predict(salary_lasso, newdata = hitters_test)
rpart_pred <- predict(salary_rpart, newdata = hitters_test)
rf_pred <- predict(salary_rf, newdata = hitters_test)
postResample()
, calculate the aggregate prediction accuracy for each model using the template below. Specifically,…ridge_pred
).obs
argument to the true criterion values criterion_test
).# Calculate aggregate accuracy for a model
postResample(pred = XXX,
obs = XXX)
# Prediction error for normal regression
postResample(pred = glm_pred,
obs = hitters_test$Salary)
RMSE Rsquared MAE
552.1782 0.0907 421.8898
# Prediction error for ridge regression
postResample(pred = ridge_pred,
obs = hitters_test$Salary)
RMSE Rsquared MAE
366.712 0.329 274.623
# Prediction error for lasso regression
postResample(pred = lasso_pred,
obs = hitters_test$Salary)
RMSE Rsquared MAE
389.565 0.254 286.021
# Prediction error for decision trees
postResample(pred = rpart_pred,
obs = hitters_test$Salary)
RMSE Rsquared MAE
359.273 0.358 269.471
# Prediction error for random forests
postResample(pred = rf_pred,
obs = hitters_test$Salary)
RMSE Rsquared MAE
301.353 0.531 199.995
# Random forests had the lowest test MAE of
postResample(pred = rf_pred,
obs = hitters_test$Salary)[3]
MAE
200
resamples()
?# Depends on what you mean by 'close', but they are definitely higher (worse) in the test data
ctrl_cv_rep
as below. Then, train your models again using ctrl_cv_rep
(instead of ctrl_cv
), and evaluate their prediction performance. Do they improve? Do you get different optimal tuning values compared to your previous models?# Repeated cross validation.
# Folds = 10
# Repeats = 5
ctrl_cv_rep <- trainControl(method = "repeatedcv",
number = 10,
repeats = 5)
Using the same procedure as above, compare models predicting the prices of houses in King County Washington using the house_train
and house_test
datasets.
When using lasso regression, do you find that the lasso sets any beta weights to exactly 0? If so, which ones?
Which model does the best and how accurate was it? Was it the same model that performed the best predicting baseball player salaries?
Using the same procedure as above, compare models predicting the graduate rate of students from different colleges using the college_train
and college_test
datasets.
When using lasso regression, do you find that the lasso sets any beta weights to exactly 0? If so, which ones?
Which model does the best and how accurate was it? Was it the same model that performed the best predicting baseball player salaries?
# Model optimization with Regression
# Step 0: Load packages-----------
library(tidyverse) # Load tidyverse for dplyr and tidyr
library(caret) # For ML mastery
library(partykit) # For decision trees
library(party) # For decision trees
# Step 1: Load, clean, and explore data ----------------------
# training data
data_train <- read_csv("1_Data/diamonds_train.csv")
# test data
data_test <- read_csv("1_Data/diamonds_test.csv")
# Convert all characters to factor
# Some ML models require factors
data_train <- data_train %>%
mutate_if(is.character, factor)
data_test <- data_test %>%
mutate_if(is.character, factor)
# Explore training data
data_train # Print the dataset
View(data_train) # Open in a new spreadsheet-like window
dim(data_train) # Print dimensions
names(data_train) # Print the names
# Define criterion_train
# We'll use this later to evaluate model accuracy
criterion_train <- data_train$price
criterion_test <- data_test$price
# Step 2: Define training control parameters -------------
# Use 10-fold cross validation
ctrl_cv <- trainControl(method = "cv",
number = 10)
# Step 3: Train models: -----------------------------
# Criterion: hwy
# Features: year, cyl, displ
# Normal Regression --------------------------
price_glm <- train(form = price ~ carat + depth + table + x + y,
data = data_train,
method = "glm",
trControl = ctrl_cv)
# Print key results
price_glm
# RMSE Rsquared MAE
# 1506 0.86 921
# Coefficients
coef(price_glm$finalModel)
# (Intercept) carat depth table x y
# 21464.9 11040.4 -215.6 -94.2 -3681.6 2358.9
# Lasso --------------------------
# Vector of lambda values to try
lambda_vec <- 10 ^ seq(-3, 3, length = 100)
price_lasso <- train(form = price ~ carat + depth + table + x + y,
data = data_train,
method = "glmnet",
trControl = ctrl_cv,
preProcess = c("center", "scale"), # Standardise
tuneGrid = expand.grid(alpha = 1, # Lasso
lambda = lambda_vec))
# Print key results
price_lasso
# glmnet
#
# 5000 samples
# 5 predictor
#
# Pre-processing: centered (5), scaled (5)
# Resampling: Cross-Validated (10 fold)
# Summary of sample sizes: 4500, 4500, 4500, 4500, 4500, 4500, ...
# Resampling results across tuning parameters:
#
# lambda RMSE Rsquared MAE
# 1.00e-03 1509 0.858 918
# 1.15e-03 1509 0.858 918
# 1.32e-03 1509 0.858 918
# 1.52e-03 1509 0.858 918
# Plot regularisation parameter versus error
plot(price_lasso)
# Print best regularisation parameter
price_lasso$bestTune$lambda
# Get coefficients from best lambda value
coef(price_lasso$finalModel,
price_lasso$bestTune$lambda)
# 6 x 1 sparse Matrix of class "dgCMatrix"
# 1
# (Intercept) 4001
# carat 5179
# depth -300
# table -213
# x -3222
# y 1755
# Ridge --------------------------
# Vector of lambda values to try
lambda_vec <- 10 ^ seq(-3, 3, length = 100)
price_ridge <- train(form = price ~ carat + depth + table + x + y,
data = data_train,
method = "glmnet",
trControl = ctrl_cv,
preProcess = c("center", "scale"), # Standardise
tuneGrid = expand.grid(alpha = 0, # Ridge penalty
lambda = lambda_vec))
# Print key results
price_ridge
# glmnet
#
# 5000 samples
# 5 predictor
#
# Pre-processing: centered (5), scaled (5)
# Resampling: Cross-Validated (10 fold)
# Summary of sample sizes: 4500, 4500, 4500, 4500, 4500, 4500, ...
# Resampling results across tuning parameters:
#
# lambda RMSE Rsquared MAE
# 1.00e-03 1638 0.835 1137
# 1.15e-03 1638 0.835 1137
# 1.32e-03 1638 0.835 1137
# 1.52e-03 1638 0.835 1137
# 1.75e-03 1638 0.835 1137
# Plot regularisation parameter versus error
plot(price_ridge)
# Print best regularisation parameter
price_ridge$bestTune$lambda
# Get coefficients from best lambda value
coef(price_ridge$finalModel,
price_ridge$bestTune$lambda)
# 6 x 1 sparse Matrix of class "dgCMatrix"
# 1
# (Intercept) 4001
# carat 2059
# depth -131
# table -168
# x 716
# y 797
# Decision Trees --------------------------
# Vector of cp values to try
cp_vec <- seq(0, .1, length = 100)
price_rpart <- train(form = price ~ carat + depth + table + x + y,
data = data_train,
method = "rpart",
trControl = ctrl_cv,
tuneGrid = expand.grid(cp = cp_vec))
# Print key results
price_rpart
# Plot complexity parameter vs. error
plot(price_rpart)
# Print best complexity parameter
price_rpart$bestTune$cp
# [1] 0.00202
# Step 3: Estimate prediction accuracy from folds ----
# Get accuracy statistics across folds
resamples_price <- resamples(list(ridge = price_ridge,
lasso = price_lasso,
glm = price_glm))
# Print summary of accuracies
summary(resamples_price)
# MAE
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
# ridge 1094 1100 1117 1137 1170 1217 0
# lasso 869 887 929 918 944 960 0
# glm 856 882 921 920 949 986 0
#
# RMSE
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
# ridge 1545 1580 1609 1638 1703 1772 0
# lasso 1323 1479 1518 1509 1583 1593 0
# glm 1350 1429 1526 1509 1582 1702 0
#
# Rsquared
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
# ridge 0.798 0.828 0.836 0.835 0.848 0.854 0
# lasso 0.827 0.846 0.858 0.858 0.868 0.902 0
# glm 0.819 0.849 0.863 0.860 0.870 0.888 0
# Step 4: Measure prediction Accuracy -------------------
# GLM ================================
# Predictions
glm_pred <- predict(price_glm,
newdata = data_test)
# Calculate aggregate accuracy
postResample(pred = glm_pred,
obs = criterion_test)
# RMSE Rsquared MAE
# 1654.017 0.832 944.854
# Ridge ================================
# Predictions
ridge_pred <- predict(price_ridge,
newdata = data_test)
# Calculate aggregate accuracy
postResample(pred = ridge_pred,
obs = criterion_test)
# RMSE Rsquared MAE
# 1650.541 0.832 1133.063
# Lasso ================================
# Predictions
lasso_pred <- predict(price_lasso,
newdata = data_test)
# Calculate aggregate accuracy
postResample(pred = lasso_pred,
obs = criterion_test)
# RMSE Rsquared MAE
# 1653.675 0.832 942.870
# Visualise Accuracy -------------------------
# Tidy competition results
accuracy <- tibble(criterion_test = criterion_test,
Regression = glm_pred,
Ridge = ridge_pred,
Lasso = lasso_pred) %>%
gather(model, prediction, -criterion_test) %>%
# Add error measures
mutate(se = prediction - criterion_test,
ae = abs(prediction - criterion_test))
# Calculate summaries
accuracy_agg <- accuracy %>%
group_by(model) %>%
summarise(mae = mean(ae)) # Calculate MAE (mean absolute error)
# Plot A) Scatterplot of truth versus predictions
ggplot(data = accuracy,
aes(x = criterion_test, y = prediction, col = model)) +
geom_point(alpha = .5) +
geom_abline(slope = 1, intercept = 0) +
labs(x = "True Prices",
y = "Predicted Prices",
title = "Predicting Diamond Prices",
subtitle = "Black line indicates perfect performance")
# Plot B) Violin plot of absolute errors
ggplot(data = accuracy,
aes(x = model, y = ae, fill = model)) +
geom_violin() +
geom_jitter(width = .05, alpha = .2) +
labs(title = "Fitting Absolute Errors",
subtitle = "Numbers indicate means",
x = "Model",
y = "Absolute Error (Log Transformed)") +
guides(fill = FALSE) +
annotate(geom = "label",
x = accuracy_agg$model,
y = accuracy_agg$mae,
label = round(accuracy_agg$mae, 2)) +
scale_y_continuous(trans='log')
| File | Rows | Columns |
|---|---|---|
| hitters_train.csv | 50 | 20 |
| hitters_test.csv | 213 | 20 |
| college_train.csv | 500 | 18 |
| college_test.csv | 277 | 18 |
| house_train.csv | 5000 | 21 |
| house_test.csv | 1000 | 21 |
The hitters_train
and hitters_test
data are taken from the Hitters
dataset in the ISLR
package. They are data frames with observations of major league baseball players from the 1986 and 1987 seasons.
The college_train
and college_test
data are taken from the College
dataset in the ISLR
package. They contain statistics for a large number of US Colleges from the 1995 issue of US News and World Report.
The house_train
and house_test
data come from https://www.kaggle.com/harlfoxem/housesalesprediction
hitters_train
and hitters_test
| Name | Description |
|---|---|
Salary |
1987 annual salary on opening day in thousands of dollars. |
AtBat |
Number of times at bat in 1986. |
Hits |
Number of hits in 1986. |
HmRun |
Number of home runs in 1986. |
Runs |
Number of runs in 1986. |
RBI |
Number of runs batted in in 1986. |
Walks |
Number of walks in 1986. |
Years |
Number of years in the major leagues. |
CAtBat |
Number of times at bat during his career. |
CHits |
Number of hits during his career. |
CHmRun |
Number of home runs during his career. |
CRuns |
Number of runs during his career. |
CRBI |
Number of runs batted in during his career. |
CWalks |
Number of walks during his career. |
League |
A factor with levels A and N indicating player’s league at the end of 1986. |
Division |
A factor with levels E and W indicating player’s division at the end of 1986. |
PutOuts |
Number of put outs in 1986. |
Assists |
Number of assists in 1986. |
Errors |
Number of errors in 1986. |
NewLeague |
A factor with levels A and N indicating player’s league at the beginning of 1987. |
college_train
and college_test
| Name | Description |
|---|---|
Private |
A factor with levels No and Yes indicating private or public university. |
Apps |
Number of applications received. |
Accept |
Number of applications accepted. |
Enroll |
Number of new students enrolled. |
Top10perc |
Pct. new students from top 10% of H.S. class. |
Top25perc |
Pct. new students from top 25% of H.S. class. |
F.Undergrad |
Number of fulltime undergraduates. |
P.Undergrad |
Number of parttime undergraduates. |
Outstate |
Out-of-state tuition. |
Room.Board |
Room and board costs. |
Books |
Estimated book costs. |
Personal |
Estimated personal spending. |
PhD |
Pct. of faculty with Ph.D.’s. |
Terminal |
Pct. of faculty with terminal degree. |
S.F.Ratio |
Student/faculty ratio. |
perc.alumni |
Pct. alumni who donate. |
Expend |
Instructional expenditure per student. |
Grad.Rate |
Graduation rate. |
house_train
and house_test
| Name | Description |
|---|---|
price |
Price of the house in $. |
bedrooms |
Number of bedrooms. |
bathrooms |
Number of bathrooms. |
sqft_living |
Square footage of the home. |
sqft_lot |
Square footage of the lot. |
floors |
Total floors (levels) in house. |
waterfront |
House which has a view to a waterfront. |
view |
Has been viewed. |
condition |
How good the condition is (Overall). |
grade |
Overall grade given to the housing unit, based on King County grading system. |
sqft_above |
Square footage of house apart from basement. |
sqft_basement |
Square footage of the basement. |
yr_built |
Built Year. |
yr_renovated |
Year when house was renovated. |
zipcode |
Zip code. |
lat |
Latitude coordinate. |
long |
Longitude coordinate. |
sqft_living15 |
Living room area in 2015 (implies some renovations). This might or might not have affected the lotsize area. |
sqft_lot15 |
lot-size area in 2015 (implies some renovations). |
| Package | Installation |
|---|---|
tidyverse |
install.packages("tidyverse") |
caret |
install.packages("caret") |
partykit |
install.packages("partykit") |
party |
install.packages("party") |
| Function | Package | Description |
|---|---|---|
trainControl() |
caret |
Define modelling control parameters |
train() |
caret |
Train a model |
predict(object, newdata) |
stats |
Predict the criterion values of newdata based on object |
postResample() |
caret |
Calculate aggregate model performance in regression tasks |
confusionMatrix() |
caret |
Calculate aggregate model performance in classification tasks |


Home
About Us
Members
Documents
Meeting Notes
Tasks
Issue Committees
Food
GPA
Uniform
Bathroom
Contact
Copyright 2015-2016 ISB Student Council. Made by Daiki and the Software Development Club.


|
src/app/app.component.ts
|
component
|
AppComponent
|
66 %
(2/3)
|
|
src/app/auth/auth.component.ts
|
component
|
AuthComponent
|
50 %
(2/4)
|
|
src/app/auth/auth.constants.ts
|
variable
|
STORAGE_TOKEN_KEY
|
100 %
(1/1)
|
|
src/app/auth/login/login.component.ts
|
component
|
LoginComponent
|
81 %
(9/11)
|
|
src/app/auth/login/login.component.ts
|
class
|
Error
|
100 %
(2/2)
|
|
src/app/auth/services/auth.service.ts
|
injectable
|
AuthService
|
88 %
(8/9)
|
|
src/app/auth/services/auth.service.ts
|
variable
|
httpOptions
|
100 %
(1/1)
|
|
src/app/core/services/http-result.ts
|
class
|
HttpResult
|
100 %
(8/8)
|
|
src/app/core/services/spinner.service.ts
|
injectable
|
SpinnerService
|
66 %
(4/6)
|
|
src/app/core/services/storage.service.ts
|
injectable
|
StorageService
|
80 %
(4/5)
|
|
src/app/dashboard/candidates/candidate-add-edit-form/candidate-add-edit-form.component.ts
|
component
|
CandidateAddEditFormComponent
|
94 %
(17/18)
|
|
src/app/dashboard/candidates/candidate-screen/candidate-screen.component.ts
|
component
|
CandidateScreenComponent
|
96 %
(25/26)
|
|
src/app/dashboard/candidates/candidate.ts
|
class
|
Candidate
|
28 %
(2/7)
|
|
src/app/dashboard/candidates/candidates-list/candidates-list.component.ts
|
component
|
CandidatesListComponent
|
90 %
(9/10)
|
|
src/app/dashboard/candidates/candidates.component.ts
|
component
|
CandidatesComponent
|
33 %
(1/3)
|
|
src/app/dashboard/candidates/pipes/filter.pipe.ts
|
pipe
|
FilterPipe
|
100 %
(1/1)
|
|
src/app/dashboard/candidates/services/answer.service.ts
|
injectable
|
AnswerService
|
85 %
(6/7)
|
|
src/app/dashboard/candidates/services/candidate.service.ts
|
injectable
|
CandidateService
|
88 %
(8/9)
|
|
src/app/dashboard/categories/categories.component.ts
|
component
|
CategoriesComponent
|
91 %
(11/12)
|
|
src/app/dashboard/categories/category.ts
|
class
|
Category
|
75 %
(3/4)
|
|
src/app/dashboard/categories/services/category.service.ts
|
injectable
|
CategoryService
|
87 %
(7/8)
|
|
src/app/dashboard/dashboard.component.ts
|
component
|
DashboardComponent
|
50 %
(2/4)
|
|
src/app/dashboard/home/home-candidates/home-candidates.component.ts
|
component
|
HomeCandidatesComponent
|
80 %
(4/5)
|
|
src/app/dashboard/home/home-categories/home-categories.component.ts
|
component
|
HomeCategoriesComponent
|
60 %
(3/5)
|
|
src/app/dashboard/home/home-questions/home-questions.component.ts
|
component
|
HomeQuestionsComponent
|
80 %
(4/5)
|
|
src/app/dashboard/home/home-screens/home-screens.component.ts
|
component
|
HomeScreensComponent
|
80 %
(4/5)
|
|
src/app/dashboard/home/home.component.ts
|
component
|
HomeComponent
|
33 %
(1/3)
|
|
src/app/dashboard/misc/error/error.component.ts
|
component
|
ErrorComponent
|
60 %
(3/5)
|
|
src/app/dashboard/misc/error/error.ts
|
class
|
Error
|
100 %
(2/2)
|
|
src/app/dashboard/misc/spinner/spinner.component.ts
|
component
|
SpinnerComponent
|
50 %
(2/4)
|
|
src/app/dashboard/questions/pipes/filter.pipe.ts
|
pipe
|
FilterPipe
|
100 %
(1/1)
|
|
src/app/dashboard/questions/question-add-edit-form/question-add-edit-form.component.ts
|
component
|
QuestionAddEditFormComponent
|
94 %
(18/19)
|
|
src/app/dashboard/questions/question.ts
|
class
|
Question
|
75 %
(3/4)
|
|
src/app/dashboard/questions/questions-list/questions-list.component.ts
|
component
|
QuestionsListComponent
|
90 %
(9/10)
|
|
src/app/dashboard/questions/questions.component.ts
|
component
|
QuestionsComponent
|
0 %
(0/3)
|
|
src/app/dashboard/questions/services/question.service.ts
|
injectable
|
QuestionService
|
77 %
(7/9)
|
|
src/app/dashboard/screens/pipes/filter.pipe.ts
|
pipe
|
FilterPipe
|
100 %
(1/1)
|
|
src/app/dashboard/screens/screen-add-edit-form/screen-add-edit-form.component.ts
|
component
|
ScreenAddEditFormComponent
|
95 %
(19/20)
|
|
src/app/dashboard/screens/screen.ts
|
class
|
Screen
|
75 %
(3/4)
|
|
src/app/dashboard/screens/screens-list/screens-list.component.ts
|
component
|
ScreensListComponent
|
90 %
(9/10)
|
|
src/app/dashboard/screens/screens.component.ts
|
component
|
ScreensComponent
|
33 %
(1/3)
|
|
src/app/dashboard/screens/services/screen.service.ts
|
injectable
|
ScreenService
|
80 %
(8/10)
|
|
src/app/in-memory-data.service.ts
|
class
|
InMemoryDataService
|
0 %
(0/9)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutCardBodyComponent
|
50 %
(1/2)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutCardComponent
|
50 %
(1/2)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutCardFooterComponent
|
50 %
(1/2)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutCardHeaderComponent
|
50 %
(1/2)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutComponent
|
33 %
(1/3)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutContentComponent
|
50 %
(1/2)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutFooterComponent
|
50 %
(1/2)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutHeaderComponent
|
64 %
(9/14)
|
|
src/app/layout/layout.component.ts
|
component
|
LayoutSidebarComponent
|
66 %
(2/3)
|
|
src/app/layout/layout.module.ts
|
variable
|
LAYOUT_COMPONENTS
|
0 %
(0/1)
|
|
src/app/layout/menu-item.ts
|
class
|
MenuItem
|
100 %
(6/6)
|
|
src/environments/environment.prod.ts
|
variable
|
environment
|
0 %
(0/1)
|
|
src/environments/environment.ts
|
variable
|
environment
|
0 %
(0/1)
|
|
src/test.ts
|
variable
|
context
|
0 %
(0/1)
|
|
src/test.ts
|
variable
|
require
|
0 %
(0/1)
|
|
src/testing/activated-route-stub.ts
|
class
|
ActivatedRouteStub
|
60 %
(3/5)
|
|
src/testing/spinner-service-stub.ts
|
variable
|
spinnerServiceStub
|
0 %
(0/1)
|


{{recipe?.description}}
{{recipe?.ingredients}}
{{recipe?.steps}}
{{comment.textComment}}
No Comments yet
{{comment.textComment}}


Backup is split across multiple files?
If a backup has been made to multiple files using the Split across multiple
files? option on the backup page, you must select this option when restoring.
The filename to restore from will then have 001, 002 and so
on appended to it to get the actual names of the backup files.


Log In
|
Home
About Us
The Safe Space Team formed in February, 2019. The following team members have been working around the clock to make sure that this whole thing is possible, so we would like to tell you a little bit about them.


UK’s text relay app service relaunches
Next Generation Text service is now known as Relay UK with a number of improvements to help people with hearing or speech impairments.
An app that helps people across the UK with hearing or speech impairments make phone calls has been relaunched with a new name and a number of improvements.
The Next Generation Text service provided by BT has been rebranded to Relay UK, offering a simpler set-up process and the ability to save conversations, allowing users to look back at their conversations.
Since launching in 2014, the Ofcom-regulated platform translates text to speech and vice versa with the help of specially-trained assistants.
The updated app also allows frequently used phrases to be favourited, meaning regular questions like a person’s home address can be easily added to the conversation.
Despite technology improvements, 70% of deaf or hard of hearing adults say they are forced to ask a friend or family member for help making basic calls.
The BT and UK Council on Deafness survey of 129 people with hearing problems also revealed that almost 70% had to physically go to the stores because they are unable to complete a phone call with a business.
“There are currently 12 million people in the UK who experience hearing loss and using the telephone remains a big barrier for them to communicate with friends and family, at work, with health care providers, banks and other services,” said Jesal Vishnuram, technology manager at Action on Hearing Loss.
“Relay UK provides a vital text relay service to help people communicate by phone with the use of a text relay assistant in real time.
“This service can be pivotal in keeping people with hearing loss and deafness in employment, access healthcare including emergency services and other services as well as help keep them in touch with friends and family.”


Activity dashboard for Insurgency Sandstorm servers.
Usage:
/r/YOUR_INSSA_SERVERIPHERE
OR
/r/YOUR_INSSA_SERVERIPHERE:PORT
You can create a widget like this:
/w/YOUR_INSSA_SERVERIPHERE
iframe src="https://ins.vinite.eu/w/<IP_ADDRESS>" width=240px height=257px
You can create a banner like this:
/b/YOUR_INSSA_SERVERIPHERE
iframe src="https://ins.vinite.eu/b/<IP_ADDRESS>" width=544px height=93px
Host your own monitoring and RCON support app by using this docker container:
Insdash
Made with
by Spec.
Dutch Recon
Running version: {{ version }}


For full functionality of this site it is necessary to enable JavaScript. Here are the
instructions how to enable JavaScript in your web browser
.
the great
rgb(175, 203, 2)
guessing game
new colors
help
easy
hard
score:
round:
/ 5


Appservice
Interfaces to handle app services and app instances.
Basically each App has one class which is derived from the base class AppService. This base class establishes a unix domain socket connection to the manager app, which controlls the creation, starting and stopping of instances.
Each instance itself is derived from AppInstance and gets its own AppInstanceArgs.
File information
Logging
To enable logging for apps, the flag LOG_APP must be set in the managers diagnostic settings.
Classes
AppService
The service class of the App must be derived from the class AppService and implement the neccessary virtual functions.
class AppService : public UAppServiceSocket, public IInstanceLog {
public:
AppService(class IIoMux * const iomux, class ISocketProvider * const localSocketProvider, AppServiceArgs * serviceArgs);
virtual class AppInstance * CreateInstance(AppInstanceArgs * args) = 0;
virtual void AppServiceApps(istd::list * appList) = 0;
virtual void AppInstancePlugins(istd::list * pluginList) {};
void AppStart(AppInstanceArgs * args) override;
void AppStopped(class AppInstance * instance);
const char * GetAppServiceId() const;
const char * GetAppPlatformDNSName() const;
void SetAllInstancesLogFlags(ulong64 logFlags);
};
Public functions
AppService
-
Constructor
Parameters
| class IIoMux * const iomux | An IIoMux pointer to the IIoMux class. |
| ISocketProvider * const localSocketProvider | An ISocketProvider pointer to a local socket provider. |
| AppServiceArgs * serviceArgs | An AppServiceArgs pointer to the service arguments struct. |
CreateInstance
-
You must override this function inside your class which implements the AppService class.
This function creates an object of the instance class of the App which must be derived from the class AppInstance.
If this object is stopped and has finished stopping, it must call AppStopped, see below.
Parameters
| AppInstanceArgs * args | An AppInstanceArgs pointer to the instance arguments. |
Return value
The created AppInstance object.
AppServiceApps
-
You must override this function inside your class which implements the AppService class.
Push your provided apps to the appList. Each app has to be an instance of class AppServiceApp.
An app of an AppService might be configured inside the PBX App object.
Parameters
AppInstancePlugins
-
You can override this function inside your class which implements the AppService class if your app provides app instance plugins (PBX manager plugins).
Push your provided plugins to the pluginList. Each app has to be an instance of class AppInstancePlugin.
See publish manager plugins for further reference.
Parameters
AppStart
-
You can start an own app instance, e.g. inside your app-main.cpp, if you want to start an instance outside of the manager control.
Parameters
| AppInstanceArgs * args | An AppInstanceArgs pointer to the instance arguments. |
AppStopped
-
Call this function when your app stopped.
Parameters
| AppInstance * instance | An AppInstance pointer to the instance object. |
GetAppServiceId
-
Return value
The service id of the app service.
GetAppPlatformDNSName
-
Return value
The app platform DNS name which can be configured inside the manager settings.
SetAllInstancesLogFlags
-
Call this function if you want to set the logFlags of all instances to a certain value.
Parameters
| ulong64 logFlags | The logFlags to set. |
AppInstance
The instance class of an App must be derived from AppInstance and implement the neccessary virtual functions.
class AppInstance : public IInstanceLog {
public:
AppInstance(class AppService * appService, AppInstanceArgs * args)
const char * GetAppServiceId() const;
const char * GetAppName() const;
const char * GetAppDomain() const;
const char * GetKey() const;
void SetLogFlags(ulong64 logFlags);
static char * GenerateKey(const char * appName, const char * appDomain);
void LogV(const char * format, va_list ap);
void Log(const char * format, ...);
void HexDump(const void * buffer, size_t size);
void SetAlarm(word code, ServiceAlarmSeverity severity, char * text, char * details);
void ClearAlarm(word code, ServiceAlarmSeverity severity, char * text, char * details);
void SendEvent(word code, ServiceAlarmSeverity severity, char * text, char * details);
virtual void Stop() = 0;
virtual void ServerCertificateUpdate(const byte * cert, size_t certLen) {};
virtual void SetAppDomain(const char * domain, const char * pwd) {};
};
Public functions
AppInstance
-
Constructor
Parameters
| AppService * service | An AppService pointer to the app service class. |
| AppInstanceArgs * instanceArgs | An AppInstanceArgs pointer to the instance arguments struct. |
GetAppServiceId
-
Return value
The app service id.
GetAppName
-
Return value
The app name.
GetAppDomain
-
Return value
The app domain.
GetKey
-
Return value
The unique key string which identifies the app instance: "appname@appdomain".
SetLogFlags
-
Call this function to set the logFlags of the instance.
Parameters
| ulong64 logFlags | The logFlags to set. |
GenerateKey (static function)
-
Generates the unique string which identifies an intance.
Parameters
| const char * appName | The app name. |
| const char * appDomain | The app domain. |
Return value
The unique key string which identifies the app instance: "appname@appdomain". Must be freed by the caller!
LogV
-
Writes the log string to the debug output (e.g. file or debugging output).
Parameters
| const char * format | The format string. |
| va_list ap | A variable argument list with all arguments which are used inside the format string. |
Log
-
Writes the log string to the debug output (e.g. file or debugging output).
Parameters
| const char * format | The format string. |
| ... | Further arguments used inside format string. |
HexDump
-
Writes a hexdump of the buffer to the debug output (e.g. file or debugging output).
Parameters
| const void * buffer | The buffer. |
| size_t size | The size to dump. |
SetAlarm
-
Sets an alarm, which is sent to the manager (which again sends it to an alarm and events server). An alarm is active until it is cleared.
Parameters
| word code | A code to identify an alarm. |
| ServiceAlarmSeverity severity | The severity. |
| char * text | The text which identifies the alarm. |
| char * details | Further details for the alarm. |
ClearAlarm
-
Clears an alarm.
Parameters
See SetAlarm for parameter reference.
SendEvent
-
Sends an event.
Parameters
See SetAlarm for parameter reference.
Stop
-
You must override this function. It is called if the instance or service is stopped by the manager.
You must call AppService::AppStopped asynchronously if everything has been stopped.
ServerCertificateUpdate
-
You can override this function if you need to be notified about the webserver certificate. You can then pass the certificate to an ISocketContext.
Parameters
| const byte * cert | The certificate byte buffer. |
| size_t certLen | The length of the byte buffer. |
SetAppDomain
-
Shouldn't be used inside app code.
AppServiceApp
The class AppServiceApp is used to describe an app which is provided by an AppService.
Each app has a (for the service) unique name, which will be later used inside the URL
which points to the app of the AppService.
class AppServiceApp {
public:
AppServiceApp(const char * name, bool websocketOnly = false);
const char * GetName();
bool IsWebsocketOnly();
};
Public functions
AppServiceApp
-
Constructor
Parameters
| const char * name | The name describes the last URL part of the app. |
| bool websocketOnly | An app which can be just used with a websocket connection. |
GetName
-
Return value
The name.
IsWebsocketOnly
-
Return value
The websocketOnly value.
AppInstancePlugin
The class AppInstancePlugin is used to describe an app instance plugin.
class AppInstancePlugin {
public:
AppInstancePlugin(const char * plugin, const char * icon, const char * langFile, bool wildcard = false, const char * api = NULL);
bool wildcard;
const char * GetIcon();
const char * GetApi();
const char * GetPlugin();
const char * GetLangFile();
};
Public functions
See publish manager plugins for further reference.
AppServiceSocket
This class is just used internally inside the manager and webserver.
UAppServiceSocket
This class is just used internally inside the manager and webserver.
Data types
ServiceAlarmSeverity
typedef enum {
ALARM_SEVERITY_INDETERMINATE,
ALARM_SEVERITY_MAJOR,
ALARM_SEVERITY_CRITICAL
} ServiceAlarmSeverity;
Overview
The enum ServiceAlarmSeverity
is used to determine the severity of an alarm.
ServiceAlarmType
typedef enum {
ALARM_TYPE_SET,
ALARM_TYPE_CLEAR,
ALARM_TYPE_ERROR
} ServiceAlarmType;
Overview
The enum ServiceAlarmType
is used to determine the alarm type.
AppServiceArgs
struct AppServiceArgs {
void Parse(int argc, char ** argv, bool keepDefaults = true);
const char * serviceID;
const char * manager;
const char * appPlatformDNSName;
ulong64 logFlags;
bool segfaulted;
bool disableHexdumps;
off_t logFileSize;
};
Overview
The struct AppServiceArgs
holds the relevant app service arguments.
App service arguments are defined inside the manager.
The AppService class gets them through command line arguments which are usually parsed inside the app-main.cpp.
Parameters
| const char * serviceID | |
| const char * manager | The unix domain socket file of the manager. |
| const char * appPlatformDNSName | |
| ulong64 logFlags | |
| bool segfaulted | Indicates if the service previously segfaulted. |
| bool disableHexdumps | This is set to true if hexdumps are disabled. |
| off_t logFileSize | The maximum log file size. |
AppInstanceArgs
struct AppInstanceArgs {
AppInstanceArgs();
void Parse(int argc, char ** argv, bool keepDefaults = true);
const char * appName;
const char * appDomain;
const char * appPassword;
const char * webserver;
const char * webserverPath;
const char * dbHost;
const char * dbName;
const char * dbUser;
const char * dbPassword;
const char * workingPath;
ulong64 logFlags;
};
Overview
The struct AppInstanceArgs
holds the relevant app instance arguments.
App instance arguments are defined inside the manager.
The AppService class gets them through the socket connection and uses them to create a new AppInstance class.
Parameters
| const char * appName | |
| const char * appDomain | |
| const char * appPassword | |
| const char * webserver | The unix domain socket file which is used to connect to the webserver. |
| const char * webserverPath | The relative path which is used to access the application via HTTP. |
| const char * dbHost | Usually an empty string, as the connection is done with unix domain sockets to the local database server. |
| const char * dbName | |
| const char * dbUser | |
| const char * dbPassword | |
| const char * workingPath | |
| ulong64 logFlags | |
Code Example
class TestInstance : public AppInstance {
ISocketContext * socketContext;
ISocket * socket;
void Stop() override;
void ServerCertificateUpdate(const byte * cert, size_t certLen) override;
void TryStop();
public:
TestInstance(class IIoMux * const iomux, class TestService * testService, class ISocketProvider * localSocketProvider, class IDatabaseProvider * databaseProvider, class IWebserverPluginProvider * webserverPluginProvider, AppInstanceArgs * instanceArgs);
~TestInstance();
};
class TestService : public AppService {
class IIoMux * const iomux;
class ISocketProvider * localSocketProvider;
class ISocketProvider * tlsSocketProvider;
class IDatabaseProvider * databaseProvider;
class IWebserverPluginProvider * webserverPluginProvider;
public:
TestService(class IIoMux * const iomux, class ISocketProvider * localSocketProvider, class ISocketProvider * tlsSocketProvider, class IDatabaseProvider * databaseProvider, class IWebserverPluginProvider * webserverPluginProvider, AppServiceArgs * serviceArgs);
~TestService();
class AppInstance * CreateInstance(AppInstanceArgs * instanceArgs) override;
void AppServiceApps(class json_io & json, word base) override;
};
TestService::TestService(class IIoMux * const iomux, class ISocketProvider * localSocketProvider, class ISocketProvider * tlsSocketProvider, class IDatabaseProvider * databaseProvider, class IWebserverPluginProvider * webserverPluginProvider, AppServiceArgs * serviceArgs)
: AppService(iomux, localSocketProvider, serviceArgs),
iomux(iomux)
{
this->databaseProvider = databaseProvider;
this->localSocketProvider = localSocketProvider;
this->tlsSocketProvider = tlsSocketProvider;
this->webserverPluginProvider = webserverPluginProvider;
}
TestService::~TestService()
{
}
class AppInstance * TestService::CreateInstance(AppInstanceArgs * instanceArgs)
{
return new class TestInstance(iomux, this, localSocketProvider, tlsSocketProvider, databaseProvider, webserverPluginProvider, instanceArgs);
}
void TestService::AppServiceApps(istd::list<AppServiceApp> * appList)
{
appList->push_back(new AppServiceApp("devices"));
appList->push_back(new AppServiceApp("sysclients", true));
}
TestInstance::TestInstance(class IIoMux * const iomux, class TestService * testService, class ISocketProvider * localSocketProvider, class ISocketProvider * tlsSocketProvider, class IDatabaseProvider * databaseProvider, class IWebserverPluginProvider * webserverPluginProvider, AppInstanceArgs * instanceArgs) :
AppInstance(testService, instanceArgs)
{
this->iomux = iomux;
this->databaseProvider = databaseProvider;
this->webserverPlugin = webserverPluginProvider->CreateWebserverPlugin(iomux, localSocketProvider, this);
this->socketContext = tlsSocketProvider->CreateSocketContext(this);
this->socket = tlsSocketProvider->CreateSocket(iomux, NULL, this, false, socketContext);
webserverPlugin->RegisterForPath(instanceArgs->webserver, instanceArgs->webserverPath);
this->Log("TestInstance created");
}
TestInstance::~TestInstance()
{
this->Log("TestInstance deleted");
}
void TestInstance::ServerCertificateUpdate(const byte * cert, size_t certLen)
{
this->socketContext->SetServerCertificate(cert, certLen, NULL);
}
void TestInstance::Stop()
{
TryStop();
}
void TestInstance::TryStop()
{
// if everything has been closed, call AppStopped
appService->AppStopped(this);
}


The plan is to launch 4 identical EC2 server instances. One server will be the Master node and the other 3 the worker nodes. In one of the worker nodes, we will install RStudio server.
What makes a server the Master node is only the fact that it is running the master service, while the other machines are running the slave service and are pointed to that first master. This simple setup, allows us to install the same Spark components on all 4 servers and then just add RStudio to one of them.
The topology will look something like this:
Here are the details of the EC2 instance, just deploy one at this point:
Perform the steps in this section on all of the servers that will be part of the cluster.
We will add the Java 8 repository, install it and set it as default
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default
sudo apt-get update
Download and unpack a pre-compiled version of Spark. Here’s is the link to the official Spark download page
wget http://d3kbcqa49mib13.cloudfront.net/spark-2.1.0-bin-hadoop2.7.tgz
tar -xvzf spark-2.1.0-bin-hadoop2.7.tgz
cd spark-2.1.0-bin-hadoop2.7
We will create an image of the server. In Amazon, these are called AMIs, for information please see the User Guide.
Launch 3 instances of the AMI
Select one of the nodes to execute this section. Please check the RStudio download page for the latest version
In order to get the latest R core, we will need to update the source list in Ubuntu.
sudo sh -c 'echo "deb http://cran.rstudio.com/bin/linux/ubuntu xenial/" >> /etc/apt/sources.list'
gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
gpg -a --export E084DAB9 | sudo apt-key add -
sudo apt-get update
Now we can install R
sudo apt-get install r-base
sudo apt-get install gdebi-core
We will download and install 1.044 of RStudio Server. To find the latest version, please visit the RStudio website. In order to get the enhanced integration with Spark, RStudio version 1.044 or later will be needed.
wget https://download2.rstudio.org/rstudio-server-1.0.153-amd64.deb
sudo gdebi rstudio-server-1.0.153-amd64.deb
Run the following commands
sudo apt-get -y install libcurl4-gnutls-dev
sudo apt-get -y install libssl-dev
sudo apt-get -y install libxml2-dev
Select one of the servers to become your Master node
Run the command that starts the master service
sudo spark-2.1.0-bin-hadoop2.7/sbin/start-master.sh
Close the terminal connection (optional)
Start the slave service. Important: Use dots not dashes as separators for the Spark Master node’s address
sudo spark-2.1.0-bin-hadoop2.7/sbin/start-slave.sh spark://[Master node's IP address]:7077
sudo spark-2.1.0-bin-hadoop2.7/sbin/start-slave.sh spark://ip-172-30-1-94.us-west-2.compute.internal:7077Close the terminal connection (optional)
Navigate to the Spark Master’s UI, typically on port 8080
Note the Spark Master URL
Logon to RStudio
Run the following code
library(sparklyr)
conf <- spark_config()
conf$spark.executor.memory <- "2GB"
conf$spark.memory.fraction <- 0.9
sc <- spark_connect(master="[Spark Master URL]",
version = "2.1.0",
config = conf,
spark_home = "/home/ubuntu/spark-2.1.0-bin-hadoop2.7/")


This is just an example that shows a couple of features that the wide carousel provides you
It allows you to show one item per page with features like, resposiveness, animations, touch support and pagination.
Everything to fulfill your expectations with an open business friendly license.


Minigames
P.S. It's might horrible I made it just for fun))
Memory
Minesweeper
Game Of Life
Snake
Xonix
Hangman


--- layout: page title: eBooks for Bass Fishing excerpt: Promoted eBooks for the bass fishing industry permalink: /ebooks/ author: false published: false seo: type: WebPage og: type: website ---
I recommend the Pro-Bass Fishing Training Manual if you are serious about considering a professional fishing career. The author, Randy Meyers, has over 50 years of fishing experience and compiled all those years of knowledge into an easy to read, 14-chapter eBook.
He covers topics from locating bass on different types of water, to how you adapt to changing conditions using different techniques, to how you can establish patterns to land the bass in any various situations.
Click the link below and scroll to the bottom of the page to get your copy of the eBook, along with 6 bonus eBooks that will give you the skills to become even closer to making a career as a professional bass angler a reality.
Read More


Toggle navigation
About
Projects
Gallery
Contact
Your browser does not support the audio element.
Click to play music!


Want to get a neopets,well you can get a baloghpet too. Go down the page to get one for free!You will get 200 baloghpoints to start out with.You can only have 5 baloghpets at a time.There is a odopion page on exsplor.
Get A Baloghpet For Free
If you want to get a better looking a bloghpet you will be able to get it on Manday 6 2006.


| Package | Description |
|---|---|
| javaslang.test |
A property check framework built around Property which integrates well with unit test frameworks like junit.
|
| Modifier and Type | Method and Description |
|---|---|
default <U,GEN extends HigherKinded1<U,Gen<?>>> |
Gen.flatMap(Function1<? super T,GEN> mapper)
Maps generated Ts to Us.
|
| Modifier and Type | Method and Description |
|---|---|
Gen<T> |
Arbitrary.apply(int size)
Returns a generator for objects of type T.
|
static Gen<java.lang.Character> |
Gen.choose(char min,
char max)
Chooses a char between min and max, bounds inclusive and chars distributed according to the underlying random
number generator.
|
static Gen<java.lang.Double> |
Gen.choose(double min,
double max)
Chooses a double between min and max, bounds inclusive and numbers distributed according to the distribution
of the underlying random number generator.
|
static Gen<java.lang.Integer> |
Gen.choose(int min,
int max)
Chooses an int between min and max, bounds inclusive and numbers distributed according to the distribution of
the underlying random number generator.
|
static Gen<java.lang.Long> |
Gen.choose(long min,
long max)
Chooses a long between min and max, bounds inclusive and numbers distributed according to the distribution of
the underlying random number generator.
|
static <T> Gen<T> |
Gen.fail()
A failing generator which throws a RuntimeException("failed").
|
static <T> Gen<T> |
Gen.fail(java.lang.String message)
A failing generator which throws a RuntimeException.
|
default Gen<T> |
Gen.filter(java.util.function.Predicate<T> predicate)
Returns a generator based on this generator which produces values that fulfill the given predicate.
|
default <U,GEN extends HigherKinded1<U,Gen<?>>> |
Gen.flatMap(Function1<? super T,GEN> mapper)
Maps generated Ts to Us.
|
static <T> Gen<T> |
Gen.frequency(java.lang.Iterable<Tuple2<java.lang.Integer,Gen<T>>> generators)
Chooses one of the given generators according to their frequency.
|
static <T> Gen<T> |
Gen.frequency(Tuple2<java.lang.Integer,Gen<T>>... generators)
Chooses one of the given generators according to their frequency.
|
default <U> Gen<U> |
Gen.map(Function1<? super T,? extends U> mapper)
Maps generated Ts to Us.
|
static <T> Gen<T> |
Gen.of(T t)
A generator which constantly returns t.
|
static <T> Gen<T> |
Gen.oneOf(Gen<T>... generators)
Randomly chooses one of the given generators.
|
static <T> Gen<T> |
Gen.oneOf(java.lang.Iterable<Gen<T>> generators)
Randomly chooses one of the given generators.
|
| Modifier and Type | Method and Description |
|---|---|
static <T> Gen<T> |
Gen.oneOf(Gen<T>... generators)
Randomly chooses one of the given generators.
|
static Arbitrary<java.lang.String> |
Arbitrary.string(Gen<java.lang.Character> gen)
Generates arbitrary strings based on a given alphabet represented by gen.
|
| Modifier and Type | Method and Description |
|---|---|
static <T> Gen<T> |
Gen.frequency(java.lang.Iterable<Tuple2<java.lang.Integer,Gen<T>>> generators)
Chooses one of the given generators according to their frequency.
|
static <T> Gen<T> |
Gen.oneOf(java.lang.Iterable<Gen<T>> generators)
Randomly chooses one of the given generators.
|
Copyright © 2015. All Rights Reserved.


Index.html will be reflected at `http://localhost:8080/` (the root directory)
Change the html file at `main/resources/static/index.html`


Superfeed
Add Content
Update
Import Feeds
Add a feed
Add a feed by pasting the address here.
Cancel
OK
Import OPML
Import an OPML feed list from another program.
Cancel
OK


Relevant coordinates
Posted: 2016-06-02 , Modified: 2016-06-02
Tags: linear algebra++
Posted: 2016-06-02 , Modified: 2016-06-02
Tags: linear algebra++
General problem: Often, given high dimensional data in \(\R^n\), only a subset \(S\sub [n]\) of coordinates are “relevant”. Identify them.
Here are possible formalizations of the problem.
The goal is to find \(S\). (Then we can recover the centers by standard clustering algorithms.)
Note: There may be a cheap way to do this by identifying which coordinates are \(\sim N(0,1)\). We want something more generalizable. Ex. assume \(x_j\sim N(y_j, \tau_j^2)\). Even better, assume that the \(x_j\) are independent but their distribution is arbitrary.
Let \(A\) be a matrix such that taking the rows with indices in \(S\) (\(|S|=c_1m\) as above), and suppose that \(A\) is \(\ep\)-close1 in \(L^2\) to a rank \(k\) matrix, and the rest of the entries are generated as \(N(0,1)\). Identify \(S\).
A probabilistic version: \(A_{S,i}\) is \(N(0, \Si)\) where \(\Si\) is close to rank \(k\).
Look at the \(L^1\) norm and variance (\(L^2\) norm) of each row.
For the non-noise rows,
\[\begin{align}
A=\EE_{j=1}^n |A_{ij}| & > \sfc{2}{\pi}\sum|\si_{k_j}|\\
B=\EE_{j=1}^n |A_{ij}|^2 - (\EE_{j=1}^n |A_{ij}|)^2 &=\sum_i \si_i^2,
\end{align}\]
and \(\fc{\sqrt B}{A}>\sfc{2}{\pi}\).But this is heavily dependent on the exact distribution of noise! We want something more generalizable.
Sometimes we can recover even if the noise seems to be larger than the signal, because the noise is uncorrelated. Ex. a random \(n\times n\) matrix with \(N(0,1)\) entries has eigenvalues on the order of \(O(\sqrt n)\).2
Reference: Synchronization problem, Amit Singer.
Problem: Let \(x\in \{\pm 1\}^n\). Given \(xx^T + E\) where each entry of \(E\) is \(N(0,\si^2)\), recover \(x\) (whp). What level of noise \(\si\) can we tolerate?
(We want to recover all of \(x\), rather than just something correlated with \(x\).)
The largest eigenvector of \(A=xx^T\) is \(v_1(A) = x\). By Wedin’s Theorem, \[ \sin\angle(v_1,v_1') \le \fc{\ve{E}_2}{|\la_1(A) - \la_2(A)|} = \fc{\ve{E}_2}{n} \stackrel?{\ll} \rc{\sqrt n}, \] since the closest vector \(w\) to \(v_1\) is at an angle \(\te\) away where \(\cos \te = \fc{n-2}n\), \(\sin \te \sim \rc{\sqrt n}\). So we need \(\ve{E}_2=\wt o(\sqrt n)\)3.
To get \(\ve{E}_2=\wt o(\sqrt n)\) we need \(\si=\wt o(1)\). Using this method we can only tolerate a level of noise \(\ll 1\).
We want \(\min_{x\in \{\pm 1\}^n}\ve{xx^T-A}_F^2\). (Minimize the sum of squares because this is \(\propto\) the log-likelihood.)
Relax this: \[ \amin_{x\in \{\pm 1\}^n}\ve{xx^T-A}_F^2 =\amax_{x\in \{\pm 1\}^n}x_iA_{ij}x_j =\amax_{x\in \{\pm 1\}^n} \Tr(xx^T) =\amax_{B\succeq 0 , B_{ii}=1} \Tr(AB) \]
WLOG the optimal solution is \(\one\)4. By SDP duality, \(\one\one^T\) is the unique best solution if there exists \(Q\succeq 0\), \(\Tr(\one\one^T(Q-W))=0\) where \(W=A+E\) is observed.
Let’s consider when \(E\) is symmetric.5 We choose \(Q=\diag((\sum_{j}A_{ij})_i)\). Then \(M:=Q-W = \mattn{A_{12}+\cdots +A_{1n}}{-A_{12}}{\cdots}{-A_{21}}{A_{21}+A_{23}+\cdots}{\cdots}{\vdots}{\vdots}{\ddots}\).
We can think of this as a sum of random matrices \(\matt{1+\ep}{-(1+\ep)}{-(1+\ep)}{1+\ep}\) in the submatrix at indices \(\{i,j\}\times \{i,j\}\). The average is \(\mattn{(n-1)}{-1}{\cdots}{-1}{n-1}{\cdots}{\ldots}{\ldots}{\ddots}\) with eigenvalues \(n,\ldots, n,0\).
There is concentration up to \(\sqrt{n\ln n}\si\). We just need this to be \(<n\) in order to make the second smallest eigenvalue of \(M\) be \(>0\). (The smallest eigenvalue is 0.)
Thus we can tolerate noise up to \(\si = o\pa{\sfc{n}{\ln n}}\), much better!
Next step: try to generalize this!
We want to recover the clustering from \(\mattn JOOOJOOOJ\) plus noise.
Let \(x\in\R^{3n}\) be the (proposed) clustering, where we think of \(x\in (\R^3)^n\) and \(x_i=e_j\) if \(i\) is in the \(j\)th cluster.
We want \(\min\sum_{i,j} (x_{i1}x_{j1}+x_{i2}x_{j2}+x_{i3}x_{j3} - a_{ij})^2\) over valid \(x\)’s. For valid \(x\)’s, the quadratic term is 0 or 1, so we want \[\amax_{x_{i1}^2+x_{i2}^2+x_{i3}^2=1, x_{i1}+x_{i2}+x_{i3}=1} \sum (a_{ij}-1)(x_{i1}x_{j1}+x_{i2}x_{j2}+x_{i3}x_{j3}).\] We can write the expression in matrix form as \(\an{B,xx^T}\) where \(B=(a_{ij}I)_{i,j}\) (block matrix). For a SDP relaxation, replace \(xx^T\) with \(M\), \(M\succeq 0\).
How does this relaxation do?
In clustering we’re given \(v_1,\ldots, v_n\) each of which is either \(v\) or \(w\) plus noise. We can find \(V^TV\) and work off that matrix.
Look up literature on clustering and learning mixtures of Gaussians.
See Relevant coordinates: low-rank matrix.


public class HttpRequest
extends java.lang.Object
This class support async and sync http request.
When new a HttpRequest,if HttpCallback is null,
you can call getResponse()
to get the request's response ,
this will block caller thread.
if you want request some key-value params,
see this sub class HttpFormRequest
,
and multiple form request see HttpMultipleRequest
.
You can also create self Request class by extend this class.
Request response's body will be different as the param HttpResponseHandler you give,and you have to force convert HttpResponse.getBody()
There are two handler class:
HttpFileDownloadResponseHandler
for file download,the response body is a FileHttpTextResponseHandler
for text response,the response body is a Stringcancel()
after the use of this InputStreamHttpResponse.SYSTEM_ERROR
and body is a ExceptionCreated by seagle on 2018/3/16.
| Constructor and Description |
|---|
HttpRequest(java.lang.String url,
HttpResponseHandler<?> responseHandler)
Constructor.
|
| Modifier and Type | Method and Description |
|---|---|
void |
cancel()
Cancel http request.
|
HttpRequest |
doGet(java.util.concurrent.ExecutorService executor,
HttpCallback callback)
Perform http GET request.
|
HttpRequest |
doPost(java.util.concurrent.ExecutorService executor,
HttpCallback callback)
Perform http POST request.
|
HttpHeader |
getHeader()
Return http request headers.
|
java.lang.String |
getMethod()
Return http method.
|
HttpResponse |
getResponse()
Return http request response.
|
void |
setBodyData(byte[] data)
Setting http body data.
|
void |
setConnectTimeout(int time,
java.util.concurrent.TimeUnit timeUnit)
Set request connect timeout.
|
void |
setInputStream(java.io.InputStream inputStream)
Setting http body data stream.
|
void |
setReadTimeout(int time,
java.util.concurrent.TimeUnit timeUnit)
Set request read timeout.
|
public HttpRequest(java.lang.String url, HttpResponseHandler<?> responseHandler)
cancel()
to cancel all resource after response success of failed!url
- the request urlresponseHandler
- response handlerpublic java.lang.String getMethod()
public HttpHeader getHeader()
doGet(ExecutorService, HttpCallback)
or doPost(ExecutorService, HttpCallback)
public void setInputStream(java.io.InputStream inputStream)
inputStream
- body data streampublic void setBodyData(byte[] data)
data
- body datapublic void setConnectTimeout(int time, java.util.concurrent.TimeUnit timeUnit)
time
- timeouttimeUnit
- time unitpublic void setReadTimeout(int time, java.util.concurrent.TimeUnit timeUnit)
time
- timeouttimeUnit
- time unitpublic HttpRequest doGet(java.util.concurrent.ExecutorService executor, HttpCallback callback)
getResponse()
to get Response.
Be careful that,if HttpResponseHandler is null,you should call cancel()
to cancel all resource after response success of failed!executor
- request thread pool or null.callback
- Async request callback or null.public HttpRequest doPost(java.util.concurrent.ExecutorService executor, HttpCallback callback)
getResponse()
to get Response.
Be careful that,if HttpResponseHandler is null,you should call cancel()
to cancel all resource after response success of failed!executor
- request thread pool or null.callback
- Async request callback or null.public void cancel()
public HttpResponse getResponse()


--- layout: post title: George Armstrong Custer date: '2016-03-21T04:40:57+01:00' categories: - Sketches - Sketchbooks - Horses picture_url: https://film-Storyboards.tumblr.com/post/141423060806 ---


To Go Counter, Barista
April 2016 - December 2016
- Customized Cappuccinos and Lattes for restaurant guests
- Proved ability to answer customers' questions and give information regarding the business in a customer friendly way
- Maintained stations restocked, cleaned, and orderly at all times


E-Mu Morpheus and Ultra Proteus
Single Patch Editor
This editor will work with the E-Mu Morpheus and the E-Mu Ultra Proteus, but you will need to set a switch to indicate which one you are using.
Communicating with Edisyn
Set the MIDI ID to the same you'll be setting in Edisyn (typically 0). In your default MIDI Map, turn OFF Program Change Map, and turn ON Bank Select and Program Change. Feel free to reduce the Sysex packet delay to 0. Make certain that the Preset button is pressed.
Uploading Pseudo-MPE
The Morpheus/Ultraproteus doesn't support MPE. But we can fake it by setting up one of its midimap patches in a special way, and this can be taken advantage of by instruments such as the Linnstrument.
You can prepare a midimap patch slot with Write Patch as Psuedo-MPE. This writes a midimap patch which points to your current single patch, including the current name, bank, and (single patch) number. Each slot in the midimap patch will refer to this patch but have a unique MIDI channel. You get to choose what midimap patch number to write to. Note that your single-patch must already be written to the synth. You need to make sure that your MIDI Mode is set to "Multi" to play the patch.
Uploading a Proteus Patch
It's easy: just use Edisyn's E-Mu Proteus editor. Be sure to first turn ON the "Proteus Sysex" option in your unit.
Gotchas
- Neither the Morpheus nor the Ultra Proteus can send to the current patch -- they can only write patches, or send individual parameters. But sending to the current patch is a critical function. Earlier versions of Edisyn used to write to patch 126, but as of Version 31, Edisyn just (slowly) sends individual parameters to the Morpheus/Ultra Proteus. This change is because it is unclear if the Morpheus/Ultra Proteus uses Flash RAM, and frequently writing to patch 126 will gradually burn it out.
- This editor works with both the Morpheus and the Ultra Proteus. These two synthesizers have identical sysex, except for four parameters: the two layers' instruments and the two layer's filters. The patch editor provides a checkbox labeled "Ultra Proteus": if you select this checkbox, then the editor is in Ultra Proteus mode, otherwise it is in Morpheus mode. You can tell what mode the editor is in because it displays that synthesizer type in the window's title bar. Your mode choice will affect the instruments available. It will not affect the filter list: instead, filters that are only available in the Ultra Proteus will have a "[UP]" next to them. It's important to have this mode set properly when you load a patch: things won't work right otherwise, and Edisyn can't tell whether the incoming patch is for the Morpheus or Ultra Proteus just by looking at it.
- In the Patching panel, some destinations are only available for the Note On matrix and will not work in the Real Time matrix nor (I believe) the Foot Switch options. These destinations are indicated with an "[N]" next to them.
- You cannot request the current patch on the Morpheus or Ultra Proteus.
Thanks
Thanks to Mike Perkowitz<EMAIL_ADDRESS>and MatrixSynth<EMAIL_ADDRESS>for their crucial help in developing and debugging this patch editor.
| By
| Sean Luke
|
| Date
| October 2018
|


Montana Velo
Road Race
Sunday, 18 April
2004
Helena MT
USCF Permit
#2004-474
(80 total
riders)
Official
Results:
Men 1-3 (60
miles)
1 Ryan
Krusemark MSU cat 3 2:40.30
2. Andy
Minier MSU cat 2
3. Will Schneider E-Caps cat 2
4. Blake
Wiedenheft MSU cat 3
5. Scott
Herzig Montana Velo cat 2
6. Dave
Hill MSU cat 3
7. Rich
Graves Flathead Cycling cat 2
8. Clint
Muhlfield Flathead Cycling cat 2
9. Jay Noonan Flathead Cycling cat 3
10. Jason Hobson Five
Valley Velo cat 3
11. Seth Hansen Northern
Rockies cat 3
12. Josh
Whitmore Five Valley Velo cat
3
13. John
Weyhrich Five Valley Velo cat
2
14. Keith
Carperelli Montana Velo cat 3
15. Russ
Schneider Unattached cat 3
16. Dan Dahlberg Northern
Rockies cat 2
DNF Jake Wheeler MSU cat 3
Men 4,5 (60
miles)
1. Dan Barry MSU 2:48.00
2. Aaron Johnson MSU
3. Robert Presta Five
Valley Velo
4. Brad Morgan Unattached
5. Robert Funk Northern
Rockies
6. Phil Hess Great Divide
7. Eric Ziegler Five Valley Velo
8. Miles Key Five Valley Velo
9. Shane Mundt Montana
Velo
10.Jake Zander MSU
11. Mark Wise Flathead Cycling
12. Mike Borduin Highland
13. Steve Willis Flathead
Cycling
14. Jonathan
Wirth Flathead
Cycling
15. Rick Finley Great
Divide
16. Dan Gager Five Valley Velo
17. Sam
Kavanaugh MSU
18. Eric Bailly MSU
19. Philip Knack Unattached
20. Nathan Sande Flathead
Cycling
21. John Lackey MSU
22. Pat Marzullo Unattached
23. Don Cole Unattached
24. John Thomas Echelon
25. Dave
Hasinger Unattached
26. Howard
Williams Five Valley Velo
27. Jacques Oury Five
Valley Velo
DNF Steve Lamb Unattached
DNF John Melvin Five
Valley Velo
Masters Women
A (60 miles)
1. Margie Legg Five
Valley Velo
Master Men A
(60 miles)
1. Mike Longmire Northern
Rockies
2. Charles
Harper Yellowstone
Valley CC
3. Jeff
Agamenoni Echelon
4. Steve Muller Flathead
Cycling
5. Will Snider Great Divide
6. Tim Gaertner Flathead
Cycling
7. Jim Clapp Five Valley Velo
8. Trevor Brandt Great
Divide
DNF Byron DeFord Great
Divide
Junior Men
(34 miles)
1. Kevin Grey (18 yrs old) Bangtail Bikes/Bozeman 1:52.50
2. Nigel Neaves
(16) Unattached
3. Brian
Hundtofte (16) Unattached
4. Marshall Opel
(13) Northern Rockies
Women 3, 4,
Master (34 miles)
1. Sunny Fenton MSU 1:53.00
2. Monica Tranel Unattached
3. Jessica
Shambora MSU
4. Gwen Sensenig Great Divide
5. Kathy McGann Northern
Rockies
6. Amber Kyle Northern Rockies
7. Rhonda Wodnik Great
Divide
8. Sheryl
Burright Great Divide
Master Men B
(34 miles)
1. Walt Chauner Flathead
Cycling 1: 44.00
2. Eric Lanol Great Divide
3. John
Coulthard Highland CC
4. Mike Telling Great
Divide
5. John Winne Unattached
6. Eric
Schneider Unattached
7. Jay Shavem Flathead Cycling
8. Paul Sebens Unattached
9. Richard Allen Five
Valley Velo
10. Bill Grey Bangtail Bikes/Bozeman
11. Ed Whitfield Unattached
12. Tom Cannon Unattached


@(id: Long, classroomForm: Form[Classroom]) @import helper._ @localScripts = { } @main(scripts = localScripts) {


Warbrick
This page contains an index of all the individuals in the database with the surname of Warbrick. Selecting the person’s name will take you to that person’s individual page.
| Given Name | Birth | Death | Partner | Parents |
|---|---|---|---|---|
| Alma | 1903 | 1918 | Warbrick, Christopher (Fanny), Frances Charlotte | |
| Annie C. | c1911 | Simes, Stanley A. | Warbrick, Thomas Frederick Watt, Cecilia Florence | |
| Annie L. | 1892 | Tooth, Harold W. | Warbrick, Christopher (Fanny), Frances Charlotte | |
| Cecelia F. | c1913 | Perry, Victor George | Warbrick, Thomas Frederick Watt, Cecilia Florence | |
| Christopher | 1949 | (Fanny), Frances Charlotte | ||
| Christopher Patrick | 1881 | 1950-04-23 | Turner, Frances E., Hutchinson, Edith | Warbrick, Christopher (Fanny), Frances Charlotte |
| Francis W. | 1893 | Whittaker, May | Warbrick, Christopher (Fanny), Frances Charlotte | |
| James Christopher | c1915 | Rodd, Betty Margaret | Warbrick, Thomas Frederick Watt, Cecilia Florence | |
| Jocelyn Florence | 1935-10-28 | 1937-01-30 | Warbrick, Thomas Frederick Irish, Veronica Helen | |
| Maude | c1914 | 1916-12-27 | Warbrick, Christopher Patrick Turner, Frances E. | |
| Richard Alan John | c1923 | 1928-08-17 | Warbrick, Christopher Patrick Turner, Frances E. | |
| Roy Charles | c1919/20 | 1921-11-22 | Warbrick, Roy Montague ???, Ruby B. | |
| Roy Montague | 1895 | 1956-03-07 | ???, Ruby B. | Warbrick, Christopher (Fanny), Frances Charlotte |
| Shirley Helen | 1931-11-18 | 1943-12-09 | Warbrick, Thomas Frederick Irish, Veronica Helen | |
| Thomas Frederick | 1886 | 1949-11-05 | Watt, Cecilia Florence | Warbrick, Christopher (Fanny), Frances Charlotte |
| Thomas Frederick | 1909 | Irish, Veronica Helen | Warbrick, Thomas Frederick Watt, Cecilia Florence | |
| Thomas Leslie | c1922/3 | 1928-05-12 | Warbrick, Roy Montague ???, Ruby B. | |
| [Living] | Bone, [Living] | Warbrick, Thomas Frederick Irish, Veronica Helen |


The Score * * (out of * * * * )
Directed by Frank Oz. Cast: Robert De Niro, Edward Norton, Marlon Brando, Angela Bassett, Jamie Harrold, Gary Farmer. 2001 - 123 minutes Rated R (for profanity). Reviewed by Dustin Putman, July 14, 2001.
With top-flight talent onboard that includes the likes of Robert De Niro, Edward Norton, Marlon Brando, and Angela Bassett, one has to wonder how Frank Oz's "The Score" got greenlit without one person involved--be it the cast or the crew--calling it on its mediocre screenplay. Unevenly written by Kario Salem, Lem Dobbs, and Scott Marshall Smith, what we have here is a would-be crime thriller involving a long-time burglar who is about to perform one last big score before retirement, if only he can get away with it unscathed. Stop me if you've heard this one before.
The man in question is Nick Wells (Robert De Niro), and now that he owns a successful Montreal nightclub, he wants out of his life of crime. Inspiring this decision is his devoted, flight attendant girlfriend, Diane (Angela Bassett), who has agreed to give up her job position and move to Montreal to be with him, if only he fulfills his end of the bargain and stops putting his life on the line. But first, Nick must pull off one final job, brought to his attention by an old friend named Max Baron (Marlon Brando). It seems the Custom House has a beautiful, 17th-century scepter in storage that is, more or less, priceless, and if Nick is able to pull it off, he will remain wealthy for the rest of his crime-free life. Despite vowing always to work alone, Nick is persuaded by Max to be accompanied by young ingenue Jackie Teller (Edward Norton), who works at the Custom House and is the one man that can get on the inside and case the location of the scepter.
For its opening ninety minutes, "The Score" rambles along setting up the premise, and then repeats this set-up again and again with variations on who the characters happen to be in each given scene. Heist films are a subgenre as old as the silent picture era, and "The Score" needlessly wallows in its cliches for far too long, as if director Frank Oz (1999's "Bowfinger") isn't quite sure that the audience will understand the complex plot. Little did Oz realize that the plot is actually quite simple, and maybe even too simple to sustain a two-hour-plus running time.
If the first three-quarters of the film are basic filler for what is to come, the final thirty minutes are a suspenseful, crackerjack entertainment, tightly paced and drenched in nailbiting tension. As the heist gets underway, almost everything that could go wrong does, and Oz excels in following Nick and Jackie on their high-risk steal.
Perhaps the climax seems so impressive because everything that comes before it is such a waste of time. The characters are handled in a clunky manner that paints them as giant bores with little interests outside of what the story requires. Robert De Niro (2001's "15 Minutes") is a consistently great actor who, for the first time in memory, fails to deliver an interesting performance. De Niro is by no means bad, but his character of Nick is dull, and so is he. Edward Norton (2000's "Keeping the Faith") fares decidedly better, only because his role of Jackie requires that he actually do a little something that stands out. In Jackie's case, this is acting like a mentally handicapped man through half of the movie, as he singlehandedly fools everyone he works with at the Custom House.
In phoned-in parts that are woefully underutilized, it is downright depressing to see a screen icon such as Marlon Brando (1996's "The Island of Dr. Moreau") just sit around and attempt to make the best of the circumstances. Granted, Brando is not in the best of health (or shape), so this may explain his limited involvement in the story, but he deserves better. Meanwhile, Angela Bassett (2000's "Supernova") turns in a small, effective performance as Nick's long-suffering gal, but something tells me a large chunk of her role found its way to the cutting-room floor.
In what could have been a dynamite crime movie with excellent actors strutting their stuff in a taut script, director Frank Oz has botched the results, and with no help from his lazy writers. Repetitive to the point of viewer impatience, only to strike back with a bravura final act that exposes how deeply flawed the rest of it is, "The Score" must ultimately go down as a missed opportunity, one that will undoubtedly hang as little more than a footnote in these fine performers' respective careers.
- Copyright 2001 by Dustin Putman http://us.imdb.com/ReviewsBy?Dustin+Putman
* Coming Soon - My New Movie Review Website, www.themovieboy.com! *
========== X-RAMR-ID: 28812 X-Language: en X-RT-ReviewID: 236416 X-RT-TitleID: 1108799 X-RT-AuthorID: 1388 X-RT-RatingText: 2/4
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Katharine McPhee, 35, pokes fun at age difference to husband David Foster, 70, in cheeky Twitter post
by Julius YoungKatherine McPhee isn’t at all fazed by the fact her husband David Foster is double her age.
The former “American Idol” standout made it a point to poke some fun at the pair’s age gap in response to a fan who mentioned how McPhee was absent from the 16-time Grammy-winning Foster’s 1992 Christmas album.
“Am I playing #DavidFoster 's 1992 xmas album for my entire office? Yes. Do I have no shame? Yes. The only downside is no @katharinemcphee on this album,” one Twitter user wrote, tagging McPhee in the post.
KATHARINE MCPHEE AND DAVID FOSTER'S WHIRLWIND MAY-DECEMBER ROMANCE: A RELATIONSHIP TIMELINE
The 35-year-old singer took the joke in spirit and issued her own sharp commentary.
“The recording schedule for this conflicted with my 3rd grade homework, unfortunately,” McPhee bantered, spurring a slew of memes praising the “Waitress” Broadway performer for her witty remark.
KATHARINE MCPHEE TELLS DAVID FOSTER'S DAUGHTER ERIN THAT 'MOMMY AND DADDY NEED ALONE TIME'
The pair has previously defended their age difference with McPhee calling their love “genuine,” adding that they “respect each other and have for a very long time.”
“There are just a lot of things when you look at the history of our relationship, neither of us could have written it,” she told People in September 2018. “I would never have imagined that this would be our future together.”
7 CELEBRITY COUPLES WITH BIG AGE GAPS
“We understand each other,” Foster, 70, said.
“He has things to learn from me and I have a lot of things to learn from him. So I think we have a nice yin and yang," McPhee concluded. “It doesn’t make sense to a lot of people, but it does to us."
KATHARINE MCPHEE GUSHES OVER 'EASY' MARRIAGE TO HUSBAND DAVID FOSTER: 'THAT'S HOW IT SHOULD BE'
McPhee and Foster tied the knot at a church in London this past June. The couple first met in 2006 when McPhee was a contestant on season 5 of "American Idol" and Foster was a mentor on the singing competition series.
Foster proposed to his bride in July 2017 with a huge emerald diamond ring while the couple was on vacation in Italy. For her very special day, McPhee wore a custom-designed strapless gown by American designer Zac Posen. It featured layers of tulle, a sweetheart neckline and a matching veil.
CLICK HERE TO GET THE FOX NEWS APP
This marriage marks Foster's fifth and McPhee's second.
Fox News’ Jessica Napoli contributed to this report.


--- layout: post authors: ["Michael Hansen"] title: "Michael Hansen: What I've Learned" date: 2013-09-25 time: "12:00:00" tags: ["Community", "Experience Report"] ---
My first exposure to Software Carpentry was during a bootcamp at Indiana University in March of 2012. I volunteered to be a helper, and found myself really enjoying helping motivated students learn how to incorporate the material into their own research. I've since volunteered as an instructor at a handful of other bootcamps (including one at IU again this past summer). In this post, I'll briefly discuss some "lessons learned" from Software Carpentry.
As a computer science major and professional programmer, Software Carpentry hasn't really taught me any new coding skills. As a graduate student and a scientist, however, I've learned some very important lessons:
make
awayGood Science is Reproducible by Others
Have you ever read a paper, and wondered (precisely) how they got their results? Have you ever unearthed some of your (or a labmate's) old code, and tried to reverse engineer the magic 10 steps necessary to compile and run it? You're not alone.
Software Carpentry promotes reproducible science via automation. For me, this boils down to a simple rule of thumb: anyone who has access to my code should be able to (1) clone the repository, and (2) run make to generate the final product. This holds true for my papers and, thanks to the IPython Notebook, it's now possible for me to generate my figures and PDFs using the same process.
Sharing is Caring
Sharing your code and data is part of reproducible science, but making it publicly available (as opposed to by request) changes the game a bit. When your code is up on Github for the world to see, its quality becomes a much higher priority. Although it can be scary to have the intimate details of your analyses exposed, the benefits are numerous. Others can build on your work, confirm your results, and avoid making the same mistakes you made by trying to "reinvent the wheel".
When possible, I believe data should also be shared. In many cases, this means more than just depositing a .zip file or an SQLite database somewhere. The Software Carpentry website links to some good resources for sharing data.
Stand on the Shoulders of Giants
I'll admit to falling prey to the Not Invented Here syndrome on occasion. As a programmer, you sometimes would rather write it yourself than learn to use someone else's tool or library. But there are benefits to taking the extra time.
First, you are going to forget at least one corner case. A classic example is deciding to write your own CSV parser and forgetting to properly handle commas inside of quotes. What seems like a simple problem can quickly consume hours or days of your time. Second, your software can get better without any additional effort. Bugfixes, performance improvements, and new features can be added to the libraries you depend on. What better way to fight code rot? Finally, learning to use libraries makes you more than a one-trick programmer; you begin to see solutions as decomposable into well-known building blocks rather than as a monolithic entity.
Teach Others to Understand Yourself
Even though I use Python as my main language day-to-day, it always amazes me how often gaps in my knowledge are exposed during bootcamps. Students quickly go down paths I would never have considered, and it helps me learn more about the thing I'm supposed to be an expert in.
For example, I mistakenly typed this code during a presentation at a recent bootcamp:
x = 2 if x % 2: print "Even" else: print "Odd"
This had the opposite behavior of what I was expecting because of the mistake in the critical line:
if x % 2:
It led to a brief discussion about which values Python considers "true" and "false", and I had wrongly assumed that only False
and None
were "false" (0 and the empty list are too). I still advise students not to depend on these behaviors (they can vary by language), but it was a learning moment for me too.


{% extends 'layouts/main.html' %} {% block title %}ARIMA{% endblock %} {% block content %}
ARIMA is a forecasting model that utilizes time series based data to model the autocorrelations in the data. To improve the forecasting accuracy of an ARIMA model, the trend and seasonality in the time-series data is removed.
The stock prices for DAL were rescaled using a log transformation in order to reduce the skewness in the distribution. Additionally, a first difference of the transformed stock prices was taken to achieve a stationary time series. An autocorrelation and partial autocorrelation plot of the first differences was created to determine the model's parameters for Autoregressive (p), Integrated (d), and Moving Average (q).
The optimal ARIMA model still dramatically overpredicted the Daily Low each day which resulted in the trading strategy entering the market at far too high of price. The overall returns using ARIMA predictions resulted in a LOSS of over 300% during the 3 month trading window.
Key Learnings from this model:
The main reason for the poor performance of the ARIMA model, relative to the other models, is that it only used the daily DAL low and high price to predict the daily low and high price, respectively. With additional features, the predicted accuracy would most likely improve. In order to take advantage of the additional features in the dataset, a Vector Auto Regression (VAR) method would need to be applied.
{% endblock %}


{% extends 'base.html' %} {% block content %}
Write it down, get it done.
Do you find yourself overwhelmed with all the things you have to do?
Don't know what to do first?
That's alright, neither did we, until we made Chalk.
and Chalk will help you figure out how to go about your week.
Chalk will take care of it, so you don't have to.


Comparing Crime Rates Between Seattle and San Francisco
In this small post, we shall analyse the differences between crime statistics collected from Seattle and San Francisco. In short, we shall observe how the crimes vary across the months of a year in the two cities. We shall also map out the crimes recorded in the cities to identify the areas of the cities with a greater propensity for witnessing crime incidents.
Main Conclusions
The following are the main conclusions of this analysis:
-
The number of crimes committed in Seattle are way more than the ones committed in San Francisco over the duration of a year. Both the cities experience the peak of crimes in the months of June,July and August.
-
The incidents of crime are concentrated in the north-eastern region of San Francisco. The incidents of crime are concentrated in small urban pockets in Seattle,and the bulk of the crime occurs in the central region of the city.
The yearly variations in the crime statistics in Seattle are as follows:
The yearly variations in the crime cases in San Francisco are as follows:
As it can be seen from the two charts above, both the cities witness the peak of crimes in the months of June, July and August. However,Seattle experiences a far greater number of crime cases as compared to San Francisco, and the city also experiences a much lower and decreasing number of cases from September till December. However, the data for San Francisco shows no such trend. A possible reason for the lack of data might be the fact that the dataset that we used did not contain complete information for San Francisco.
The following diagram illustrates the distribution of crime incidents across the areas of Seattle.
As can be seen from the above visualisation, the greatest number of crimes are reported from the central urban areas of Seattle. Apart from this, there is also a concentration of crime cases reported in small clusters, which are separated by regions of lower density of crime cases. This pattern supports the notion of the crime cases being more distributed in densely populated urban areas of Seattle.
The following illustration displays the crime cases reported across the city of San Francisco
As can be seen from the visualisation, the greatest number of crime statistics are reported from the north-eastern region of San Francisco. Although there are pockets of areas with moderate levels of crime cases reported, the visualisation clearly shows that the north-eastern region of San Francisco is more prone to crime as compared to the other parts of the city.
Code For This Exercise:
The following is the code that I used to generate these graphs. The code was written in R.
require(googleVis)
require(ggmap)
sanfrancisco_dataset <- read.csv(“sanfrancisco.csv”)
seattle_dataset <- read.csv(“seattle.csv”)
seattle_dataset$Date.Reported <- as.Date(seattle_dataset$Date.Reported,”%Y/%m/%d”)
seattle_crime_count_date<-aggregate(seattle_dataset$Offense.Type,by=list(seattle_dataset$Date.Reported), FUN = length)
names(seattle_crime_count_date) <- c(“Date”,”Count”)
SeattleHeatMap <- gvisCalendar(seattle_crime_count_date,datevar = “Date”,numvar = “Count”,options=list(
title=”Calendar heat map of Crime cases in Seattle over the year”,
calendar=”{cellSize:10,yearLabel:{fontSize:20, color:’#444444'},focusedCellColor:{stroke:’red’}}”,width=590, height=320),chartid=”Calendar”)
plot(SeattleHeatMap)
sanfrancisco_dataset$Date <- as.Date(sanfrancisco_dataset$Date,”%Y/%m/%d”)
sanfrancisco_crime_count_date<-aggregate(sanfrancisco_dataset$IncidntNum, by = list(sanfrancisco_dataset$Date), FUN = length)
names(sanfrancisco_crime_count_date) <- c(“Date”, “Count”)
SanFranciscoHeatMap <- gvisCalendar(sanfrancisco_crime_count_date,datevar = “Date”,numvar = “Count”,options=list(
title=”Calendar heat map of Crime cases in San Francisco over the year”,
calendar=”{cellSize:10,yearLabel:{fontSize:20, color:’#444444'},focusedCellColor:{stroke:’red’}}”,width=590, height=320),chartid=”Calendar”)
plot(SanFranciscoHeatMap)
map.seattle_city <- qmap(“seattle”, zoom = 11, source=”stamen”, maptype=”toner”,darken = c(.3,”#BBBBBB”))
map.seattle_city + geom_point(data=seattle_dataset, aes(x=Longitude, y=Latitude), color=”dark green”, alpha=.03, size=1.1)
map.sanfrancisco_city <- qmap(“sanfrancisco”, zoom = 11, source=”stamen”, maptype=”toner”,darken = c(.3,”#BBBBBB”))
map.sanfrancisco_city + geom_point(data=sanfrancisco_dataset, aes(x=X, y=Y), color=”dark green”, alpha=.03, size=1.1)
(This blog post has been written as one of the assignments of the Data Science MOOC being offered on Coursera by the University of Washington). It was originally published on Medium
Leave a Comment


Everton's Gomes has ankle surgery after horrific injury
London - Everton midfielder Andre Gomes is expected to make a "full recovery" after undergoing surgery to repair a fracture dislocation of his ankle, the Premier League club said on Monday.
The Portugal international suffered the shocking injury when he fell awkwardly following a challenge from Tottenham's Son Heung-min in Sunday's 1-1 draw at Goodison Park.
"Everton Football Club can confirm Andre Gomes underwent surgery to repair a fracture dislocation to his right ankle earlier today and the procedure went extremely well," a club statement said.
It added: "The 26-year-old is expected to make a full recovery."
Tottenham's players were also affected by the incident, with Son -- who was sent off by referee Martin Atkinson for his challenge -- in tears and Serge Aurier, who collided with Gomes, substituted.
The Premier League said in a statement that Son's red card was for "endangering the safety of a player", but Spurs are expected to lodge an appeal against Atkinson's decision.
Tottenham manager Mauricio Pochettino felt the injury led to an over-reaction.
"It was clear it was never the intention of Son to create the problem that happened afterwards. It is unbelievable to see a red card," said the Spurs boss.
"We all feel sorry for Andre. I want to send my best wishes to him and to his family in this tough moment. We want to send, on behalf of the squad, our best wishes."
Though Everton cancelled out Dele Alli's opening goal with a Cenk Tosun header deep into the 12 minutes of time added on following Gomes' injury, there was little sense of celebration at full-time.
Everton defender Mason Holgate said he and his teammates felt like they owed it to Gomes to get a result, but the draw still felt like a defeat.
"It is hard when something like that happens to get going again but we showed fight and went again," Holgate said.
"But it shows what we are about as a team. We got together and I think it drove us on a bit more once we got going, trying to do it for him.
"It was really flat (in the dressing room). It was like we had been beaten."


--- layout: post title: Forrest Gump in 1 Minute and 1 Take external-url: http://www.youtube.com/watch?v=nOvgJ0TxdfI&fmt=22 ---
Incredibly thorough and complete. Lacks some of the emotion though.


Preparation time
1-2 hours
Cooking time
less than 10 mins
Serves
Makes 16
Dietary
Adding melted butter to the batter makes all the difference to the flavour and texture of the pancakes and will make it possible to cook them without greasing the pan each time.
Sift the tapioca flour, rice flour and salt into a large bowl. Make a well in the centre and drop in the lightly beaten eggs. Using a whisk and starting in the centre, mix the eggs gradually bringing in the flour mixture. Add the milk slowly and beat until the batter is smooth and covered in bubbles.
Refrigerate the pancake batter for at least one hour. Just before you cook the pancakes, whisk the batter again, as some of the flour will have settled to the bottom, and stir in the melted butter.
To cook the pancakes, heat a heavy cast-iron crèpe pan or a 20-23cm/8-9in non-stick frying pan until very hot. Using a ladle, pour in just enough batter to cover the base of the pan thinly. Loosen the pancake around the edge, flip over with a spatula or thin-bladed fish knife, cook for 1-2 seconds on the other side and slide off the pan onto a plate.
The pancakes may be stacked on top of each other and peeled apart later. Alternatively, they will keep in the fridge for several days or, if a disc of parchment paper is placed between each pancake, they freeze perfectly.


Simple Message Relay - Browser Demo
See the GitHub project page for usage instructions.
Socket.IO state: Disconnected
Send Notification
| Type: | |
| Message: | |
| Link: | |
| Image: | |
See the GitHub project page for usage instructions.
Socket.IO state: Disconnected
| Type: | |
| Message: | |
| Link: | |
| Image: | |


Welcome to Programpie
We are preparing a
huge surprise
For new
Programpie members
Which will remain a
secret
for now
If you don't want to miss out on it
Join us with one click


Fans Registration
Who is your Favorite Member?
What is the best content at this site?(Check for the answer)
Did You Like This Site?
Any comments or sugestions?