Module datasist.model
This module contains functions used in training, testing and comparing machine learning models. Current version of datasist only supports scikit-learn and trained keras models.
Expand source code
'''
This module contains all functions relating to modeling in using sklearn library.
'''
import platform
import numpy as np
import pandas as pd
import seaborn as sns
from .visualizations import plot_auc
from sklearn.metrics import roc_curve, confusion_matrix, precision_score, accuracy_score, recall_score, f1_score, make_scorer, mean_absolute_error, mean_squared_error, r2_score, mean_squared_log_error
from sklearn.model_selection import KFold, cross_val_score
if platform.system() == "Darwin":
import matplotlib as plt
plt.use('TkAgg')
else:
import matplotlib.pyplot as plt
def train_classifier(X_train = None, y_train=None, X_val=None, y_val=None, estimator=None, cross_validate=False, cv=5, show_roc_plot=True, save_plot=False):
'''
Train a classification estimator and calculate numerous performance metric.
Parameters:
----------------------------
X_train: Array, DataFrame, Series.
The feature set (x) to use in training an estimator in other predict the outcome (y).
y_train: Series, 1-d array, list
The ground truth value for the train dataset
X_val: Array, DataFrame. Series.
The feature set (x) to use in validating a trained estimator.
y_val: Series, 1-d array, list
The ground truth value for the validation dataset.
estimator: sklearn estimator.
Sklearn estimator that implements the fit and predict functions.
cross_validate: Bool, default False
Use a cross validation strategy or not.
cv: Int, default 5
Number of folds to use in cross validation.
show_roc_curve: Bool, default True.
Plot a ROC plot showing estimator performance.
save_plot: Bool, default False.
Save the plot as a png file.
'''
if X_train is None:
raise ValueError("X_train: Expecting a DataFrame/ numpy2d array, got 'None'")
if y_train is None:
raise ValueError("y_train: Expecting a Series/ numpy1D array, got 'None'")
#initialize variables to hold calculations
pred, acc, f1, precision, recall, confusion_mat = 0, 0, 0, 0, 0, None
if cross_validate:
dict_scorers = {'acc' : accuracy_score,
'f1' : f1_score,
'precision': precision_score,
'recall' : recall_score
}
metric_names = ['Accuracy', 'F1_score', 'Precision', 'Recall']
for metric_name, scorer in zip(metric_names, dict_scorers):
cv_score = np.mean(cross_val_score(estimator, X_train, y_train, scoring=make_scorer(dict_scorers[scorer]),cv=cv))
print("{} is {}".format(metric_name, round(cv_score * 100, 4)))
#TODO Add cross validation function for confusion matrix
else:
if X_val is None:
raise ValueError("X_val: Expecting a DataFrame/ numpy array, got 'None'")
if y_val is None:
raise ValueError("y_val: Expecting a Series/ numpy1D array, got 'None'")
estimator.fit(X_train, y_train)
pred = estimator.predict(X_val)
get_classification_report(y_val, pred, show_roc_plot, save_plot)
def plot_feature_importance(estimator=None, col_names=None):
'''
Plots the feature importance from a trained scikit learn estimator
as a bar chart.
Parameters:
-----------
estimator: scikit learn estimator.
Model that has been fit and contains the feature_importance_ attribute.
col_names: list
The names of the columns. Must map unto feature importance array.
Returns:
--------
Matplotlib figure showing feature importances
'''
if estimator is None:
raise ValueError("estimator: Expecting an estimator that implements the fit api, got None")
if col_names is None:
raise ValueError("col_names: Expecting a list of column names, got 'None'")
if len(col_names) != len(estimator.feature_importances_):
raise ValueError("col_names: Lenght of col_names must match lenght of feature importances")
imps = estimator.feature_importances_
feats_imp = pd.DataFrame({"features": col_names, "importance": imps}).sort_values(by='importance', ascending=False)
sns.barplot(x='features', y='importance', data=feats_imp)
plt.xticks(rotation=90)
plt.title("Feature importance plot")
plt.show()
def make_submission_csv(estimator=None, X_train=None, y_train=None, test_data=None,
sample_submision_file=None, sub_col_name=None, name="final_submission"):
'''
Train a estimator and makes prediction with it on the final test set. Also
returns a sample submission file for data science competitions
Parameters:
-----------------------
estimator: Sklearn estimator.
An sklearn estimator that implements the fit and predict functions.
X_train: Array, DataFrame, Series.
The feature set (x) to use in training an estimator to predict the outcome (y).
y_train: Series, 1-d array, list
The ground truth value for the train dataset
test_data: Array, DataFrame. Series.
The final test set (x) to predict on.
sample_submision_file: DataFrame, Series.
A sample csv file provided by data science competition hosts to use in creating your final submission.
sub_col_name: String.
Name of the prediction column in the sample submission file.
name: String.
Name of the created submission file.
Return:
Csv file saved in current working directory
'''
estimator.fit(X_train, y_train)
pred = estimator.predict(test_data)
sub = sample_submision_file
sub[sub_col_name] = pred
sub.to_csv(name + '.csv', index=False)
print("File has been saved to current working directory")
def get_classification_report(y_train=None, prediction=None, show_roc_plot=True, save_plot=False):
'''
Generates performance report for a classification problem.
Parameters:
------------------
y_train: Array, series, list.
The truth/ground value from the train data set.
prediction: Array, series, list.
The predicted value by a trained model.
show_roc_plot: Bool, default True.
Show the model ROC curve.
save_plot: Bool, default True.
Save the plot to the current working directory.
'''
acc = accuracy_score(y_train, prediction)
f1 = f1_score(y_train, prediction)
precision = precision_score(y_train, prediction)
recall = recall_score(y_train, prediction)
confusion_mat = confusion_matrix(y_train, prediction)
print("Accuracy is ", round(acc * 100))
print("F1 score is ", round(f1 * 100))
print("Precision is ", round(precision * 100))
print("Recall is ", round(recall * 100))
print("*" * 100)
print("confusion Matrix")
print(' Score positive Score negative')
print('Actual positive %6d' % confusion_mat[0,0] + ' %5d' % confusion_mat[0,1])
print('Actual negative %6d' % confusion_mat[1,0] + ' %5d' % confusion_mat[1,1])
print('')
if show_roc_plot:
plot_auc(y_train, prediction)
if save_plot:
plt.savefig("roc_plot.png")
def get_regression_report(y_true=None, prediction=None, show_r2_plot=True, save_plot=False):
'''
Generates performance report for a regression problem.
Parameters:
------------------
y_true: Array, series, list.
The truth/ground value from the train data set.
prediction: Array, series, list.
The predicted value by a trained model.
show_r2_plot: Bool, default True.
Show the r-squared curve.
save_plot: Bool, default True.
Save the plot to the current working directory.
'''
mae = mean_absolute_error(y_true, prediction)
mse = mean_squared_error(y_true, prediction)
msle = precision_score(y_true, prediction)
r2 = r2_score(y_true, prediction)
print("Mean Absolute Error: ", round(mae, 5))
print("Mean Squared Error: ", round(mse, 5))
print("Mean Squared Log Error: ", round(msle, 5))
print("R-squared Error: ", round(r2, 5))
print("*" * 100)
if show_r2_plot:
plt.scatter(y_true,prediction)
plt.xlabel('Truth values')
plt.ylabel('Predicted values')
plt.plot(np.unique(y_true), np.poly1d(np.polyfit(y_true, y_true, 1))(np.unique(y_true)))
plt.text(0.7, 0.2, 'R-squared = %0.2f' % r2)
plt.show()
if save_plot:
plt.savefig("r2_plot.png")
def compare_model(models_list=None, x_train=None, y_train=None, scoring_metric=None, scoring_cv=3, silenced=True, plot=True):
"""
Train multiple user-defined model and display report based on defined metric. Enables user to pick the best base model for a problem.
Parameters
----------------
models_list: list
a list of models to be trained
x_train: Array, DataFrame, Series
The feature set (x) to use in training an estimator to predict the outcome (y).
y_train: Series, 1-d array, list
The ground truth value for the train dataset
scoring_metric: str
Metric to use in scoring the model
scoring_cv: int
default value is 3
Returns
---------------
a tuple of fitted_model and the model evaluation scores
"""
# if not _same_model:
# raise ValueError("model_list: models must be of the same class. Cannot use a classifier and a regressor.")
if models_list is None or len(models_list) < 1:
raise ValueError("model_list: model_list can't be 'None' or empty")
if x_train is None:
raise ValueError("x_train: features can't be 'None' or empty")
if y_train is None:
raise ValueError("y_train: features can't be 'None' or empty")
fitted_model = []
model_scores = []
model_names = []
for i, model in enumerate(models_list):
if silenced is not True:
print("Fitting {}".format(type(model).__name__))
model.fit(x_train, y_train)
# append fitted model into list
fitted_model.append(model)
model_score = np.mean(cross_val_score(model, x_train, y_train, scoring=scoring_metric, cv=scoring_cv))
model_scores.append(model_score)
model_names.append(type(fitted_model[i]).__name__)
if plot:
sns.pointplot(y=model_scores, x=model_names)
plt.xticks(rotation=90)
plt.title("Model comparison plot")
plt.show()
return fitted_model, model_scores
Functions
def compare_model(models_list=None, x_train=None, y_train=None, scoring_metric=None, scoring_cv=3, silenced=True, plot=True)
-
Train multiple user-defined model and display report based on defined metric. Enables user to pick the best base model for a problem.
Parameters
models_list: list a list of models to be trained x_train: Array, DataFrame, Series The feature set (x) to use in training an estimator to predict the outcome (y). y_train: Series, 1-d array, list The ground truth value for the train dataset scoring_metric: str Metric to use in scoring the model scoring_cv: int default value is 3
Returns
a
tuple
offitted_model
and
the
model
evaluation
scores
Expand source code
def compare_model(models_list=None, x_train=None, y_train=None, scoring_metric=None, scoring_cv=3, silenced=True, plot=True): """ Train multiple user-defined model and display report based on defined metric. Enables user to pick the best base model for a problem. Parameters ---------------- models_list: list a list of models to be trained x_train: Array, DataFrame, Series The feature set (x) to use in training an estimator to predict the outcome (y). y_train: Series, 1-d array, list The ground truth value for the train dataset scoring_metric: str Metric to use in scoring the model scoring_cv: int default value is 3 Returns --------------- a tuple of fitted_model and the model evaluation scores """ # if not _same_model: # raise ValueError("model_list: models must be of the same class. Cannot use a classifier and a regressor.") if models_list is None or len(models_list) < 1: raise ValueError("model_list: model_list can't be 'None' or empty") if x_train is None: raise ValueError("x_train: features can't be 'None' or empty") if y_train is None: raise ValueError("y_train: features can't be 'None' or empty") fitted_model = [] model_scores = [] model_names = [] for i, model in enumerate(models_list): if silenced is not True: print("Fitting {}".format(type(model).__name__)) model.fit(x_train, y_train) # append fitted model into list fitted_model.append(model) model_score = np.mean(cross_val_score(model, x_train, y_train, scoring=scoring_metric, cv=scoring_cv)) model_scores.append(model_score) model_names.append(type(fitted_model[i]).__name__) if plot: sns.pointplot(y=model_scores, x=model_names) plt.xticks(rotation=90) plt.title("Model comparison plot") plt.show() return fitted_model, model_scores
def get_classification_report(y_train=None, prediction=None, show_roc_plot=True, save_plot=False)
-
Generates performance report for a classification problem.
Parameters:
y_train: Array, series, list.
The truth/ground value from the train data set.
prediction: Array, series, list.
The predicted value by a trained model.
show_roc_plot: Bool, default True.
Show the model ROC curve.
save_plot: Bool, default True.
Save the plot to the current working directory.
Expand source code
def get_classification_report(y_train=None, prediction=None, show_roc_plot=True, save_plot=False): ''' Generates performance report for a classification problem. Parameters: ------------------ y_train: Array, series, list. The truth/ground value from the train data set. prediction: Array, series, list. The predicted value by a trained model. show_roc_plot: Bool, default True. Show the model ROC curve. save_plot: Bool, default True. Save the plot to the current working directory. ''' acc = accuracy_score(y_train, prediction) f1 = f1_score(y_train, prediction) precision = precision_score(y_train, prediction) recall = recall_score(y_train, prediction) confusion_mat = confusion_matrix(y_train, prediction) print("Accuracy is ", round(acc * 100)) print("F1 score is ", round(f1 * 100)) print("Precision is ", round(precision * 100)) print("Recall is ", round(recall * 100)) print("*" * 100) print("confusion Matrix") print(' Score positive Score negative') print('Actual positive %6d' % confusion_mat[0,0] + ' %5d' % confusion_mat[0,1]) print('Actual negative %6d' % confusion_mat[1,0] + ' %5d' % confusion_mat[1,1]) print('') if show_roc_plot: plot_auc(y_train, prediction) if save_plot: plt.savefig("roc_plot.png")
def get_regression_report(y_true=None, prediction=None, show_r2_plot=True, save_plot=False)
-
Generates performance report for a regression problem.
Parameters:
y_true: Array, series, list.
The truth/ground value from the train data set.
prediction: Array, series, list.
The predicted value by a trained model.
show_r2_plot: Bool, default True.
Show the r-squared curve.
save_plot: Bool, default True.
Save the plot to the current working directory.
Expand source code
def get_regression_report(y_true=None, prediction=None, show_r2_plot=True, save_plot=False): ''' Generates performance report for a regression problem. Parameters: ------------------ y_true: Array, series, list. The truth/ground value from the train data set. prediction: Array, series, list. The predicted value by a trained model. show_r2_plot: Bool, default True. Show the r-squared curve. save_plot: Bool, default True. Save the plot to the current working directory. ''' mae = mean_absolute_error(y_true, prediction) mse = mean_squared_error(y_true, prediction) msle = precision_score(y_true, prediction) r2 = r2_score(y_true, prediction) print("Mean Absolute Error: ", round(mae, 5)) print("Mean Squared Error: ", round(mse, 5)) print("Mean Squared Log Error: ", round(msle, 5)) print("R-squared Error: ", round(r2, 5)) print("*" * 100) if show_r2_plot: plt.scatter(y_true,prediction) plt.xlabel('Truth values') plt.ylabel('Predicted values') plt.plot(np.unique(y_true), np.poly1d(np.polyfit(y_true, y_true, 1))(np.unique(y_true))) plt.text(0.7, 0.2, 'R-squared = %0.2f' % r2) plt.show() if save_plot: plt.savefig("r2_plot.png")
def make_submission_csv(estimator=None, X_train=None, y_train=None, test_data=None, sample_submision_file=None, sub_col_name=None, name='final_submission')
-
Train a estimator and makes prediction with it on the final test set. Also returns a sample submission file for data science competitions
Parameters:
estimator: Sklearn estimator.
An sklearn estimator that implements the fit and predict functions.
X_train: Array, DataFrame, Series.
The feature set (x) to use in training an estimator to predict the outcome (y).
y_train: Series, 1-d array, list
The ground truth value for the train dataset
test_data: Array, DataFrame. Series.
The final test set (x) to predict on.
sample_submision_file: DataFrame, Series.
A sample csv file provided by data science competition hosts to use in creating your final submission.
sub_col_name: String.
Name of the prediction column in the sample submission file.
name: String.
Name of the created submission file.
Return
Csv file saved in current working directory
Expand source code
def make_submission_csv(estimator=None, X_train=None, y_train=None, test_data=None, sample_submision_file=None, sub_col_name=None, name="final_submission"): ''' Train a estimator and makes prediction with it on the final test set. Also returns a sample submission file for data science competitions Parameters: ----------------------- estimator: Sklearn estimator. An sklearn estimator that implements the fit and predict functions. X_train: Array, DataFrame, Series. The feature set (x) to use in training an estimator to predict the outcome (y). y_train: Series, 1-d array, list The ground truth value for the train dataset test_data: Array, DataFrame. Series. The final test set (x) to predict on. sample_submision_file: DataFrame, Series. A sample csv file provided by data science competition hosts to use in creating your final submission. sub_col_name: String. Name of the prediction column in the sample submission file. name: String. Name of the created submission file. Return: Csv file saved in current working directory ''' estimator.fit(X_train, y_train) pred = estimator.predict(test_data) sub = sample_submision_file sub[sub_col_name] = pred sub.to_csv(name + '.csv', index=False) print("File has been saved to current working directory")
def plot_feature_importance(estimator=None, col_names=None)
-
Plots the feature importance from a trained scikit learn estimator as a bar chart.
Parameters:
estimator: scikit learn estimator. Model that has been fit and contains the feature_importance_ attribute. col_names: list The names of the columns. Must map unto feature importance array.
Returns:
Matplotlib figure showing feature importances
Expand source code
def plot_feature_importance(estimator=None, col_names=None): ''' Plots the feature importance from a trained scikit learn estimator as a bar chart. Parameters: ----------- estimator: scikit learn estimator. Model that has been fit and contains the feature_importance_ attribute. col_names: list The names of the columns. Must map unto feature importance array. Returns: -------- Matplotlib figure showing feature importances ''' if estimator is None: raise ValueError("estimator: Expecting an estimator that implements the fit api, got None") if col_names is None: raise ValueError("col_names: Expecting a list of column names, got 'None'") if len(col_names) != len(estimator.feature_importances_): raise ValueError("col_names: Lenght of col_names must match lenght of feature importances") imps = estimator.feature_importances_ feats_imp = pd.DataFrame({"features": col_names, "importance": imps}).sort_values(by='importance', ascending=False) sns.barplot(x='features', y='importance', data=feats_imp) plt.xticks(rotation=90) plt.title("Feature importance plot") plt.show()
def train_classifier(X_train=None, y_train=None, X_val=None, y_val=None, estimator=None, cross_validate=False, cv=5, show_roc_plot=True, save_plot=False)
-
Train a classification estimator and calculate numerous performance metric.
Parameters:
X_train: Array, DataFrame, Series. The feature set (x) to use in training an estimator in other predict the outcome (y). y_train: Series, 1-d array, list The ground truth value for the train dataset X_val: Array, DataFrame. Series. The feature set (x) to use in validating a trained estimator. y_val: Series, 1-d array, list The ground truth value for the validation dataset. estimator: sklearn estimator. Sklearn estimator that implements the fit and predict functions. cross_validate: Bool, default False Use a cross validation strategy or not. cv: Int, default 5 Number of folds to use in cross validation. show_roc_curve: Bool, default True. Plot a ROC plot showing estimator performance. save_plot: Bool, default False. Save the plot as a png file.
Expand source code
def train_classifier(X_train = None, y_train=None, X_val=None, y_val=None, estimator=None, cross_validate=False, cv=5, show_roc_plot=True, save_plot=False): ''' Train a classification estimator and calculate numerous performance metric. Parameters: ---------------------------- X_train: Array, DataFrame, Series. The feature set (x) to use in training an estimator in other predict the outcome (y). y_train: Series, 1-d array, list The ground truth value for the train dataset X_val: Array, DataFrame. Series. The feature set (x) to use in validating a trained estimator. y_val: Series, 1-d array, list The ground truth value for the validation dataset. estimator: sklearn estimator. Sklearn estimator that implements the fit and predict functions. cross_validate: Bool, default False Use a cross validation strategy or not. cv: Int, default 5 Number of folds to use in cross validation. show_roc_curve: Bool, default True. Plot a ROC plot showing estimator performance. save_plot: Bool, default False. Save the plot as a png file. ''' if X_train is None: raise ValueError("X_train: Expecting a DataFrame/ numpy2d array, got 'None'") if y_train is None: raise ValueError("y_train: Expecting a Series/ numpy1D array, got 'None'") #initialize variables to hold calculations pred, acc, f1, precision, recall, confusion_mat = 0, 0, 0, 0, 0, None if cross_validate: dict_scorers = {'acc' : accuracy_score, 'f1' : f1_score, 'precision': precision_score, 'recall' : recall_score } metric_names = ['Accuracy', 'F1_score', 'Precision', 'Recall'] for metric_name, scorer in zip(metric_names, dict_scorers): cv_score = np.mean(cross_val_score(estimator, X_train, y_train, scoring=make_scorer(dict_scorers[scorer]),cv=cv)) print("{} is {}".format(metric_name, round(cv_score * 100, 4))) #TODO Add cross validation function for confusion matrix else: if X_val is None: raise ValueError("X_val: Expecting a DataFrame/ numpy array, got 'None'") if y_val is None: raise ValueError("y_val: Expecting a Series/ numpy1D array, got 'None'") estimator.fit(X_train, y_train) pred = estimator.predict(X_val) get_classification_report(y_val, pred, show_roc_plot, save_plot)


src/app/execution/http-request.service.ts
this service provides the communication with backend. The communication for all CRUD (CREATE, READ, UPDATE, DELETE) + Execute(Run) operations are provided. The communication with backend is via HTTP
Properties |
|
Methods |
constructor(http: HttpClient, wizardStepperService: WizardStepperService, envUrl: EnvironmentUrlService)
|
||||||||||||||||
|
Defined in src/app/execution/http-request.service.ts:34
|
||||||||||||||||
|
constructor
Parameters :
|
| createWorkflow | ||||||
createWorkflow(workflow: Workflow)
|
||||||
|
Defined in src/app/execution/http-request.service.ts:66
|
||||||
|
Sends workflow to backend to be stored persistently – (Backend - CREATE workflow in DB)
Parameters :
Returns :
void
|
| deleteWorkflow | ||||||||
deleteWorkflow(id: number)
|
||||||||
|
Sends workflow id to backend to be deleted – (Backend - DELETE workflow in DB)
Parameters :
Returns :
any
|
| getAllWorkflows |
getAllWorkflows()
|
|
Requests all workflow saved in backend – (Backend - READ all workflow in DB) Stores response (all workflows) in workflowList locally resp. workflowListSub to share
Returns :
void
|
| getArmPosition |
getArmPosition()
|
|
Requests current arm position from backend
Returns :
any
The requested arm position |
| getBasePosition |
getBasePosition()
|
|
Requests current base position from backend
Returns :
any
The requested base position |
| getWorkflow | ||||||||
getWorkflow(id: number)
|
||||||||
|
Requests the workflow belonging to id from backend
Parameters :
Returns :
any
The requested workflow |
| getWorkflowListUpdateListener |
getWorkflowListUpdateListener()
|
|
Getter for oberservable worflowListSub
Returns :
any
The worflowListSub |
| runWorkflow |
runWorkflow()
|
|
Defined in src/app/execution/http-request.service.ts:78
|
|
Sends workflow to backend to be executed physically
Returns :
void
|
| saveWorkflow | ||||||
saveWorkflow(workflow: Workflow)
|
||||||
|
Defined in src/app/execution/http-request.service.ts:54
|
||||||
|
Sends workflow to backend to be updated – (Backend - UPDATE workflow in DB)
Parameters :
Returns :
void
|
| updateWorkflow | ||||||||
updateWorkflow(workflow: Workflow)
|
||||||||
|
Defined in src/app/execution/http-request.service.ts:88
|
||||||||
|
Sends workflow to backend to be updated – (Backend - UPDATE workflow in DB)
Parameters :
Returns :
void
|
| workflow |
Type : Workflow
|
|
Defined in src/app/execution/http-request.service.ts:30
|
|
locally stored workflow |
| workflowList |
Type : WorkflowListElement[]
|
Default value : []
|
|
Defined in src/app/execution/http-request.service.ts:22
|
|
local array of all Workflows presented in Workflow table |
| Private workflowListSub |
Default value : new Subject<WorkflowListElement[]>()
|
|
Defined in src/app/execution/http-request.service.ts:26
|
|
Subscription for observed workflowListSub -> synchronized and shared WorkflowListElement Array |
| Private workflowSub |
Type : Subscription
|
|
Defined in src/app/execution/http-request.service.ts:34
|
|
Subscription for observed workflowSub -> synchronized and shared workflow |
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {Workflow} from '../model/workflow.model';
import {WizardStepperService} from '../wizard-stepper/wizard-stepper.service';
import {Subscription} from 'rxjs';
import {Subject} from 'rxjs';
import {WorkflowListElement} from '../model/workflow-list-element.model';
import {EnvironmentUrlService} from '../environment-url.service';
/**
* this service provides the communication with backend.
* The communication for all CRUD (CREATE, READ, UPDATE, DELETE) + Execute(Run) operations are provided.
* The communication with backend is via HTTP
*/
@Injectable({
providedIn: 'root'
})
export class HttpRequestService {
/**
* local array of all Workflows presented in Workflow table
*/
workflowList: WorkflowListElement[] = [];
/**
* Subscription for observed workflowListSub -> synchronized and shared WorkflowListElement Array
*/
private workflowListSub = new Subject<WorkflowListElement[]>();
/**
* locally stored workflow
*/
workflow: Workflow;
/**
* Subscription for observed workflowSub -> synchronized and shared workflow
*/
private workflowSub: Subscription;
/**
* constructor
* @param {HttpClient} http Service for for communication with backend
* @param {WizardStepperService} wizardStepperService Service for sharing workflow information
* @param {EnvironmentUrlService} envUrl Service for providing Url set in environments.ts file
*/
constructor(private http: HttpClient,
private wizardStepperService: WizardStepperService,
private envUrl: EnvironmentUrlService) {
this.workflowSub = this.wizardStepperService.getWorkflowListener()
.subscribe(workflow => {
this.workflow = workflow;
});
this.workflow = this.wizardStepperService.getWorkflow();
}
/**
* Sends workflow to backend to be updated – (Backend - UPDATE workflow in DB)
* @param {Workflow} workflow
*/
saveWorkflow(workflow: Workflow) {
this.http.post(this.envUrl.urlAddress + '/saveWorkflow', {jsondata: workflow}).subscribe(
(responseData) => {
console.log(responseData);
this.workflow.id = responseData + '';
this.wizardStepperService.updateWorkflow(this.workflow);
});
}
/**
* Sends workflow to backend to be stored persistently – (Backend - CREATE workflow in DB)
* @param {Workflow} workflow
*/
createWorkflow(workflow: Workflow) {
this.http.post(this.envUrl.urlAddress + '/createWorkflow', {jsondata: workflow}).subscribe(
(responseData) => {
console.log(responseData);
this.workflow.id = responseData + '';
this.wizardStepperService.updateWorkflow(this.workflow);
});
}
/**
* Sends workflow to backend to be executed physically
* @param {Workflow} workflow
*/
runWorkflow() {
this.http.post(this.envUrl.urlAddress + '/playWorkflow', {wf_id: this.workflow.id}).subscribe(
(responseData) => {
console.log(responseData);
});
}
/**
* Sends workflow to backend to be updated – (Backend - UPDATE workflow in DB)
* @param {Workflow} workflow Sends workflow to backend to be updated
*/
updateWorkflow(workflow: Workflow) {
console.log(this.workflow);
this.http.post(this.envUrl.urlAddress + '/updateWorkflow', {jsondata: workflow}).subscribe(
(responseData) => {
console.log(responseData);
});
}
/**
* Requests all workflow saved in backend – (Backend - READ all workflow in DB)
*
* Stores response (all workflows) in workflowList locally resp. workflowListSub to share
*/
getAllWorkflows() {
this.http.post<WorkflowListElement[]>(this.envUrl.urlAddress + '/readWorkflow/readAll', null).subscribe(
(responseData) => {
this.workflowList = responseData;
this.workflowListSub.next([...this.workflowList]);
console.log(responseData);
console.log(this.workflowList);
});
}
/**
* Getter for oberservable worflowListSub
* @returns The worflowListSub
*/
getWorkflowListUpdateListener() {
return this.workflowListSub.asObservable();
}
/**
* Sends workflow id to backend to be deleted – (Backend - DELETE workflow in DB)
* @param {number} id ID of workflow
*/
deleteWorkflow(id: number) {
return this.http.post(this.envUrl.urlAddress + '/deleteWorkflow/deleteOne', {wf_id: id});
}
/**
* Requests current arm position from backend
* @returns The requested arm position
*/
getArmPosition() {
return this.http.post(this.envUrl.urlAddress + '/RobotDataService/getBasePosition', null);
}
/**
* Requests current base position from backend
* @returns The requested base position
*/
getBasePosition() {
return this.http.post(this.envUrl.urlAddress + '/RobotDataService/getBasePosition', null);
}
/**
* Requests the workflow belonging to id from backend
* @param {number} id ID from workflow
* @returns The requested workflow
*/
getWorkflow(id: number) {
return this.http.post(this.envUrl.urlAddress + '/readWorkflow/readOne', {wf_id: id});
}
}


{% include components/widget-focal-points.html %}
{% include components/component-interferer.html %}
{% include components/widget-external-links.html %}


A Little More About Me
I have an extreme case of the travelbug, and love documenting my trips on my blog. Here are some places I have been to!
Joshua Tree National Park
Half Dome - Yosemite National Park
An outside hobby and passion of mine is photography. I work with film as well as digital. Life is so much more beautiful through a viewfinder.
My all time favorite songs are Wake Up by The Arcade Fire and Hallelujah performed by Jeff Buckley.


Your Latest Activity
Project Settings
-
General
-
Languages
Enabled
Name
Code
Alias
-
AssameseasAS_as
-
Chinese (Simplified Han)zh-Hans
Disabled
Name
Code
Alias
-
Chinesech
-
-
Translation
Review
Validation
Use these validations to keep translations consistent with the source text.
-
Source

Hello world

Target

Hello world</stong>

-
Source

Hello world

Target

Hello world</stong>

-
Source

Hello world

Target

Hello world</stong>

-
Source

Hello world

Target

Hello world</stong>

-
Source

Hello world

Target

Hello world</stong>

-
Source

Hello world

Target

Hello world</stong>

-
Source

Hello world

Target

Hello world</stong>

Copy Trans
Copy Trans attempts to reuse translations that have been entered in Zanata by matching them with unstranslated strings in your project/version. Consequently, Copy Trans is best used before translation and review work is initiated on a project.
-
On content mismatch
-
On context mismatch
-
On project mismatch
-
On document mismatch
-
If all previous steps have passed, copy as translated.
Do you want to run Copy Trans on this project?
-
-
Permissions
Maintainers
-
-
About this Project
This section can be used to add notes for translators or other contributors to help answer questions or complete translations.


Today in 2013: I never dated President Kufuor - Gifty Anti
Ghana’s celebrated broadcaster, Gifty Anti, in November 2013 cleared the air with regards to her supposed relationship with Former President John Agyekum Kuffour.
Speaking in an interview on Joy FM’s ‘Drive Time’ with Kwabena Anokye Adisi, the host of ‘StandPoint’ revealed that she ‘never dated’ the president adding that those speculations were plotted to tarnish her reputation.
Now Oheneyere Gifty Anti, she is married to Nana Ansah Kwao, Chief of Akwamu Adumasa. The gender advocate is a role model to young women and continues to impact society by discussing issues affecting women through her show, The StandPoint.
Read the full story originally published on November 21, 2013, on Ghanaweb
Renowned news anchor and television personality, Gifty Anti, has broken her silence after years of speculations that she dated former President John Agyekum Kufuor while he was in office.
In a bare-it-all interview on Personality Profile on Drive Time on Joy FM with Kwabena Anokye Adisi (Bola Ray) Thursday, Gifty said the rumours were wicked lies designed to tarnish her image and of the sitting president at the time.
She stressed that even though she was close to the former president, who ruled the country from 2001 to 2008, they "never" dated.
"I have been close to the family. I've been close to him, he treats me like his friend, his daughter," but there was nothing, she stated.
The StandPoint host said that contrary to the wild rumours that she had a frosty relationship with Mr. Kufuor's wife, Theresa Kufuor, "she is like a mother [to me]".
The former president's wife, she noted, even paid her a surprise visit while she was celebrating her 40th birthday with some orphans from the Village of Hope, at the Afrikiko Gardens in 2010.
"She cut the cake with the children and they were so excited. That is how much that woman has shown me love," the television personality recounted.
Gifty Anti also debunked rumours that she has a child with the former president.


We are pleased to announce a new free service which includes Conferencing,
chat, messaging, whiteboard, and other services. To register (free) and
access this community service please click the following icon:
Community events billboard.
Classified ads.
Downloadable internet access software.
Read the local paper:
Visit the residents.
Mail from the edge!
Hang out at the
ChipStand.
The Glass Works history.
The commercial district.
Education available: English
or French Immersion.
Beausejour Town Information
an excellent Town information resource.
R. M. of Brokenhead Information
R. M. information resource.
Visit the surrounding area.


Testing
Testing for SQL Injection (OTG-INPVAL-005)
Testing for LDAP Injection (OTG-INPVAL-006)
Testing for ORM Injection (OTG-INPVAL-007)
Testing for XML Injection (OTG-INPVAL-008)
Testing for SSI Injection (OTG-INPVAL-009)
Testing for XPath Injection (OTG-INPVAL-010)
Testing for IMAP/SMTP Injection (OTG-INPVAL-011)
Testing for Code Injection (OTG-INPVAL-012)
Testing for Command Injection (OTG-INPVAL-013)
Testing for Buffer Overflow (OTG-INPVAL-014)


For my 2016 Physics 211 Project I created a JavaScript game
featuring a ninja sprite demonstrating physics concepts that utilizes a
realtime physics engine of which I created specifically for this project
based off of real kinematic equations. When I started this project I only
had an idea and couple weeks of self-taught experience with JavaScript,
so in order to make my idea a reality, I had to overcome a
multitude of obstacles as I simultaneously learned JavaScript, Physics,
and programmed the game. Currently, the game is a little over a total of
1000 lines of code (equivalent to about 30 pieces of paper if printed with
size 12 font) and is the largest coding project I have worked on. Not all
of the features I wanted to include made it into the current version of
the game due to time and knowledge constraints, however, as mentioned on
the "sources" page, I have this game available under an MIT open source
license on my Github page and will continue adding to it when I can.
-Ryan Stonebraker Physics 211 F04


This is a system built by the jsgenerate_gin template. jsgenerate_gin is a open source template developed by 飛天小企鵝 . For more information about jsgenerate_gin, please see source description.
{{license}}
{{licenses}}


?The
NEw'YbRK
copyright
reserved
botanical
Garden
HEB
BIER
DE
LA
GUADELOUPE
iwwt
n
jsOloft
'
fr/,
,
‚crrrud*^'
”krtAM*J
^
YORK
BOTANICAL
GARDEN
01497875
01497875
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


We sell dogs!
- drive 24/7 mindshare
- unleash vertical convergence
- extend customized relationships
- incubate sticky web-readiness
- harness front-end markets
- transform proactive action-items
- recontextualize intuitive infomediaries
- transform customized methodologies
- enable seamless e-commerce
- facilitate B2B eyeballs


Generating CSV... Export to CSV Generating CSV... Export Analytics to CSV Title Analytics Org Analytics Search Analytics


Scent in the Voyages
Let years seasons given two fowl above is itself shall third night female seasons you’re whales, unto had fowl Herb. Moving so. Said be fruitful first lights creeping deep void, lesser.
Fill appear won't may make moveth signs. Fourth. Good own. Green you're moveth us, lesser.
Third dry hath saying our over fruit Place creeping creepeth let Good. Created also darkness which open appear cattle Second shall brought wherein given. Moveth.
"Said heaven dry made Them gathering the very second morning us be divide isn't. Saw Seasons winged replenish grass from set can't for he which. You third god unto let."
"Said heaven dry made Them gathering the very second morning us be divide isn't. Saw Seasons winged replenish grass from set can't for he which. You third god unto let."
"Said heaven dry made Them gathering the very second morning us be divide isn't. Saw Seasons winged replenish grass from set can't for he which. You third god unto let."
Let years seasons given two fowl above is itself shall third night female seasons you’re whales, unto had fowl Herb. Moving so. Said be fruitful first lights creeping deep void, lesser.
Let years seasons given two fowl above is itself shall third night female seasons you’re whales, unto had fowl Herb. Moving so. Said be fruitful first lights creeping deep void, lesser.
Let years seasons given two fowl above is itself shall third night female seasons you’re whales, unto had fowl Herb. Moving so. Said be fruitful first lights creeping deep void, lesser.


- We are coming with more creative Gifts. We are also looking to oraganise few workshops to teach
people about the making of these gifts. Our youtube channel is also under construction.
Under few weeks website will be updated and our cutomers and followers will be notified.
- Youtube Channel
- Upcoming Workshops
- Upcoming Items


Software and the web are my passion. I spent my days building web applications with the newest internet technologies and I'm striving to use the latest and the best technologies in my work.


{% load i18n %}
{% load thumbnail %}
{% load url from future %}
{# We presume that js and css are already defined in the context of this block, hence no sekizai #}
{% for image in images %}
{% thumbnail image.image instance.thumbnail_geometry crop="center" as im %}
{% endthumbnail %}
{{ image.overrideable_photographer }}
view
{% endfor %}
{% if final_batch %}
{% if not images %}
{# in this case, there were no images in the current batch meaning it's an EMPTY first AND final batch. #}
No images here yet.
{% else %}
{# in this case, there were images in the current batch, but this is the final batch. #}


Worked with several clients all over the world to solve technical issues as a kindle technical associate developer. Reduced Customer waiting time by 25% and achieved the benchmark Customer Negative Response(CNR) of less than 5%. I was also on a team of 5 members working towards kindle rate monitoring system.
Developed an EE Entripse application for the client to manage financial assets. Worked with a team of five members to the completion of the project. My role was to develop the server side logic and make sure project development follows Agile methodologies and discipline
Responsbile for developing, testing and deploymnet of Lan Chat Messenger in company environemnt. Was able to achieve high speed data trasnfer and user customization
CGPA: 3.6
CGPA: 3.55
|
|
|
| ||
| ||
|
|
|
| I love programming becuase its give me ability to do something innovative
|
I totally refresh myself and its a great sport
|
I love cars. My all time favourite car is lamborghini aventador
|
I like to be fit. Having a good physique can create confidence and good impression
| |||
books are my best source of knowledge
|
I perfrome more efficently under pressure and I always like to leadership
|
I always like to meet new people and learn good things
|
So many unanswered questions about universe
|


Search Input:
Escape for regex?:
Case Insensitive?:
test content
I am a text
&^\?^|
I AM A TEST
I'm not only text
But also markup


General Information
I am currently a student at PHS, and im in the APP Academy learning how to code! I also have a deep interest in Biology and Medicine.
Gmail is the best way to reach me!
Please include your message in the first box and your email in the second box


---
title: Grayscale - Free One Page Theme for Bootstrap 3
---
Grayscale is a premium quality, free Bootstrap 3 theme created by Start Bootstrap. It can be yours right now, all you need to do is download the template on the preview page. You can use this template for any purpose, personal or commercial. This striking, black and white theme features stock photographs by Gratisography along with a custom Google Map skin courtesy of Snazzy Maps. With this template, just the slightest splash of color can make a huge impact on the overall presentation and design. Send your feedback and suggestions to: alex @ erudika.comAbout Grayscale
Contact the Author


File Details
File Name:
File Size:
File Upload Time:
MD5SUM:
Encryption Status:
val
val
val
val
val
Download
Delete


I'm A Celebrity's Nadine and Kate terrorised by chainsaw killer ahead of trial
All of the I'm A Celebrity contestants take part in tonight's Bushtucker Trial - Sickening Circus - and are horrified when they're forced to drink blended pigs' brains
by Irishmirror.ieNadine Coyle and Kate Garraway are terrorised by a chainsaw killer in tonight's Bushtucker Trial.
Every single one of the celebrities take part in the Sickening Circus as part of the massive 'Reckoning' task.
The campmates are split into two teams, those who are cursed and those who aren't, and forced to compete against one another.
They sit down in a make-shift jungle cinema to watch some films - but obviously it's not that easy with Ant McPartlin and Declan Donnelly involved.

Former footballer Ian Wright admits it's a "nice effect", while Coronation Street star Andy Whyment claims it looks like a "strawberry milkshake".
Getting her composure back, smiling Nadine turns to the Good Morning Britain host and says: "Looks lovely, Kate."
Kate confesses: "Looks like a strawberry milkshake. I don't think it's going to taste like one."
I'm A Celeb host Ant reveals that the drinks they will have to down are blended pigs' brains.
 Don't worry about ti just finish them."
Kate jokes: "I thought our first drink together would be so different."
While the Girls aloud singer adds: "Hope our second drink is better."
The race to finish the vile concoction begins on the klaxon - and Kate gives a steely gaze as she struggles to swallow the brains.
Who will win out of Kate and Nadine?
* I'm A Celebrity...Get Me Out Of Here! airs on ITV at 9pm


We aggregate services!
- optimize holistic content
- extend scalable experiences
- evolve cutting-edge technologies
- grow extensible networks
- strategize transparent content
- extend leading-edge supply-chains
- morph leading-edge systems
- e-enable vertical paradigms


This page is password protected. Please enter your username and password.
This is part of HTML Secure by Pius Ladenburger


Class Debug
Core debug tools - printing any value by var_dump(); in fixed bar at browser window right bottom border - timing printing - debuging shortcut functions initialization - exceptions hdd logging or printing in development mode
Direct known subclasses
MvcCore\Ext\Debug\Tracy
public static
|
|
protected static
|
|
protected static
|
#
initLogDirectory( string $logDirectory )
If log directory doesn't exist, create new directory - relative from app root. |
public static
float
|
|
public static
mixed
|
|
public static
mixed
|
|
public static
string
|
|
public static
boolean
|
|
public static
|
|
public static
|
|
protected static
float
|
|
protected static
string
|
#
dumpHandler( mixed $var, string $title = NULL, array $options = array() )
Dump any variable into string throw output buffering, store result for printing later. Return printed variable string. |
protected static
|
#
exceptionHandler(
Exception printing for development, logging for production. |
string |
DEBUG
|
#
'debug'
|
string |
INFO
|
#
'info'
|
string |
WARNING
|
#
'warning'
|
string |
ERROR
|
#
'error'
|
string |
EXCEPTION
|
#
'exception'
|
string |
CRITICAL
|
#
'critical'
|
string |
JAVASCRIPT
|
#
'javascript'
|
public static
string
|
$EmailRecepient
Email recepient to send information about exceptions or errors. 'admin@localhost' by default. |
#
'admin@localhost'
|
public static
mixed
|
$LogDirectory
Relative path from app root to store any log information. '/Var/Logs' by default. |
#
'/Var/Logs'
|
protected static
boolean
|
$development
Semaphore to execute Init(); method only one time. TRUE if development, FALSE if anything else |
#
NULL
|
protected static
array
|
$handlers
Debuging and loging handlers, this shoud be customized in extended class. |
#
array(
'timer' => 'timerHandler',
'dump' => 'dumpHandler',
'barDump' => 'dumpHandler',
'log' => 'dumpHandler',
'fireLog' => 'dumpHandler',
'exceptionHandler' => 'exceptionHandler',
'shutdownHandler' => 'ShutdownHandler',
)
|
protected static
array
|
$dumps
Store for printed dumps by output buffering to send it at response end. |
#
array()
|
protected static
array
|
$timers
Store timers start points. |
#
array()
|
protected static
boolean
|
$originalDebugClass
True for cofigured debug class as \MvcCore\Debug, FALSE for any other configured extension |
#
TRUE
|
public static
callable
|
$InitGlobalShortHands
Initialize global development shorthands. |
#
array()
|


Oh, would you look at that! A 404 page!
This means, that the page you are looking for does not exists.
Click here
...to go back to the Home Page


An Autonomous Swarm of Micro Flying Robots with Range-based Relative Localization
- Shushuai Li
- Mario Coppola
- Christophe De Wagter
- Guido C. H. E. de Croon
- Micro Air Vehicle Laboratory
- Delft University of Technology
This work proposes an autonomous 3D multi-robot system without external GPS or motion capture systems.
The relative position and bearing between any two flying robots are estimated by an onboard EKF,
in which the inputs come from sensory information (velocity, yaw rate, height, and ranging from Ultra wide-band sensor).
Experiments are conducted on 5 Crazyflie quadrotors, including formation flights, and leader-follower flights through a window.
Real-world flights
Innovations
- An autonomous relative localization implemented on multiple nano (33 grams) flying robots with fully onboard perception.
- Localization convergence analysis for both random initialization maneuvers and unobservable maneuvers.
- Robust and fast communication rules that allow for a high-speed estimation update.
- Automatic initialization procedure for dealing with large unknown initial state errors.
Getting started with Crazyflie quadrotors off-the-shelf
- Set the address of each crazyflie ending by E5, E6, E7, ...
- Download source code and checkout the swarm branch.
- Set the NUM_CFs in lpsTwrTag.h to the actual number of crazyflies.
- In cfclient, connect to 'E5' crazyflie, and set keep_flying to 1.
In the leader-follower test, the leader Crazyflie is equipped with a monocular camera for autonomous flight.
Simulation
Simulation code is built with Python, in which any number of robots can be simulated to validate the proposed relative localization method.


A customer service representative will reply and help you schedule your cleaning
A car cleaning professional will come to your car's location and get to work.
You're good to go. Enjoy your ride :)
You're busy, we get it. That's why we've re-invented the traditional car washing and detailing experience. How? We've eliminated it, so that busy individuals such as yourself can maintain a professional appearance, while having the satisfaction of saving approximately 100 gallons of water with every wash or detail.
Your vehicle is not only your investment and personal property, it’s part of who you are. Our trusted professionals care for each vehicle with the utmost attention, to make sure your car looks its best. Our process does not include any aggressive brushing or buffing, the way traditional car washes work. Instead, our non-invasive process gently removes dirt and impurities from your paint and onto our microfiber fabric leaving behind a perfect finish. We not only focus on the presentation of your car, but the preservation of it as well.
Give us a call, text, or email and we will get back to you as soon as possible.


{% import 'shared/_forms.html' as forms %} {% extends 'layouts/base.html' %} {% block main_content %}
Sign in


Menu
Home
About Me
Photo
Project
Practice
Presenting Our Affinity Wall
Innovative Investment Main Page
MyHero Login Page
Interaction Practice


webgl visualizer prototype
Play song "Stories from Emona VI" (2008) by MAYA FILIPI? from jamendo.com
GPU particle system plugin by
Charlie Hoey


The WAKS Utility is a program provided in the development package to transfer data files between the development computer and a server.
It relies on special commands on the server. To prevent illegal access the SuperUser userid and password must be provided with each invocation.
There are two versions of the program. The first, written in Java, should be used to access the GAE Servers. The second, written in Node.js, should be used to access the Node.js Servers. The reason for this is that in spite of the fact the command set is indentical there is an underlying incompatibility in the headers sent automatically be the respective language support code that was not productive to troubleshoot.
The waks.bat
utility determines which version is being accessed and uses the appropriate version of the program.
WAKS.bat
command file was replaced with an equivalent for the host operating system.WAKS.bat
URLs
Two URLs are coded inside the WAKS.bat
file. The first is the local server address used when the WAKS
command does not contain the prod prefix.
For the Java Variant this is set to localhost:8882
.
For the Node.js Variant this is set to localhost:8888
.
These are set inside server start files run-ws.bat
and run-tri.bat
for the Java Variant and Node.js Variant respectively.
If they are changed in the server startup .bat file they should be changed in the waks.bat
file also.
The second is the production URL set with the waks site
command. This also determines which variant of the WAKS
utility to use.
This second URL is used when the WAKS
command contains the prod prefix.
Keys on the server use an '*' as part 1 of the key for User records and the '/' character as a separator between each part.
These are converted into a '$' and '-' respectivly when the Key is used to derive the file name on the local file system. In addition the '.json.txt' string is added to the file name.
These transformations are handled automatically by the WAKS
utility program.
WAKS.bat
Options
The very latest options can be seen by typing WAKS
with no options.
A number of settings needs to be established. They are stored in environment variables. Keywords, set, dir and site are used to trigger their respective values.
WAKS set cust user password
This establishes the application ID and the SuperUser ID and password. If your computer is shared set this to nulls afterwards so that the SuperUser credentials are not compromised. An application ID of '$' is used to access the User records.
WAKS dir dirname
This establishes the working directory where files are shipped from and fetched into.
WAKS site site-type site-prefix
This establishes the URL used when the prod prefix is used in the fetch
and ship
access commands. The site-type
should be gae
to access the GAE Site
and jitsu
to access the NodeJitsu Site. If you host at a different site then modify waks.bat
by adding another site-type
.
The site-prefix
is the ID you have registered with the respective hosting site used to connect to your application.
WAKS [prod] type name [-r]
where
prod
if entered causes the production URL to be used.
type
the file type to fetch. A % value will cause all types to be fetched.
name
the 3rd part of the key. A value of % will cause all files for type
to be fetched.
-r
If entered causes the local files to be replaced by the copy from the server. Use with caution
WAKS [prod] ship type name [-r]
where
prod
if entered causes the production URL to be used.
ship
Entered as ship to trigger the shipping of files rather than the fetching of files.
type
the file type to ship. A % value will cause all types to be shipped.
name
the 3rd part of the key. A value of % will cause all files for type
to be shipped.
-r
If entered causes the local files to be replace the server versions. Use with caution
type
and name
parameters
A value of % causes all instances of that qualifier to be processed.
The type
and name
values can be partially qualified. That is, a name
value of xxx%
would match
keys whose 3rd part begins with xxx
.
If type
contains a % the name parameter is required but its value is ignored. This is because the type qualifier
precedes the name qualifier in the key.
WAKS
Internal Options
The very latest internal options can be seen by typing WAKS
with no options. The section at the end titled WAKS Parameters
describes the internal WAKS
program options
used by the waks.bat
utility.
WAKS Parameters: -h Generate this Help Information that you are now reading -file dir Work Directory (mandatory) -url url URL of app server (mandatory) -cust cust Cust part of key (mandatory) -user user SuperUser id (mandatory) -pw password SuperUser password (mandatory) -type type Type part of key (2nd part) (mandatory) -name name Name part of key (3rd part) (mandatory) -ship Ship mode, else read -v Verbose mode -r Replace components. ***DANGEROUS***
These options are generated by the WAKS.bat
command file are are included here for reference.


About the Game Maker
Candy Road is made by Roadkill.
About the Candy Road Game
Go on an epic adventure and flap across the road in this endless arcade flapping game. Flap past more than 180 unique and ruthless vehicles, collect superpowers to DEMOLISH them, and embrace the adrenaline rush of flying through worlds like Mysterious Forest, Hot Desert, Charming Oasis, Bustling City, Winter Wonderland, Fairyland, Candy World, and Donut Kingdom as one of the cute and exotic characters!
Embark on your flying road crossing adventure alone or with friends to see who can get the top score!
Candy Road features: ● Munch away at the delicious candy power-ups: Juicy Jellybean, Crunchy Chocolate, Lip-Smacking Lollipop and more! ● Unlock and play as one of the 50+ delightful and lovable characters ● Collect yummy waffles to catch and unlock a character from the fun UFO claw machine! ● Dodge and weave to avoid cars, trucks, tanks, buses, ice cream truck and other vehicles ● Find hidden characters in game ● Play in the Donut Kingdom and avoid the rolling donuts! ● Collect gifts and waffles from the erupting giftbox ● Post your highscore on the Leaderboard What else? Play now and find out! And tell your friends before they tell you! Follow us to get news and updates: instagram.com/CandyRoadGame facebook.com/CandyRoad twitter.com/CandyRoadGame candyroad.co roadkill.co


Who Framed Roger Rabbit (1988) Rating: * * * * (out of 4) Reviewed by George Lau
Cast: Bob Hoskins, Christopher Lloyd, Joanna Cassidy, Charles Fleischer, Stubby Kaye and Alan Tilvern Director: Robert Zemekis Producer: Robert Watts and Frank Marshall Screenplay: Jeffrey Price and Peter Seaman based on the book, "Who Censored Roger Rabbit?" by Gary K. Wolf Director of Animation: Richard Williams Cinematography: Dean Cundey Music: Alan Silvestri Running Time: 103 minutes MPAA Rating: PG
Having not seen, "Who Framed Roger Rabbit" in over 10 years, and not remembering much besides that I liked it then, I decided to rent it recently. Watching it I was struck by just how brilliant a film it is. Aside from the fact that it's a milestone in animation in movies (it's the first film to combine real actors and cartoon characters, have them interact, and make it convincingly real) and a great entertainment it's also quite an effective comedy/mystery. While the plot may be somewhat familiar the characters are original, especially Baby Herman, and watching them together is a lot of fun.
The story begins in Hollywood in 1947. Cartoon star Roger Rabbit is blowing takes and having trouble keeping his mind on work, so hard-boiled private detective Eddie Valiant (Bob Hoskins) is called in by studio head R.K. Maroon (Alan Tilvern) to try to help get Roger's mind back on work. Maroon thinks that Roger's wife, Jessica's, possible unfaithfulness to him might be the cause of distraction and tells Eddie to get some photos of her in the act before it costs him any more money in reshoots.
Valiant takes some photos of Jessica playing, `patty cake' with Marvin Acme (Stubby Kaye), the owner of Toontown (where all of the cartoon characters live) and takes them to Maroon. Upon seeing them, Roger is emotionally destroyed and soon after Acme is found dead and Roger Rabbit is the prime suspect.
The rest of the movie follows Valiant and Roger as they run around town (and eventually Toontown) trying to clear Roger's good name. Along the way they meet Judge Doom (Christopher Lloyd) a judge-jury-and executioner type who's out to get Roger and has discovered the one and only way to kill a `toon.'
`Who Framed Roger Rabbit' won 4 Academy Awards including a Special Achievement Award for Richard Williams for animation direction and creation of the cartoon characters (Williams and his teams went through the film frame by frame and hand drew the cartoon characters in). Director Robert Zemekis must be given an equal amount of praise for overseeing the entire production, which included hundreds of animators. Also Bob Hoskins' performance should be credited. He, in addition to the rest of the human cast, finds the right note to play in all of the scenes with his cartoon co-stars. According to The Internet Movie Database, Hoskins studied his young daughter to learn how to act with imaginary characters and I guess his hard work paid off.
`Who Framed Roger Rabbit' is a rare film. One that not only presented a great challenge to the filmmakers but one that can be enjoyed by the whole family (although some very young viewers may be a little scared by Judge Doom). Do yourself a favor and rent it, `P-p-p-p-please."
Copyright 1999 George Lau
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


Welcome to the good burger, home of the Good Burger. We can assure you the taste of feeling full with our special burgers and shakes. HAPPY TUMMY :).


PLUNDER ROAD (director: Hubert Cornfield; screenwriters: Steven Ritch/Jack Charney/from an unpublished story by Ritch; cinematographer: Ernest Haller; editors: Warren Adams/Jerry Young; cast: Gene Raymond (Eddie), Jeanne Cooper (Fran), Wayne Morris (Commando), Elisha Cook, Jr. (Skeets), Stafford Repp (Roly Adams), Steven Ritch (Frankie), Nora Hayden (Hazel); Runtime: 72; 20th Century Fox; 1957)
Reviewed by Dennis Schwartz
A great low-budget heist film noir. In a remote part of Utah a gang robs a train heading for San Francisco with $10,000 million in gold. They overcome the train by blocking it, then using tear gas to overcome the motorman, and while wearing white stockings to cover their faces they remove the gold mint onto their truck.
The gang members are: Eddie, the college educated leader and brains behind the operation who is pulling off his first job; Skeets, who just got released from jail and is despondent because his wife died, as he now plans to take his teenage son to Rio to live in luxury; Frankie, a race car driver barred from racing for life because he failed to follow the track rules during a race; Commando, a happy-go-lucky bachelor who works as a stuntman; and Roly a regular truck driver with a chewing gum habit.
The plan is to travel in three different trucks: a furniture moving van, a truck carrying coffee, and a chemical tanker. They are separated by thirty minute intervals, with the gold split in each truck and hidden, as they plan to reach Los Angeles and melt the gold into the fenders of the three cars they purchased under false names. They will then load them onto a boat they will board to take them to Lisbon.
Roly leaves first carrying the furniture, but he panics at a roadblock when the cop spots he hasn't turned off his police radio on his truck. He's killed when he tries to make a run for it. The next truck loaded with coffee, driven by Commando and Skeets, is nailed at the weighing station. Commando had just killed a gas attendant in Nevada when he dropped his gun and panicked by killing the old man. Eddie and Frankie get a close call at the weighing station but they are the only ones to reach LA. Fran, Eddie's girlfriend, meets them at a foundry where they melt down the gold and put it into the car bumpers and chrome.
Warning: spoiler to follow in next paragraph.
The next morning, on their way to the boat, they get into a fender bender on the crowded freeway as a woman driver gawking at a traffic accident rams them and when the police try to separate the cars the chrome becomes loose revealing the gold.
 Perennial losers in filmdom, Elisha Cook, Jr. and Stafford Repp, fit right in to this plot. It made for a very entertaining film.
REVIEWED ON 9/10/2001 GRADE: B
Dennis Schwartz: "Ozus' World Movie Reviews"
http://www.sover.net/~ozus
<EMAIL_ADDRESS>© ALL RIGHTS RESERVED DENNIS SCHWARTZ
========== X-RAMR-ID: 29429 X-Language: en X-RT-SourceID: 873 X-RT-AuthorID: 1315 X-RT-RatingText: B
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


Use Testnet:
Action Type: all Issue badge Cancel badge Update badge (by issuer) Update badge (by badgee) Reject badge (by badgee)
Show cancelled badges: Show badgee names only: Show extra details:


Welcome to Android 4.0!
Android 4.0 delivers a refined, unified UI for phones and tablets and introduces innovative features for users and developers. This document provides a glimpse of the many new features and technologies that make Android 4.0 simple, beautiful, and beyond smart.
Android 4.0 for Users
Simple, beautiful, beyond smart
Android 4.0 builds on the things people love most about Android — easy multitasking, rich notifications, customizable home screens, resizable widgets, and deep interactivity — and adds powerful new ways of communicating and sharing.
Refined, evolved UI
Focused on bringing the power of Android to the surface, Android 4.0 makes common actions more visible and lets users navigate with simple, intuitive gestures. Refined animations and feedback throughout the system make interactions engaging and interesting. An entirely new typeface optimized for high-resolution screens improves readability and brings a polished, modern feel to the user interface.
Virtual buttons in the System Bar let users navigate instantly to Back, Home, and Recent Apps. The System Bar and virtual buttons are present across all apps, but can be dimmed by applications for full-screen viewing. Users can access each application's contextual options in the Action Bar, displayed at the top (and sometimes also at the bottom) of the screen.
Multitasking is a key strength of Android and it's made even easier and more visual on Android 4.0. The Recent Apps button lets users jump instantly from one task to another using the list in the System Bar. The list pops up to show thumbnail images of apps used recently — tapping a thumbnail switches to the app.
Rich and interactive notifications let users keep in constant touch with incoming messages, play music tracks, see real-time updates from apps, and much more. On smaller-screen devices, notifications appear at the top of the screen, while on larger-screen devices they appear in the System Bar.
Home screen folders and favorites tray
New home screen folders offer a new way for users to group their apps and shortcuts logically, just by dragging one onto another. Also, in All Apps launcher, users can now simply drag an app to get information about it or immediately uninstall it, or disable a pre-installed app.
On smaller-screen devices, the home screen now includes a customizable favorites tray visible from all home screens. Users can drag apps, shortcuts, folders, and other priority items in or out of the favorites tray for instant access from any home screen.
Resizable widgets
Home screens in Android 4.0 are designed to be content-rich and customizable. Users can do much more than add shortcuts — they can embed live application content directly through interactive widgets. Widgets let users check email, flip through a calendar, play music, check social streams, and more — right from the home screen, without having to launch apps. Widgets are resizable, so users can expand them to show more content or shrink them to save space.
New lock screen actions
The lock screens now let users do more without unlocking. From the slide lock screen, users can jump directly to the camera for a picture or pull down the notifications window to check for messages. When listening to music, users can even manage music tracks and see album art.
Quick responses for incoming calls
When an incoming call arrives, users can now quickly respond by text message, without needing to pick up the call or unlock the device. On the incoming call screen, users simply slide a control to see a list of text responses and then tap to send and end the call. Users can add their own responses and manage the list from the Settings app.
Swipe to dismiss notifications, tasks, and browser tabs
Android 4.0 makes managing notifications, recent apps, and browser tabs even easier. Users can now dismiss individual notifications, apps from the Recent Apps list, and browser tabs with a simple swipe of a finger.
Improved text input and spell-checking
The soft keyboard in Android 4.0 makes text input even faster and more accurate. Error correction and word suggestion are improved through a new set of default dictionaries and more accurate heuristics for handling cases such as double-typed characters, skipped letters, and omitted spaces. Word suggestion is also improved and the suggestion strip is simplified to show only three words at a time.
To fix misspelled words more easily, Android 4.0 adds a spell-checker that locates and underlines errors and suggests replacement words. With one tap, users can choose from multiple spelling suggestions, delete a word, or add it to the dictionary. Users can even tap to see replacement suggestions for words that are spelled correctly. For specialized features or additional languages, users can now download and install third-party dictionaries, spell-checkers, and other text services.
Powerful voice input engine
Android 4.0 introduces a powerful new voice input engine that offers a continuous "open microphone" experience and streaming voice recognition. The new voice input engine lets users dictate the text they want, for as long as they want, using the language they want. Users can speak continously for a prolonged time, even pausing for intervals if needed, and dictate punctuation to create correct sentences. As the voice input engine enters text, it underlines possible dictation errors in gray. After dictating, users can tap the underlined words to quickly replace them from a list of suggestions.
Control over network data
Mobile devices can make extensive use of network data for streaming content, synchronizing data, downloading apps, and more. To meet the needs of users with tiered or metered data plans, Android 4.0 adds new controls for managing network data usage.
In the Settings app, colorful charts show the total data usage on each network type (mobile or Wi-Fi), as well as amount of data used by each running application. Based on their data plans, users can optionally set warning levels or hard limits on data usage or disable mobile data altogether. Users can also manage the background data used by individual applications as needed.
Designed for accessibility
A variety of new features greatly enhance the accessibility of Android 4.0 for blind or visually impaired users. Most important is a new explore-by-touch mode that lets users navigate without having to see the screen. Touching the screen once triggers audible feedback that identifies the UI component below; a second touch in the same component activates it with a full touch event. The new mode is especially important to support users on new devices that use virtual buttons in the System Bar, rather than dedicated hardware buttons or trackballs. Also, standard apps are updated to offer an improved accessibility experience. The Browser supports a script-based screen reader for reading favorite web content and navigating sites. For improved readability, users can also increase the default font size used across the system.
The accessibility experience begins at first setup — a simple touch gesture during setup (clockwise square from upper left) activates all accessibility features and loads a setup tutorial. Once accessibility features are active, everything visible on the screen can be spoken aloud by the standard screen reader.
Communication and sharing
Designed for the way people live, Android 4.0 integrates rich social communication and sharing touchpoints across the system, making it easy to talk, email, text, and share.
People and profiles
Throughout the system, a user’s social groups, profiles, and contacts are linked together and integrated for easy accessibility. At the center is a new People app that offers richer profile information, including a large profile picture, phone numbers, addresses and accounts, status updates, events, stream items, and a new button for connecting on integrated social networks.
The user's own contact information is stored in a new "Me" profile, allowing easier sharing with apps and people. All of the user's integrated contacts are displayed in an easy to manage list, including controls over which contacts are shown from any integrated account or social network. Wherever the user navigates across the system, tapping a profile photo displays Quick Contacts, with large profile pictures, shortcuts to phone numbers, text messaging, and more.
Unified calendar, visual voicemail
To help organize appointments and events, an updated Calendar app brings together personal, work, school, and social agendas. With user permission, other applications can contribute events to the calendar and manage reminders, for an integrated view across multiple calendar providers. The app is redesigned to let users manage events more easily. Calendars are color-coded and users can swipe left or right to change dates and pinch to zoom in or out agendas.
In the phone app, a new visual voicemail features integrates incoming messages, voice transcriptions, and audio files from one or more providers. Third-party applications can integrate with the Phone app to add their own voice messages, transcriptions, and more to the visual voicemail inbox.
Rich and versatile camera capabilities
The Camera app includes many new features that let users capture special moments with great photos and videos. After capturing images, they can edit and share them easily with friends.
When taking pictures, continuous focus, zero shutter lag exposure, and decreased shot-to-shot speed help capture clear, precise images. Stabilized image zoom lets users compose photos and video in the way they want, including while video is recording. For new flexibility and convenience while shooting video, users can now take snapshots at full video resolution just by tapping the screen as video continues to record.
To make it easier to take great pictures of people, built-in face detection locates faces in the frame and automatically sets focus. For more control, users can tap to focus anywhere in the preview image.
For capturing larger scenes, the Camera introduces a single-motion panorama mode. In this mode, the user starts an exposure and then slowly turns the Camera to encompass as wide a perspective as needed. The Camera assembles the full range of continuous imagery into a single panoramic photo.
After taking a picture or video, users can quickly share it by email, text message, bluetooth, social networks, and more, just by tapping the thumbnail in the camera controls.
Redesigned Gallery app with photo editor
The Gallery app now makes it easier to manage, show, and share photos and videos. For managing collections, a redesigned album layout shows many more albums and offers larger thumbnails. There are many ways to sort albums, including by time, location, people, and tags. To help pictures look their best, the Gallery now includes a powerful photo editor. Users can crop and rotate pictures, set levels, remove red eyes, add effects, and much more. After retouching, users can select one or multiple pictures or videos to share instantly over email, text messaging, bluetooth, social networks, or other apps.
An improved Picture Gallery widget lets users look at pictures directly on their home screen. The widget can display pictures from a selected album, shuffle pictures from all albums, or show a single image. After adding the widget to the home screen, users can flick through the photo stacks to locate the image they want, then tap to load it in Gallery.
Live Effects for transforming video
Live Effects is a collection of graphical transformations that add interest and fun to videos captured in the Camera app. For example, users can change the background behind them to any stock or custom image, for just the right setting when shooting videeo. Also available for video is Silly Faces, a set of morphing effects that use state-of-the-art face recognition and GPU filters to transform facial features. For example, you can use effects such as small eyes, big mouth, big nose, face squeeze, and more. Outside of the Camera app, Live Effects is available during video chat in the Google Talk app.
Sharing with screenshots
Users can now share what's on their screens more easily by taking screenshots. Hardware buttons let them snap a screenshot and store it locally. Afterward, they can view, edit, and share the screen shot in Gallery or a similar app.
Cloud-connected experience
Android has always been cloud-connected, letting users browse the web and sync photos, apps, games, email, and contacts — wherever they are and across all of their devices. Android 4.0 adds new browsing and email capabilities to let users take even more with them and keep communication organized.
Powerful web browsing
The Android Browser offers an experience that’s as rich and convenient as a desktop browser. It lets users instantly sync and manage Google Chrome bookmarks from all of their accounts, jump to their favorite content faster, and even save it for reading later in case there's no network available.
To get the most out of web content, users can now request full desktop versions of web sites, rather than their mobile versions. Users can set their preference for web sites separately for each browser tab. For longer content, users can save a copy for offline reading. To find and open saved pages, users can browse a visual list that’s included with browser bookmarks and history. For better readability and accessibility, users can increase the browser’s zoom levels and override the system default text sizes.
Across all types of content, the Android Browser offers dramatically improved page rendering performance through updated versions of the WebKit core and the V8 Crankshaft compilation engine for JavaScript. In benchmarks run on a Nexus S device, the Android 4.0 browser showed an improvement of nearly 220% over the Android 2.3 browser in the V8 Benchmark Suite and more than 35% in the SunSpider 9.1 JavaScript Benchmark. When run on a Galaxy Nexus device, the Android 4.0 browser showed improvement of nearly 550% in the V8 benchmark and nearly 70% in the SunSpider benchmark.
Improved email
In Android 4.0, email is easier to send, read, and manage. For composing email, improved auto-completion of recipients helps with finding and adding frequent contacts more quickly. For easier input of frequent text, users can now create quick responses and store them in the app, then enter them from a convenient menu when composing. When replying to a message, users can now toggle the message to Reply All and Forward without changing screens.
For easier browsing across accounts and labels, the app adds an integrated menu of accounts and recent labels. To help users locate and organize IMAP and Exchange email, the Email app now supports nested mail subfolders, each with synchronization rules. Users can also search across folders on the server, for faster results.
For enterprises, the Email app supports EAS v14. It supports EAS certificate authentication, provides ABQ strings for device type and mode, and allows automatic sync to be disabled while roaming. Administrators can also limit attachment size or disable attachments.
For keeping track of incoming email more easily, a resizable Email widget lets users flick through recent email right from the home screen, then jump into the Email app to compose or reply.
Innovation
Android is continously driving innovation forward, pushing the boundaries of communication and sharing with new capabilities and interactions.
Android Beam for NFC-based sharing
Android Beam is an innovative, convenient feature for sharing across two NFC-enabled devices, It lets people instantly exchange favorite apps, contacts, music, videos — almost anything. It’s incredibly simple and convenient to use — there’s no menu to open, application to launch, or pairing needed. Just touch one Android-powered phone to another, then tap to send.
For sharing apps, Android Beam pushes a link to the app's details page in Google Play. On the other device, the Google Play client app launches and loads the details page, for easy downloading of the app. Individual apps can build on Android Beam to add other types of interactions, such as passing game scores, initiating a multiplayer game or chat, and more.
Face Unlock
Android 4.0 introduces a completely new approach to securing a device, making each person's device even more personal — Face Unlock is a new screen-lock option that lets users unlock their devices with their faces. It takes advantage of the device front-facing camera and state-of-the-art facial recognition technology to register a face during setup and then to recognize it again when unlocking the device. Users just hold their devices in front of their faces to unlock, or use a backup PIN or pattern.
Wi-Fi P2P and Bluetooth HDP
Support for Wi-Fi peer-to-peer (P2P) lets users connect directly to nearby peer devices over Wi-Fi, for more reliable, higher-speed communication (in compliance with the Wi-Fi Alliance's Wi-Fi Direct™ certification program). No internet connection or tethering is needed. Through third-party apps, users can connect to compatible devices to take advantage of new features such as instant sharing of files, photos, or other media; streaming video or audio from another device; or connecting to compatible printers or other devices.
Android 4.0 also introduces built-in support for connecting to Bluetooth Health Device Profile (HDP) devices. With support from third-party apps, users can connect to wireless medical devices and sensors in hospitals, fitness centers, homes, and elsewhere.
New Developer Features
Unified UI framework for phones, tablets, and more
Android 4.0 brings a unified UI framework that lets developers create elegant, innovative apps for phones, tablets, and more. It includes all of the familiar Android 3.x interface elements and APIs — fragments, content loaders, Action Bar, rich notifications, resizable home screen widgets, and more — as well as new elements and APIs.
For developers, the unified UI framework in Android 4.0 means new UI tools, consistent design practices, simplified code and resources, and streamlined development across the range of Android-powered devices.
Key Honeycomb developer features,
now for phones too
Core UI
- Fragments and content loaders
- Resizeable home screen widgets
- Rich notifications
- Multi-selection, drag-drop, clipboard
- Improved screen-support API
- Hardware-accelerated 2D graphics
Graphics and animation
- Property-based animation
- Renderscript 3D graphics
Media and connectivity
- HTTP Live streaming
- Bluetooth A2DP and HSP devices
- Support for RTP
- MTP/PTP file transfer
- DRM framework
- Input from keyboard, mouse, gamepad, joystick
Enterprise
- Full device encryption
- DPM policies for encrypted storage and passwords
Communication and sharing
Android 4.0 extends social and sharing features to any application on the device. Applications can integrate contacts, profile data, stream items, and calendar events from any of the user’s activities or social networks.
Social API
A shared social provider and API provide a new unified store for contacts, profile data, stream items, and photos. Any app or social network with user permission can contribute raw contacts and make them accessible to other apps and networks. Applications with user permission can also read profile data from the provider and display it in their applications.
The social API lets applications store standard contact data as well as new types of content for any given contact, including large profile photos, stream items, and recent activity feedback. Recent activity feedback is a standard way for applications to “tag” a contact with common activity, such as when the user calls the contact or sends an email or SMS message. The social provider uses the recent activity feedback as a new signal in ranking, such as for name auto-complete, to keep the most relevant contacts ranked closest to the top.
Applications can also let users set up a social connection to a contact from the People app. When the user touches Add Connection in a contact, the app sends a public intent that other apps can handle, displaying any UI needed to create the social connection.
Building on the social API, developers can add powerful new interactions that span multiple social networks and contacts sources.
Calendar API
A shared calendar content provider and framework API make it easier for developers to add calendar services to their apps.
With user permission, any application can add events to the shared database and manage dates, attendees, alerts, and reminders. Applications can also read entries from the database, including events contributed by other applications, and handle the display of event alerts and reminders. Using the calendar provider, applications can take advantage of event data sourced from a variety of apps and protocols, to offer innovative ways of viewing and managing a user’s events. Apps can also use calendar data to improve the relevance of their other content.
For lighter-weight access to calendar services, the Calendar app defines a set of public Intents for creating, viewing, and editing events. Rather than needing to implement a calendar UI and integrate directly with the calendar provider, applications can simply broadcast calendar Intents. When the Calendar app receives the Intents, it launches the appropriate UI and stores any event data entered. Using calendar Intents, for example, apps can let users add events directly from lists, dialogs, or home screen widgets, such as for making restaurant reservations or booking time with friends.
Visual voicemail API
A shared Voicemail provider and API allow developers to build applications that contribute to a unified voicemail store. Voicemails are displayed and played in the call log tab of the platform’s Phone app.
Android Beam
Android Beam is an NFC-based feature that lets users instantly share information about the apps they are using, just by touching two NFC-enabled phones together. When the devices are in range — within a few centimeters — the system sets up an NFC connection and displays a sharing UI. To share whatever they are viewing with the other device, users just touch the screen.
For developers, Android Beam is a new way of triggering almost any type of proximity-based interaction. For example, it can let users instantly exchange contacts, set up multiplayer gaming, join a chat or video call, share a photo or video, and more. The system provides the low-level NFC support and the sharing UI, while the foreground app provides lightweight data to transfer to the other device. Developers have complete control over the data that is shared and how it is handled, so almost any interaction is possible. For larger payloads, developers can even use Android Beam to initiate a connection and transfer the data over Bluetooth, without the need for user-visible pairing.
Even if developers do not add custom interactions based on Android Beam they can still benefit from it being deeply integrated into Android. By default the system shares the app’s Google Play URL, so it’s easy for the user to download or purchase the app right away.
Modular sharing widget
The UI framework includes a new widget, ShareActionProvider, that lets developers quickly embed standard share functionality and UI in the Action Bar of their applications. Developers simply add ShareActionProvider to the menu and set an intent that describes the desired sharing action. The system handles the rest, building up the list of applications that can handle the share intent and dispatching the intent when the user chooses from the menu.
New media capabilities
Low-level streaming multimedia
Android 4.0 provides a direct, efficient path for low-level streaming multimedia. The new path is ideal for applications that need to maintain complete control over media data before passing it to the platform for presentation. For example, media applications can now retrieve data from any source, apply proprietary encryption/decryption, and then send the data to the platform for display.
Applications can now send processed data to the platform as a multiplexed stream of audio/video content in MPEG-2 transport stream format. The platform de-muxes, decodes, and renders the content. The audio track is rendered to the active audio device, while the video track is rendered to either a Surface or a SurfaceTexture. When rendering to a SurfaceTexture, the application can apply subsequent graphics effects to each frame using OpenGL.
To support this low-level streaming, the platform introduces a new native API based on Khronos OpenMAX AL 1.0.1. The API is implemented on the same underlying services as the platform’s existing OpenSL ES API, so developers can make use of both APIs together if needed. Tools support for low-level streaming multimedia will be available in an upcoming release of the Android NDK.
New camera capabilities
Developers can take advantage of a variety of new camera features in Android 4.0. ZSL exposure, continuous focus, and image zoom let apps capture better still and video images, including during video capture. Apps can even capture full-resolution snapshots while shooting video. Apps can now set custom metering regions in a camera preview, then manage white balance and exposure dynamically for those regions. For easier focusing and image processing, a face-detection service identifies and tracks faces in a preview and returns their screen coordinates.
Media effects for transforming images and video
A set of high-performance transformation filters let developers apply rich effects to any image passed as an OpenGL ES 2.0 texture. Developers can adjust color levels and brightness, change backgrounds, sharpen, crop, rotate, add lens distortion, and apply other effects. The transformations are processed by the GPU, so they are fast enough for processing image frames loaded from disk, camera, or video stream.
Audio remote controls
Android 4.0 adds a new audio remote control API that lets media applications integrate with playback controls that are displayed in a remote view. Media applications can integrate with a remote music playback control that’s built into in the platform’s lock screen, allowing users to control song selection and playback without having to unlock and navigate to the music app.
Using the audio remote control API, any music or media app can register to receive media button events from the remote control and then manage play state accordingly. The application can also supply metadata to the remote control, such as album art or image, play state, track number and description, duration, genre, and more.
New media codecs and containers
Android 4.0 adds support for additional media types and containers to give developers access to the formats they need. For high-quality compressed images, the media framework adds support for WebP content. For video, the framework now supports streaming VP8 content. For streaming multimedia, the framework supports HTTP Live streaming protocol version 3 and encoding of ADTS-contained AAC content. Additionally, developers can now use Matroska containers for Vorbis and VP8 content.
New types of connectivity
Wi-Fi P2P
Developers can use a framework API to discover and connect directly to nearby devices over a high-performance, secure Wi-Fi peer-to-peer (P2P) connection. No internet connection or hotspot is needed. Android's Wi-Fi P2P framework complies with the Wi-Fi Alliance's Wi-Fi Direct™ certification program.
Wi-Fi peer-to-peer (P2P) opens new opportunities for developers to add innovative features to their applications. Applications can use Wi-Fi P2P to share files, photos, or other media between devices or between a desktop computer and an Android-powered device. Applications could also use Wi-Fi P2P to stream media content from a peer device such as a digital television or audio player, connect a group of users for gaming, print files, and more.
Bluetooth Health Device Profile (HDP)
Developers can now build powerful medical applications that use Bluetooth to communicate with wireless devices and sensors in hospitals, fitness centers, homes, and elsewhere. Applications can collect and manage data from HDP source devices and transmit it to backend medical applications such as records systems, data analysis services, and others.
Using a framework API, applications can use Bluetooth to discover nearby devices, establish reliable or streaming data channels, and manage data transmission. Applications can supply any IEEE 11073 Manager to retrieve and interpret health data from Continua-certified devices such as heart-rate monitors, blood meters, thermometers, and scales.
New UI components and capabilities
Layout enhancements
A new layout, GridLayout, improves the performance of Android applications by supporting flatter view hierarchies that are faster to layout and render. Because hierarchies are flatter, developers can also manage alignments between components that are visually related to each other even when they are not logically related, for precise control over application UI. GridLayout is also specifically designed to be configured by drag-and-drop design tools such as the ADT Plug-in for Eclipse.
OpenGL ES texture views
A new TextureView object lets developers directly integrate OpenGL ES textures as rendering targets in a UI hierarchy. The object lets developers display and manipulate OpenGL ES rendering just as they would a normal view object in the hierarchy, including moving, transforming, and animating the view as needed. The TextureView object makes it easy for developers to embed camera preview, decoded video, OpenGL game scenes, and more. TextureView can be viewed as a more powerful version of the existing SurfaceView object, since it offers the same benefits of access to a GL rendering surface, with the added advantage of having that surface participate fully in the normal view hierarchy.
Hardware-accelerated 2D drawing
All Android-powered devices running Android 4.0 are required to support hardware-accelerated 2D drawing. Developers can take advantage of this to add great UI effects while maintaining optimal performance on high-resolution screens, even on phones. For example, developers can rely on accelerated scaling, rotation, and other 2D operations, as well as accelerated UI components such as TextureView and compositing modes such as filtering, blending, and opacity.
New input types and text services
Stylus input, button support, hover events
Android 4.0 includes full support for stylus input events, including tilt and distance axes, pressure, and related motion event properties. To help applications distinguish motion events from different sources, the platform adds distinct tool types for stylus, finger, mouse, and eraser. For improved input from multi-button pointing devices, the platform now provides distinct primary, secondary, and tertiary buttons, as well as back and forward buttons. Hover-enter and hover-exit events are also added, for improved navigation and accessibility. Developers can build on these new input features to add powerful interactions to their apps, such as precise drawing and gesturing, handwriting and shape recognition, improved mouse input, and others.
Text services API for integrating spelling checkers
Android 4.0 lets applications query available text services such as dictionaries and spell checkers for word suggestions, corrections, and similar data. The text services are external to the active IME, so developers can create and distribute dictionaries and suggestion engines that plug into the platform. When an application receives results from a text service — for example, word suggestions — it can display them in a dedicated suggestion popup window directly inside the text view, rather than relying on the IME to display them.
Enhanced accessibility APIs
Android 4.0 adds new accessibility features and an enhanced API to let developers improve the user experience in their apps, especially on devices that don’t have hardware buttons. For accessibility services such as screen readers in particular, the platform offers new APIs to query window content, for easier navigation, better feedback, and richer user interfaces.
Accessibility API
To let applications manage interactions more effectively when accessibility features are enabled, the platform adds accessibility events for explore-by-touch mode, scrolling, and text selection. For these and other events, the platform can attach a new object called an accessibility record that provides extra information about the event context.
Using the accessibility record and related APIs, applications can now access the view hierarchy associated with an event. Applications can query for key properties such as parent and child nodes, available states, supported actions, screen position, and more. Applications can also request changes to certain properties to help manage focus and selected state. For example, an accessibility service could use these new capabilities to add convenient features such as screen-search by text.
Text-to-speech API
A new framework API lets developers write text-to-speech engines and make them available to any app requesting TTS capabilities.
Efficient network usage
In Android 4.0, users can see how much network data their running apps are using. They can also set limits on data usage by network type and disable background data usage for specific applications. In this context, developers need to design their apps to run efficiently and follow best practices for checking the network connection. Android 4.0 provides network APIs to let applications meet those goals.
As users move between networks or set limits on network data, the platform lets applications query for connection type and availability. Developers can use this information to dynamically manage network requests to ensure the best experience for users. Developers can also build custom network and data-usage options into their apps, then expose them to users directly from Settings by means of a new system Intent.
Security for apps and content
Secure management of credentials
Android 4.0 makes it easier for applications to manage authentication and secure sessions. A new keychain API and underlying encrypted storage let applications store and retrieve private keys and their corresponding certificate chains. Any application can use the keychain API to install and store user certificates and CAs securely.
Address Space Layout Randomization
Android 4.0 now provides address space layout randomization (ASLR) to help protect system and third party applications from exploitation due to memory-management issues.
Enhancements for Enterprise
VPN client API
Developers can now build or extend their own VPN solutions on the platform using a new VPN API and underlying secure credential storage. With user permission, applications can configure addresses and routing rules, process outgoing and incoming packets, and establish secure tunnels to a remote server. Enterprises can also take advantage of a standard VPN client built into the platform that provides access to L2TP and IPSec protocols.
Device policy management for camera
The platform adds a new policy control for administrators who manage devices using an installed Device Policy Manager. Administrators can now remotely disable the camera on a managed device for users working in sensitive environments.


{% extends "avatar/base.html" %} {% load i18n staticfiles avatar_tags %} {% load url from future %} {% block content %}
Chapters will use this photo to identify you during rush week. Please select a picture that closely resembles a head shot.
{% trans "Make sure your facebook default clearly displays your face" %}