nisp.database - The database used to describe standards and profiles in NISP
The NISP database contains all standards and profiles used in the NISP and the NC3TA since 1998.
The standard database is logically separated into four different parts:
The structure of the database is described in detail in nisp-database-schema.
The remaining of this document describes specific issues of the database the user should be aware off.
The introduction of UUIDs in the database put significant restrictions on how we in the future update standards and profiles. Except for fixing errors in the description of a standard or profile, the and standard and profile should never be modified. So when e.g. a standard is updated from version 2.0 to verion 3.0, we should create a complete new <standard>
or <profile>
element. When creating the new <standard>
or <profile>
element, it would make sence to just copy the old elemen and then change the appropiate attributes and child elemnts, then make sure you delete the copied UUID element from the new <standard>
or <profile>
element.
Each <standard>
and <profile>
element have two identifiers, i.e. id
in the form of an attribute and ùuid` in form of a child element. which are used to uniquely identify a specific standard or profile.
The two identifiers serves different purposes:
id
orgid
, a hyphen and and the pubnum
attribute of the <document>
element. This identifier is userfriendly, as it is easy to remember and are therefore the id we are using to refere to a standard or profile from a <select>
element. Examples of such identifiers are iso-8859-1 and rfc-793.
uuid
<standard>
or <profile>
element, so e.g. two different version of a given standard will have different UUIDs. This will enable us to import the NISP database into a architecture repository and whenever the NISP database is updated we syncronise with the data in the architecture repository.
To ensure that new UUID elements are created, whenever new standards and profiles are added to the database, the build system will refuse to create HTML and PDF version of the NISP until missing UUID elements have been added to the database.
The new UUID elemnts are created by running the command
build -f uuid-build.xml
Each <standard>
element contains a <document>
element, which describes the standard the element represents. Among the attributes is orgid
, which should only use values from a pre-defined set of maps. This set is described in the element <organisations>
and should be extended if the relevant standard organisation is not already defined. An example of such a map, is
<orgkey key="opengroup" text="The Open Group" />
The NISP sources and tools are available in a Git repository at https://github.com/stavnstrup/nisp-tools/.
Last updated on October 2, 2013


JavaScript is disabled on your browser.
Skip navigation links
Overview
Package
Class
Tree
Deprecated
Index
Help
Location Messaging SDK
Prev
Next
Frames
No Frames
All Classes
Hierarchy For All Packages
Package Hierarchies:
com.phunware.locationmessaging
,
com.phunware.locationmessaging.attributes
,
com.phunware.locationmessaging.entities
,
com.phunware.locationmessaging.location
,
com.phunware.locationmessaging.log
,
com.phunware.locationmessaging.messages
,
com.phunware.locationmessaging.messages.services
Class Hierarchy
java.lang.
Object
com.phunware.locationmessaging.entities.
AttributeMetadataItem
(implements android.os.Parcelable)
com.phunware.locationmessaging.entities.
AttributeMetadataItem.Builder
android.os.Binder (implements android.os.IBinder)
com.phunware.locationmessaging.messages.services.
NotificationCustomizationService.Binder
com.phunware.locationmessaging.entities.
Campaign
(implements android.os.Parcelable)
com.phunware.locationmessaging.entities.
Campaign.Builder
com.phunware.locationmessaging.log.
CompositeLogger
(implements com.phunware.locationmessaging.log.
Logger
)
android.content.Context
android.content.ContextWrapper
android.app.Service (implements android.content.ComponentCallbacks2)
com.phunware.locationmessaging.messages.services.
NotificationCustomizationService
com.phunware.locationmessaging.log.
FileLogger
(implements com.phunware.locationmessaging.log.
Logger
)
com.phunware.locationmessaging.entities.
Geozone
(implements android.os.Parcelable)
com.phunware.locationmessaging.entities.
Geozone.Builder
com.phunware.locationmessaging.
LocationMessaging
com.phunware.locationmessaging.
LocationMessaging.Builder
com.phunware.locationmessaging.log.
Logging
com.phunware.locationmessaging.log.
LogLogger
(implements com.phunware.locationmessaging.log.
Logger
)
com.phunware.locationmessaging.entities.
Message
(implements android.os.Parcelable)
com.phunware.locationmessaging.entities.
Message.Builder
com.phunware.locationmessaging.entities.
MessageMetadata
(implements android.os.Parcelable)
com.phunware.locationmessaging.entities.
MessageMetadata.Builder
com.phunware.locationmessaging.entities.
ProfileAttribute
(implements android.os.Parcelable)
com.phunware.locationmessaging.entities.
ProfileAttribute.Builder
com.phunware.locationmessaging.location.
SimpleLocationListener
(implements com.phunware.locationmessaging.location.
LocationListener
)
com.phunware.locationmessaging.messages.
SimpleMessageListener
(implements com.phunware.locationmessaging.messages.
MessageListener
)
com.phunware.locationmessaging.log.
VoidLogger
(implements com.phunware.locationmessaging.log.
Logger
)
Interface Hierarchy
com.phunware.locationmessaging.attributes.
AttributeManager
com.phunware.locationmessaging.
Callback
<T>
com.phunware.locationmessaging.location.
LocationListener
com.phunware.locationmessaging.location.
LocationManager
com.phunware.locationmessaging.log.
Logger
com.phunware.locationmessaging.messages.
MessageListener
com.phunware.locationmessaging.messages.
MessageManager
Enum Hierarchy
java.lang.
Object
java.lang.
Enum
<E> (implements java.lang.
Comparable
<T>, java.io.
Serializable
)
com.phunware.locationmessaging.entities.
Campaign.Type
com.phunware.locationmessaging.entities.
EventType
Skip navigation links
Overview
Package
Class
Tree
Deprecated
Index
Help
Location Messaging SDK
Prev
Next
Frames
No Frames
All Classes


On this page
TL;DR
Check out the generated graphs or the conclusions
The following numbers show the execution results for the KrakenD benchmarks on Amazon EC2 machines.
Benchmark Setup
This set of benchmarks have been running on different AWS EC2 instances. Each individual test consists of spinning up 3 different machines, being:
- A web server: A LWAN web server using an instance
c4.xlarge
. This is the “fake API” where KrakenD will take the data - The HTTP load generator: The machine actually running the load test. Uses hey, and runs in a
t2.medium
. - KrakenD: Each different test uses a different instance type in Amazon:
The test consists in running hey
against a KrakenD endpoint. The KrakenD endpoint uses as the backend an URL in (LWAN
).
After running the test, the hey
output is parsed and converted to CSV in order to generate the graphs.
For each instance type there are 2 different tests:
- Proxy: When the KrakenD is just used as a gateway and calls to a single endpoint to the web server (
/foo
endpoint in the configuration). - Aggregate: When the KrakenD calls to 3 different endpoints in the web server and aggregates the results (
/social
endpoint in the configuration).
The instance types we tested are:
| Instance Type | Number of vCPU | Memory |
|---|---|---|
| t2.micro | 1 | 1 GB |
| t2.medium | 2 | 4 GB |
| m4.large | 2 | 8 GB |
| c4.xlarge | 4 | 7.5 GB |
| c4.2xlarge | 8 | 15 GB |
KrakenD Configuration for all tests
The configuration for the load test was stored in the krakend.json
file, as follows:
{
"version": 1,
"host": [
"http://lwan:8080"
],
"endpoints": [
{
"endpoint": "/foo",
"method": "GET",
"backend": [
{
"url_pattern": "/bar"
}
],
"concurrent_calls": "1",
"max_rate": 100000
},
{
"endpoint": "/social",
"method": "GET",
"backend": [
{
"url_pattern": "/fb",
"group": "fb"
},
{
"url_pattern": "/youtube",
"target": "data",
"group": "youtube"
},
{
"url_pattern": "/twitter",
"group": "twitter"
}
],
"concurrent_calls": "1",
"timeout": "500ms",
"cache_ttl": "12h"
}
],
"oauth": {
"disable": true
},
"cache_ttl": "5m",
"timeout": "5s"
}
Notice that Lwan
is the backend running at lwan:8080
.
And we started the KrakenD with this cmd (debug mode):
- krakend run --config krakend.json -d > /dev/null
Results
Proxy test on t2.micro
Aggregate test on t2.micro
Proxy test on t2.medium
Aggregate test on t2.medium
Proxy test on m4.large
Aggregate test on m4.large
Proxy test on c4.xlarge
Aggregate test on c4.xlarge
Proxy test on c4.2xlarge
Aggregate test on c4.2xlarge
Conclusions
During all the tests we did, the instances of type c4
always showed a stable behavior while the m4
types didn’t offer
a proportional increase in the performance and the variance of the responses is too high.
The instances micro
provide nice figures of rps and latency for a good money. It looks like they suffer a little bit
more in the aggregated tests but in general it is a good choice.
To be taken into account that this type of service is CPU intensive so when using t2
instances once you spend your CPU
credit the instance will perform worst.
In general terms:
- Use
micro
instances by default. - If you expect high and continued load with complex use cases (intensive aggregation and manipulation)
c4.2xlarge
is worth it - If you want to maintain quality of service with high load but a relative simple app,
c4.xlarge
- For low to moderate loads use
micro
or a cluster of micros. - We wouldn’t choose
m4
in any scenario for the money/performance.
Look at the numbers and the use case you’ll have in order to choose the right solution for you. And more importantly, do the tests using your own data. This is a reference to contrast your own tests.


In conclusion, the komodo multichain architecture is shown to solve a previously unsolved problem of decentralized realtime gaming. Additionally, even though KMD itself is not used directly, it is required to create a pegged USDK chain, so indirectly the demand for a smart stablecoin with a built in cashier, will create demand for KMD


Note
Click here to download the full example code
Train a linear regression with onnxruntime-training¶
This example explores how onnxruntime-training can be used to
train a simple linear regression using a gradient descent.
It compares the results with those obtained by
sklearn.linear_model.SGDRegressor
A simple linear regression with scikit-learn¶
from pprint import pprint
import numpy
import onnx
from pandas import DataFrame
from onnxruntime import (
InferenceSession, get_device)
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDRegressor
from sklearn.neural_network import MLPRegressor
from mlprodict.onnx_conv import to_onnx
from onnxcustom.plotting.plotting_onnx import plot_onnxs
from onnxcustom.utils.orttraining_helper import (
add_loss_output, get_train_initializer)
from onnxcustom.training.optimizers import OrtGradientOptimizer
X, y = make_regression(n_features=2, bias=2)
X = X.astype(numpy.float32)
y = y.astype(numpy.float32)
X_train, X_test, y_train, y_test = train_test_split(X, y)
lr = SGDRegressor(l1_ratio=0, max_iter=200, eta0=5e-2)
lr.fit(X, y)
print(lr.predict(X[:5]))
Out:
[ 73.16733311 -60.81267975 31.04422129 -75.08078784 -71.43513636]
The trained coefficients are:
print("trained coefficients:", lr.coef_, lr.intercept_)
Out:
trained coefficients: [58.45234203 48.92038649] [2.0011031]
However this model does not show the training curve.
We switch to a sklearn.neural_network.MLPRegressor
.
lr = MLPRegressor(hidden_layer_sizes=tuple(),
activation='identity', max_iter=200,
batch_size=10, solver='sgd',
alpha=0, learning_rate_init=1e-2,
n_iter_no_change=200,
momentum=0, nesterovs_momentum=False)
lr.fit(X, y)
print(lr.predict(X[:5]))
Out:
/var/lib/jenkins/workspace/onnxcustom/onnxcustom_UT_39_std/_venv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.
warnings.warn(
[ 73.173676 -60.81919 31.047342 -75.08743 -71.443665]
The trained coefficients are:
print("trained coefficients:", lr.coefs_, lr.intercepts_)
Out:
trained coefficients: [array([[58.45749],
[48.92646]], dtype=float32)] [array([2.0000165], dtype=float32)]
ONNX graph¶
Training with onnxruntime-training starts with an ONNX graph which defines the model to learn. It is obtained by simply converting the previous linear regression into ONNX.
onx = to_onnx(lr, X_train[:1].astype(numpy.float32), target_opset=15,
black_op={'LinearRegressor'})
Choosing a loss¶
The training requires a loss function. By default, it
is the square function but it could be the absolute error or
include regularization. Function
add_loss_output
appends the loss function to the ONNX graph.
onx_train = add_loss_output(onx)
plot_onnxs(onx, onx_train,
title=['Linear Regression',
'Linear Regression + Loss with ONNX'])
Out:
array([<AxesSubplot:title={'center':'Linear Regression'}>,
<AxesSubplot:title={'center':'Linear Regression + Loss with ONNX'}>],
dtype=object)
Let’s check inference is working.
sess = InferenceSession(onx_train.SerializeToString(),
providers=['CPUExecutionProvider'])
res = sess.run(None, {'X': X_test, 'label': y_test.reshape((-1, 1))})
print("onnx loss=%r" % (res[0][0, 0] / X_test.shape[0]))
Out:
onnx loss=7.404760822282696e-09
Weights¶
Every initializer is a set of weights which can be trained and a gradient will be computed for it. However an initializer used to modify a shape or to extract a subpart of a tensor does not need training. Let’s remove them from the list of initializer to train.
inits = get_train_initializer(onx)
weights = {k: v for k, v in inits.items() if k != "shape_tensor"}
pprint(list((k, v[0].shape) for k, v in weights.items()))
Out:
[('coefficient', (2, 1)), ('intercepts', (1, 1))]
Train on CPU or GPU if available¶
device = "cuda" if get_device().upper() == 'GPU' else 'cpu'
print("device=%r get_device()=%r" % (device, get_device()))
Out:
device='cpu' get_device()='CPU'
Stochastic Gradient Descent¶
The training logic is hidden in class
OrtGradientOptimizer
.
It follows scikit-learn API (see SGDRegressor.
The gradient graph is not available at this stage.
train_session = OrtGradientOptimizer(
onx_train, list(weights), device=device, verbose=1, learning_rate=1e-2,
warm_start=False, max_iter=200, batch_size=10,
saved_gradient="saved_gradient.onnx")
train_session.fit(X, y)
Out:
0%| | 0/200 [00:00<?, ?it/s]
15%|#5 | 30/200 [00:00<00:00, 295.23it/s]
30%|### | 60/200 [00:00<00:00, 289.43it/s]
45%|####5 | 90/200 [00:00<00:00, 291.87it/s]
60%|###### | 120/200 [00:00<00:00, 293.14it/s]
75%|#######5 | 150/200 [00:00<00:00, 293.96it/s]
90%|######### | 180/200 [00:00<00:00, 294.35it/s]
100%|##########| 200/200 [00:00<00:00, 293.35it/s]
OrtGradientOptimizer(model_onnx='ir_version...', weights_to_train=['coefficient', 'intercepts'], loss_output_name='loss', max_iter=200, training_optimizer_name='SGDOptimizer', batch_size=10, learning_rate=LearningRateSGD(eta0=0.01, alpha=0.0001, power_t=0.25, learning_rate='invscaling'), value=0.0026591479484724943, device='cpu', warm_start=False, verbose=1, validation_every=20, saved_gradient='saved_gradient.onnx', sample_weight_name='weight')
And the trained coefficient are…
state_tensors = train_session.get_state()
pprint(["trained coefficients:", state_tensors])
print("last_losses:", train_session.train_losses_[-5:])
min_length = min(len(train_session.train_losses_), len(lr.loss_curve_))
df = DataFrame({'ort losses': train_session.train_losses_[:min_length],
'skl losses': lr.loss_curve_[:min_length]})
df.plot(title="Train loss against iterations")
Out:
['trained coefficients:',
{'coefficient': array([[58.457428],
[48.926197]], dtype=float32),
'intercepts': array([[2.000249]], dtype=float32)}]
last_losses: [2.3780319e-07, 1.973037e-07, 2.3141999e-07, 1.8104748e-07, 1.8059363e-07]
<AxesSubplot:title={'center':'Train loss against iterations'}>
the training graph looks like the following…
with open("saved_gradient.onnx.training.onnx", "rb") as f:
graph = onnx.load(f)
for inode, node in enumerate(graph.graph.node):
if '' in node.output:
for i in range(len(node.output)):
if node.output[i] == "":
node.output[i] = "n%d-%d" % (inode, i)
plot_onnxs(graph, title='Training graph')
Out:
<AxesSubplot:title={'center':'Training graph'}>
The convergence speed is not the same but both gradient descents
do not update the gradient multiplier the same way.
onnxruntime-training does not implement any gradient descent,
it just computes the gradient.
That’s the purpose of OrtGradientOptimizer
. Next example
digs into the implementation details.
# import matplotlib.pyplot as plt
# plt.show()
Total running time of the script: ( 0 minutes 6.182 seconds)


This function estimates the marginal cumulative incidence for failures of
specified types using targeted minimum loss-based estimation based on the
initial estimates of the cause-specific hazard functions for failures of each type.
The function is called by survtmle
whenever method="hazard"
is specified.
However, power users could, in theory, make calls directly to this function.
cv_hazard_tmle(ftime, ftype, trt, t0, incidence = TRUE, adjustVars = NULL, survtmleFits, validFolds, returnIC = TRUE, returnModels = FALSE, ftypeOfInterest = "all", trtOfInterest = "all", bounds = NULL, verbose, tol = 1/(length(ftime)), maxIter = 100, ...)
ftime
while
ftype
should be set to 0.trt
are supported.max(ftime)
.TRUE
the function return estimates of cumulative incidence. If
FALSE
the function returns esimtates of survival.survtmle
fit on train samples of datalist
of vectors
indicating which observations were in the
validation fold for each of the survtmleFits
.TRUE
(the default)
unless the user is sure these estimates will not be needed later.SuperLearner
or glm
objects used to estimate the nuisance parameters. Must be set to TRUE
if the user plans to
use calls to timepoints
to obtain estimates at times other than t0
. See ?timepoints
for more information."all"
, which computes estimates for values unique(ftype)
. Can alternatively
be set to a vector of values found in ftype
.trt
are of interest. The default value
is "all"
, which computes estimates for values unique(trt)
. Can alternatively be set to a
vector of values found in trt
.tol
. The default (1/length(ftime)
) is a sensible value. Larger values can
be used in situations where convergence of the algorithm is an issue; however, this may result in
finite-sample bias.method="hazard"
. The
algorithm will iterate until either the empirical mean of the efficient influence function
is smaller than tol
or until maxIter
iterations have been completed.est A numeric vector of point estimates -- one for each combination of ftypeOfInterest
and trtOfInterest
.
var A covariance matrix of all the point estimates
meanIC The empirical mean of the efficient influence function at the estimated, fluctuated
nuisance parameters. If all goes well, each value should be less than tol
.
ic The efficient influence function at the estimated, fluctuated nuisance parameters, evaluated on each of the observations (summed over all times). These may be used to perform post-hoc comparisons. More details coming.
ftimeMod If returnModels=TRUE
the fit object(s) for the call to glm
or
SuperLearner
for the outcome regression models. If method="mean"
this will be a list
of length length(ftypeOfInterest)
each of length t0
(one regression for each
failure type and for each time point). If method="hazard"
this will be a list of length
length(ftypeOfInterest)
with one model corresponding with the (pseudo-)hazard for each
cause of failure. If returnModels=FALSE
, this will equal NULL
.
ctimeMod If returnModels=TRUE
the fit object for the call to glm
or
SuperLearner
for the censoring hazard regression model.
If returnModels=FALSE
, this will equal NULL
.
trtMod If returnModels=TRUE
the fit object for the call to glm
or
SuperLearner
for the conditioanl probability of trt
regression model.
If returnModels=FALSE
, this will equal NULL
.


Stats are not calculated yet, return to Plex Web and wait a couple of minutes...
Movies
movies by release year
movie genres
movie ratings
movies added over time
movie content ratings
video resolutions
TV Shows
shows by year first aired
show genres
show ratings
episodes added over time
show content ratings
video resolutions


Bar chart
- bind the dataset with DOM elements using:
bindElems = d3.selectAll("elem").data(dataset)
- append element to bindElems with bindElems.enter().append()
- and merge() that with the other already added
- use bindElems.exit().remove() for remove element removed


Cours 9
Test Tableu
Liste des Exercices
Exercice 1
Exercice 2
Exercice 3
Exercice 4
Exercice 5
Exercice 6
Effacer


Hi! My name is Jose Sachango. I'm a Houston based software developer with experience building front-end applications. I'm also a chemical engineer by training, which gives me the added advantage of being able to apply both numerical and analytical methods to solve a wider range of technical problems in the field of software development.
My background has allowed me to be adaptable and creative. It's also given me a breadth of understanding in a variety of fields. for instance, some of the projects I've worked on include: writing VBA scripts to automate data tracking for drilling and completion operations; designing a polyethylene petrochemical processes using software like ASPEN plus; working in laboratory environments running experiments on gas chromatographs and distillation columns; I've even spent time managing after school STEM programs for fourth and fifth grade boys.
All of these projects had their own unique challenges that required me to draw from of variety of resource and come up with unique solutions; that's what I love to do. If you'd let me, I'd be happy to assess your problem and come up with a solution that works for you.


Sylvanian Families Sister At Home
From the box
Jeanie Tailbury adores her desk with all its drawers and space for her globe, school bag, pencil holder, pencils, pencil sharpener, and papers. Most evenings she can be found sitting at her desk doing her homework, writing letters, and drawing pictures for her best friends.


News
Latest updates from development.
Jun 21, 2022
Tons of polishing done in the latest ArmorPaint builds. iOS and Android update coming next.
Feb 11, 2022
New ArmorPaint builds are out on iOS and Android. More to come!
Oct 23, 2021
Thank you for the big interest in the iPad version - will be rolling updates regularly. All feedback on GitHub is very welcome!
Oct 21, 2021
ArmorPaint 0.8 is out - 3D texture painting app now on desktop, iPad and Android.🖌
armorpaint.org/notes
Sep 9, 2021
Submitted to the AppStore, in the review process now.
Jul 19, 2021
ArmorPaint on iPadOS with cloud support. Coming to the AppStore!
Jun 18, 2021
Drag and drop procedural edge wear onto your models in ArmorPaint.
Jun 3, 2021
Unlimited masks per layer and mask blending now in the latest ArmorPaint builds.
May 13, 2021
Cloud library now available in ArmorPaint.🌩
armorpaint.org/cloud
Feb 6, 2021
Working on procedural edge wear materials for ArmorPaint.
Dec 17, 2020
Non-destructive decal layers now available in ArmorPaint.
Dec 3, 2020
Use decals as a brush mask in the latest ArmorPaint builds.
Sept 29, 2020
Painting translucency in the upcoming ArmorPaint ray-tracing update.
Sept 24, 2020
Use nodes to control layer masks in ArmorPaint.
Sept 22, 2020
Live material node preview, new blur node and a boatload of bug fixes now in the latest ArmorPaint builds.📦
Sept 9, 2020
Path-traced viewport and ray-traced baking in ArmorPaint now runs on both Direct3D12 and Vulkan, Windows and Linux, Nvidia and the upcoming AMD cards.
Jun 12, 2020
ArmorPaint running on iPadOS.  Real-time path tracing in ArmorPaint.
youtu.be/uQb-LOJdYrE
Apr 21, 2020
Creating materials for Minecraft RTX in ArmorPaint.
armorpaint.org/howto
Apr 15, 2020
Live brush preview + path-tracing in ArmorPaint.
Apr 7, 2020
Sewing in ArmorPaint. Using the new brush nodes to create directional brushes.🧵
armorpaint.org/howto
Apr 2, 2020
Painted and rendered in ArmorPaint for fun. Model by İrfan Çaylı.🥏
artstation.com/artwork/aRW169
Mar 5, 2020
ArmorPaint launches on Android - development builds are up, with support for pen pressure, touch, keyboard, mouse and mirroring to big screen. iPadOS will follow!
Feb 25, 2020
ArmorPaint has been awarded an Epic MegaGrant! Full steam ahead to build the best possible open-source 3D painting software!🏅
Jan 29, 2020
New ArmorPaint 0.8 dev builds! Working on asset browser with material previews, layer grouping, script console, faster ray-tracing, painting transparent surfaces.
Jan 23, 2020
Learn ArmorPaint by watching short clips. 🎓
armorpaint.org/howto
Jan 9, 2020
ArmorPaint 0.7 is out - new features, tons of fixes and updated manual. Video tutorials section coming!
armorpaint.org/notes
Dec 17, 2019
Baking update for ArmorPaintDXR is up - raytraced ao, cavity, bent normals, thickness, lightmap, curvature, dilate pass, reduced gpu mem usage.🍞
Nov 28, 2019
New ArmorPaint dev builds are up, gearing up for 0.7 release. Focused on fixes but has new stuff as well - custom export presets with channel swizzling, read layers and masks with material nodes, udim tiles export, built-in uv unwrap, improved dxr support.
Nov 4, 2019
Testing out plugin for @UnrealEngine. Paint onto objects by summoning ArmorPaint.
Oct 31, 2019
Small feature to improve workflow in ArmorPaint. Quickly re-import mesh from source obj/fbx/blend file.
Oct 23, 2019
Adding a way to create custom material nodes with plugins. Will make it possible to integrate new node systems, extend existing node set or write material shader by hand.
Oct 22, 2019
More goodies in latest ArmorPaint dev builds.📦 Split view, plugin manager, auto-save, improved decal scaling, UV controls for fill layers, faster layer handling, blend modes, enhanced picker tool.
armorpaint.org/notes
Oct 10, 2019
Approaching the holy grail - path-tracing viewport in ArmorPaint.
Oct 7, 2019
A new ArmorPaintDXR build is up, featuring 'Bake - AO (DXR)' option. It's the first build ever running on Direct3D12.
Sep 17, 2019
Texture Synthesis by @EmbarkStudios running in ArmorPaint as a plugin. Make non-tiling textures tile. First step towards generating materials from photos!
Sep 13, 2019
Friday fun - 'procedural' Commodore 64 material.📺 Actual emulator compiled from C to WebAssembly, running in ArmorPaint as a plugin. Check out github.com/floooh/chips by @FlohOfWoe!
Sep 4, 2019
Fun with terrain in ArmorPaint. Improving height map sculpting features.
Aug 29, 2019
Working on ray-traced baking in ArmorPaint.🍞
Aug 14, 2019
New video is up! Texturing in ArmorPaint 0.6.
Aug 1, 2019
Upcoming ArmorPaint ray-tracing update now in testing phase.🤖
Jul 12, 2019
Cooking some edge wear materials, powered by curvature baker. Drag and drop material from the shelf to apply.
Jul 4, 2019
New ArmorPaint builds are up! Curvature baker, 16/32bit painting, .exr export, undo for layer operations, custom keymaps, 256 layers per project.🎨
Jun 13, 2019
Under the hood, ArmorPaint 0.5 vs 0.6. 🚀
23% faster painting
34% less gpu mem for layer storage
43% less gpu mem for mesh storage
72% faster startup
59% faster .obj import
Jun 6, 2019
New 3D brush cursor with topological warp + angle and depth rejection in latest ArmorPaint builds.
May 23, 2019
New features landed in ArmorPaint - triplanar mapping, symmetry paint, texture viewer, native file dialogs, initial .blend material importer.🎨
Apr 18, 2019
Fresh ArmorPaint development builds are up! New layer tools, UDIM, 2D paint, masking.
Apr 10, 2019
ArmorPaint gearing up for ray tracing.
Mar 29, 2019
Advancing layer management in ArmorPaint. Per-layer masking, blending, opacity and channel control.
Mar 21, 2019
Adding particle brushes into ArmorPaint to achieve rain effect!
Mar 7, 2019
New text tool in ArmorPaint. Drop in a font file and stamp text onto objects. Text has active material applied.
Mar 5, 2019
Advancing the decal tool in ArmorPaint. Applies all channels at once and supports opacity masking now.
Feb 28, 2019
New ArmorPaint development builds are now up if you feel adventurous, approaching 0.6 release!🎨
Feb 8, 2019
ArmorPaint is getting more and more refined.🤠🖌
Jan 30, 2019
ArmorPaint + latest Armory engine. Importing 650MB .obj file(7.2M tris) - 32% lower memory usage, 15% faster when painting. Must have all the speed!
Jan 25, 2019
If you are eyeing a 3D painting software, ArmorPaint just happens to have another big upgrade around the corner. Humbled by the enormous support!
Nov 8, 2018
ArmorPaint gets the biggest update yet - 0.5 is live!
Oct 12, 2018
New ArmorPaint builds incoming! Painting 3M triangle mesh, all PBR maps at once.
Jul 31, 2018
Kha can do ray-tracing now powered by D3D12 and soon Vulkan. Endless possibilities! First test - primitive path-tracing renderer in Armory.
Jul 12, 2018
ArmorPaint 0.4 is out! Material previews, height painting, sticker tool and first peek at undo support.
Jun 29, 2018
Adding sticker tool and live material previews to ArmorPaint.
Jun 18, 2018
Height-maps in upcoming ArmorPaint - generating procedural terrain with hand-painted road layer.
May 11, 2018
Painting height textures in ArmorPaint.
May 4, 2018
ArmorPaint 0.3 is out! Layers, color-id maps, plugins, themes, pen pressure, erase tool, refined ui.
Apr 27, 2018
Wrapping up new ArmorPaint builds - now with support for color-id maps and plugins written in JS or WebAssembly.
Mar 9, 2018
Testing the new Kha pen API in ArmorPaint!
Feb 27, 2018
ArmorPaint hits version 0.2! Check out what's new.
Jan 19, 2018
ArmorPaint is out now! 3D PBR texture painting tool powered by Armory.
Dec 15, 2017
Still coming! 3D character painting in ArmorPaint.
Jun 18, 2017
Pushed updates to the UI library used in Armory tools.
Jun 15, 2017
Armory painter tool now with a website, launching next month.
May 18, 2017
More progress on Armory painter - added VR/AR mode and mobile/web support.
May 9, 2017
Stress-testing Armory painter tool on a sculpted 1.35M triangle mesh. Up to 20K texture painting using 6GB+ graphics card.
May 2, 2017
Armory-powered GPU painting tool taking shape - Cycles-like node materials for brushes with instant voxel GI enabled preview.
Feb 6, 2017
Watch some GPU based 3D painting I have been working on using Armory & Kha.
youtu.be/TEp3fPBvf80


It is a stylized container that displays a secondary window over the main window. It does not have the suffix -child
.
This is a background that covers the main document. It will open when it contains the wd-open
class. See the dataWdAction attribute.
It will open when it contains the wd-open
class. See the dataWdAction attribute.
Background colors are recommended.
CloseThe window may have different characteristics. To do this, add the following classes together with the wd-window
class to change the window's shape:
To open a window individually, the container must be contained in a modal window. The "wd-open" class must be entered in the modal window:
Open Modal Window


We organise, host and support a ton of events for TechHub members and the wider startup community in London. Have a look at the TechHub Events list for:
Meeting with VC's, Investors, Partner companies
Guest speakers and interesting panels
Weekly members breakfast
Monthly demo night - your chance to Demo your product and see what others are working on
One-to-one advice with industry professionals on a number of topics such as PR, finance and law
Please note that the majority of our events are
free for TechHub members, and a number of events are
exclusively for TechHub members only.
Sometimes there is a small fee or a donation, but you will always have a priority when booking your ticket.
We announce all of our events and member activities in our newsletter, so keep an eye out for it!
To see what is going on in Campus, check out the
Calendar
London has loads of great events every day.
See what's on with these apps from TechHub members:


Pegman wants to explore the city and conduct a scavenger hunt of famous locations, and he needs your
help!
Drag and drop pegman around the city, based on the hints you are given at the rate of clues per minute.
You may zoom in/out of both the Map and Streetview as necessary in your search of the target with the ultimate goal of dropping pegman as close to the target as possible, which will be marked on
the Map as a point-of-interest.
If you find during your Hunt that Pegman is not on the Map, he's probably hiding in the lower-right hand corner of the Map. Just drag him out and
drop him on the Map again.
Do it quickly, as you start each Hunt with only points and lose points
every second!
The two buttons Bearing and Distance can be used to give you an extra hint about the
target at any time during the Hunt but come at the cost of points per use.
Once you arrive at the location, click the red Arrived (I think) button to confirm. However, if you
are NOT close enough to the target, you will be charged a points penalty!
If you have indeed arrived, your remaining points will be saved, and you will go on to another Hunt until
your expedition ends.
If you think you have arrived, but it is not registering, please zoom in, drag Pegman closer, and try
again. Generally, you need to be within 0.025 km (25 meters) to be considered "arrived".


Peter Hain's panel show appearances
Peter Hain (born 1950-02-16[ref]) has appeared in 30 episodes between 1982-2016. Peter Hain on Wikipedia.
- 2016-01-21 / Question Time
- 2015-01-29 / Question Time
- 2014-04-03 / Question Time
- 2013-12-12 / Question Time
- 2012-05-17 / Question Time
- 2011-04-14 / Question Time
- 2011-02-24 / Question Time
- 2010-06-17 / Question Time
- 2010-02-25 / Question Time
- 2010-01-14 / Question Time
- 2009-11-05 / Question Time
- 2009-06-11 / Question Time
- 2009-02-26 / Question Time
- 2007-10-18 / Question Time
- 2007-06-14 / Question Time
- 2007-03-01 / Question Time
- 2006-11-30 / Question Time
- 2006-02-16 / Question Time
- 2005-06-23 / Question Time
- 2004-09-23 / Question Time
- 2004-05-27 / Question Time
- 2004-02-05 / Question Time
- 2003-10-02 / Question Time
- 2003-06-19 / Question Time
- 2003-03-20 / Question Time
- 2002-05-16 / Question Time
- 2001-09-27 / Question Time
- 2000-11-02 / Question Time
- 1998-03-12 / Question Time
- 1982-12-02 / Question Time


For obtaining a complete executable simulation scenario, a simulation model has to be complemented with simulation parameter settings and an initial system state.
In general, we may have more than one simulation scenario for a simulation model. For instance, the same model could be used in two different scenarios with different initial states.
A simulation scenario consists of
simulationEndTime
and randomSeed
,An empty template for a simulation scenario has the following structure:
// ***** Simulation Parameters ************** sim.scenario.simulationEndTime = ...; sim.scenario.randomSeed = ...; // optional // ***** Simulation Model ******************* sim.model.time = "..."; // discrete or continuous sim.model.timeIncrement = ...; // optional sim.model.timeUnit = "..."; // optional (ms|s|m|h|D|W|M|Y) sim.model.objectTypes = [...]; sim.model.eventTypes = [...]; // ***** Initial State ********************** sim.scenario.initialState.objects = {...}; sim.scenario.initialState.events = {...}; // ***** Ex-Post Statistics ***************** sim.model.statistics = {...};
We briefly discuss each group of scenario information items in the following sub-sections.
A few simulation parameters are predefined as attributes of the simulation scenario. The most important ones are:
Both the model and the scenario can be documented and described by providing various metadata in a separate metadata.js file: a name, a title and a shortDescription, as well as meta data like creator, a created date, a (last) modified date and a copyright license, like so
sim.model.name = "..."; sim.model.title = "..."; sim.model.license = "CC BY-NC"; sim.model.shortDescription = "..."; sim.model.systemNarrative = "...";
It is recommended to use an Attribution Share-Alike Creative Commons license by specifying its abbreviated name "CC BY-SA" (or "CC BY-NC" for non-commercial use).
The mandatory model attribute systemNarrative has to be used for providing a brief description of the real system under investigation, as opposed to the solution-specific model description provided by shortDescription.
Defining an initial state means:
A scenario must include an initial state definition, which consists of a set of initial object definitions and a set of initial event definitions.
An initial state object is defined as
an entry in the map initialState.objects
such that the object's
id
value is the map entry's key, and the map entry's value is a
set of property-value slots, including a slot for the special attribute
typeName defining the object's type, as shown in the following
example:
sim.scenario.initialState.objects = { "1": {typeName:"ServiceDesk", name:"serviceDesk1", queueLength: 0} };
Notice that object IDs are positive integers, but when used as keys in a JS map/object, they are converted to strings.
Instead of
assigning a fixed value to a property like
queueLength
for defining an object's initial state, as in
queueLength: 0
, we can also assign it a fixed
expression, as in queueLength: Math.round(12/30)
, or a
variable expression, as in queueLength: () =>
rand.uniformInt(1,8)
, where a JS arrow function expression
is used for allowing the deferred evaluation of the expression
rand.uniformInt(1,8)
, which invokes a random variate sampling
function for obtaining a random sample of the discrete uniform probability
distribution with lower bound 1 and upper bound 8.
An initial
event is defined as an element of the array list
initialState.events
in the form of a set of property-value
slots, including a slot for the special attribute typeName defining
the event's type, as shown in the following example:
sim.scenario.initialState.events = [ {typeName: "Arrival", occTime: 1, serviceDesk: 1} ];
When initial events (or objects) are parametrized with the help of
model variables, they can be defined by moving the
sim.scenario.initialState.events
definition to the
sim.scenario.setupInitialState
function because this function
is executed after the model variables are assigned.


#include <ITimePerformer.hpp>
Inheritance diagram for gpx::phy::ITimePerformer:
Public Member Functions | |
| virtual void | update (real_t dt)=0 |
| Update. |
Represents abstract object, which state depends on time.
| virtual void gpx::phy::ITimePerformer::update | ( | real_t | dt | ) | [pure virtual] |
Update.
| dt | time elapsed from last update. Value 0.0 and positives should be handled by implementing classes. Result of calling this method with negative value is undefined. |
Implemented in gpx::phy2d::MaterialBody, gpx::phy2d::MovableObject, and gpx::phy2d::NewtonCollider.


{{define "cp_logging"}} {{template "cp_head" .}} Message and username/nickname logs {{template "cp_alerts" .}}
Manage Messages
If none are set, everyone will be able to access message logs (including users not logged in at all), otherwise access is restricted to only the specified roles. Note: people with access to the control panel will always have access to logs.


Junior Electrical and Computer Engineering Student
My name is Taher Darolywala,i am a Junior at the University Of Houston pursuing a Bachelors in
Electrical and Computer Engineering.I created this website to share my work experience as well
some of the projects that i have worked on. I am looking for work opportunities in the area of Software engineering,Data Visualization and Data Engineering.
I am concurrently working as a Software Engineering intern at Sanchez Oil & Gas, Computer Engineering Intern at Chirality Research Inc and as an
Undergraduate Teaching Assistant for ENGI 1331: Introduction to Computing and Engineering(MATLAB).
I have academic level experience in Java,C,C++ and
industry level experience in Javascript,HTML,CSS building visual web apps and this website.
Python,R for data cleaning analyzing visualization.
I created this interactive website using Bootstrap 4.2, JS, CSS and HTML5 to share some of my work that i have done so far. Since i also plan on working on some more larger open-source projects, i thought it would be a good start to setup a website.
Click on the nodes to drag them around. Inspired by Mike Bostocks Mobile Patent Viz.
Sanchez is and Oil and Gas Operator Company
I work in the optimization team where i was responsible for coming up with innovative solutions to automate tasks.
some of the projects that i worked with were retrofitting and normalizing text data using machine learning.
Once the data was retrofitted,
i also made some really visually appealing visualizations which clearly indicated the KPI's on the oil field.Stack:Python,R,JS,CSS,HTML5
,MySql,MsSql,MongoDB,InfluxDB
This internship was where i had my first exposure to software engineering. I started with a relatively simple project using Python and Google Firebase where i had to make a HTTP connection from python to FireBase and convert the json data into a dataframe and plot it on a map using leaflet. After that, i just started learning on my own and everything kept building on top of itself. My most recent project involved setting up a data pipeline in logstash and indexing the data into Elastic Search and visualizing it using Kibana.
Nov 2017- PresentThis is an introductory course for computing and problem solving for engineer's.
The programming languge used to teach the course was MATLAB.
My responsibilites included mentoring groups of atleast 15-20 students,and hosting office
hours and helping/debugging code for more than 200 students.
This position was where i learned to effectively communicate with students and professors regarding course materials, complaints and assignments.
My job responsibilites included serving patrons entering the Recreation center by swiping their cards and allowing them access, doing laundey, performing routine checks of the facility and handing out equipment to patrons. This was my first paid professional job where i learnt most of my soft skills on how to greet patrons and perform customer service when handing out various sporting equipments.
May 2017 - September 2017


|
|
|
U.S. Department of the Interior
U.S. Geological Survey
Open-File Report 01-289 [View PDF]
|
View other reports in the 2001
Tampa Bay Pilot Study Series: |
| 1-2-3-4-5-6-7-8-9 |
|
|
|
Task Leader: Peter Swarzenski
|
|
|
Tampa Bay Integrated Science Pilot Study:
|
|
A 2001-2002 drought induced imprint on estuarine processes?
|
|
|
| Preliminary Observations |
|
| Figure 2. Historic Alafia River daily mean discharge at Lithia, Florida. |
| [view enlargement] |
|
|
Historic river discharge:
The Tampa Bay watershed experienced severe drought conditions in 2000-2001. Long-term flow records (1933-1992) of the Alafia River at Lithia indicate a significant decreasing trend (Fig. 2) in annual mean flows (Stoker et al., 1996) and annual peak flows (Hammett, in press). Annual mean flows in the Alafia River, Hillsborough River, and Sweetwater Creek for the 2000 water year were the lowest on record.
Such reduced riverine inflow resulted in observed elevated salinities throughout large portions of the bay. These trends can be attributed in part to climatic variability, as well as other factors such as drier antecedent conditions, decreased ground water inflow and sea level fluctuations.
|
|
| Exchange processes at the sediment/water interface:
Interstitial waters (i.e., pore waters) can provide a powerful forensic tool to interpret post-depositional change in sediments (McKee et al., 1996). Pore water profiles from four sites in Tampa Bay indicate upward diffusion from sediments into the water column for many nutrients such as phosphorus and ammonia.
In contrast, selected metal profiles show a flux into the seabed (Fig. 3). Such divergent pore water profiles influence the availability of these constituents for biologically mediated uptake. A suite of geochemical tracers suggests that exchange across the sediment/water interface at the four sampling sites is limited to recycled seawater facilitated by tidal forcing, rather than submarine groundwater discharge.
Results from a geophysical survey indicate an abrupt change in stratigraphic units, with the deeper layer having either lower porosity or less saline pore waters. The current drought regime suggests that the former explanation is more plausible, and the geophysical resistivity anomalies typically corroborate observed geochemical results.
|
|
Figure 3. Pore water profiles of dissolved vanadium (nM) and soluble reactive phosphorus-SRP (µM).
[view enlargement]
|
|
|
|
| Estuarine processes at the Alafia River/ocean mixing zone:
Estuaries are biogeochemical reactor where a complex suite of reactions and processes transforms riverine constituents (i.e., contaminants) as they are transported out to sea (Swarzenski et al., 1995).
An important effect of these processes is the removal of many particle reactive constituents (Fig. 4) from the dissolved phase onto particles (scavenging), where their fate is bound closely to that of the particle. This implies that when a particle settles onto the seabed and becomes buried, the attached chemical is no longer bioavailable in the water column.
Not all scavenging reactions are irreversible, so that additional processes such as early diagenesis or bioturbation can re-introduce some contaminants to the water column via pore water advection/diffusion. Estuarine processes did not occur in the bay water column during the sampling period, but instead occurred in the Alafia River. How these findings compare to non-drought conditions needs to be evaluated with regard to ecosystem health and sustainability.
|
| Figure 4. Dissolved molybdenum versus salinity in the Alafia River/Tampa Bay mixing zone.
[view enlargement]
|
|
|
|
|
| Bioturbation: |
| Exchange at the sediment/water interface can be greatly influenced by biologically facilitated mixing, i.e., bioturbation. In Tampa Bay, the population of ghost shrimp (thalassinidean) was most dense (mean = ~31 m-2) closest to the Alafia River mouth. Biomass and apparent bioturbation rates by this benthic organism appeared to exceed those of clams and worms.
|
|
|
|


peter hoang
Bienvenue! I'm Peter, a full stack developer based out of New York City! I enjoy creating projects that improve inefficiencies in daily lives and organizational systems. Along with code, I enjoy all things LSU, Geaux Tigers!
Check out my projects below!
Crowdsourcing your favorite songs for everyone to hear!
Here at Scratch-1 we want to help you to get your tasks in order and start the day organized!
This is a 2-player game in which each player will alternate turns and complete the objective of connecting 4 targets in the 6x6 game board.


Estimating work is the bane of every engineer’s existence. If you overestimate and deliver too quickly, the perception is that you’re sandbagging, whereas if you underestimate and deliver too late, the perception is that you’re not competent. Most resources about task estimation are purely technical. The “soft side” of estimation is equally important, yet rarely discussed (and in practice, it usually causes the most friction). In this post I’ll discuss the psychology of estimation, ways to communicate with stakeholders about engineering tasks, and tactics to get closer to hitting your mark (and learning how to be flexible when unexpected challenges come up).
Who is this post for?
- Small startups and tech organizations
TL;DR
- Many ways to estimate engineering effort, but stakeholders care about deadlines
- Many psychological and logical barriers to accurately estimating (if you’re aware of them, you can limit their influence on you)
- You and stakeholders are on the same team; you just communicate in different terms
A quick primer: how do you estimate tasks?
Two typical ways are:
- effort-based
- time-based
Effort-based
Recommended reading: Fibonacci scale (agile)
“Effort-based” tends to make more sense to engineering teams, because it represents the relative complexity of a task. For example, the Agile software development approach considers using the fibonacci scale (or even t-shirt sizes).
The fibonacci scale ([1, 2, 3, 5, 8…]) is used because as a task increases in complexity, it’s harder to accurately determine effort needed to complete it. Using the fibonacci scale, a task with an estimate of 1 might be “relatively simple”, and a task with an estimate of 8 might be “significantly more complex”.
When numbers increase, it’s harder to tell the difference between two numbers that are both very large (when I was a child, anybody who was older than 13 was an adult, and anybody who was older that 20 was old).
For example, what is the difference between a task that’s estimated at 50, versus a task that’s estimated at 51? It’s hard to say.
So, we don’t use 50 and 51. We would instead step to either 34 and 55, or 55 and 89 (2 pairs of numbers within the fibonacci sequence):
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…
Again, these are all relative terms; but, stakeholders don’t want to hear about “relative effort”. You need to meet a deadline.
Time-based (and the importance of intuition)
Recommended reading: Software development effort estimation
Hofstadter’s Law: It always takes longer than you expect, even when you take into account Hofstadter’s Law.
In practice, time-based estimation requires experience. In a perfect world, you should have the engineer who will be working on the task give input on the estimate (and, optimally, this engineer has had experience dealing with other similar tasks). This, however, depends heavily on your organizational structure, and is much more effective in smaller teams.
In other words, the optimal person to be estimating the task is unconsciously competent (or, a person whose intuition can be reasonably trusted).
When we look at the stages of competence, we see that people generally fall into 1 of 4 categories:
1 - Unconscious incompetence
The individual does not understand or know how to do something and does not necessarily recognize the deficit. They may deny the usefulness of the skill. The individual must recognize their own incompetence, and the value of the new skill, before moving on to the next stage. The length of time an individual spends in this stage depends on the strength of the stimulus to learn.
2 - Conscious incompetence
Though the individual does not understand or know how to do something, they recognize the deficit, as well as the value of a new skill in addressing the deficit. The making of mistakes can be integral to the learning process at this stage.
3 - Conscious competence
The individual understands or knows how to do something. However, demonstrating the skill or knowledge requires concentration. It may be broken down into steps, and there is heavy conscious involvement in executing the new skill.
4 - Unconscious competence
The individual has had so much practice with a skill that it has become “second nature” and can be performed easily. As a result, the skill can be performed while executing another task. The individual may be able to teach it to others, depending upon how and when it was learned.
An engineer who is in stages 1 or 2 will generally provide an unreliable estimate (but will gradually begin to provide more accurate estimates as they gain more experience, given that they also learn to overcome certain psychological barriers that I’ll discuss later).
It may concern some readers that I used the word “intuition” when describing estimating an engineering task. In other words, “intuition” isn’t quantifiable, so the two concepts seem juxtaposed.
However, the intuition comes after already diving in-depth into each individual component of the task (which I will also discuss more in detail later).
To give more light on these seemingly contradictory ideas, we can look at Richard Mueller’s framework for decision-making (he is a professor of physics at UC Berkeley):
Rosemary once told me that she approaches all important questions in the same way:
- Analyze the issue to death. Gather all the numbers, all the facts, put them (if possible) on a spreadsheet. Create an evaluation function to weigh the importance of all the numbers and facts (she was a math major), and see what the computer says. (Actually, you can do most of this in your head.) Then analyze it a different way. Compare conclusions.
- Then, having completed Step 1, ignore the results, and base your conclusion on your feelings.
That sounds contradictory, but I don’t think it is. Facts and numbers are important, but they can be misleading. Moreover, your own evaluation function, based on what you think is important to you, may be completely wrong. We often can’t articulate what is really important to us. Maybe we don’t even know.
Now, this is in the context of personal decision-making, but we can learn some important lessons that translate over to our current context.
Firstly, it is important to analyze the facts to death (i.e., each individual piece of the task), and then it’s equally as important to listen to your gut.
We can also look at Gavin DeBecker’s book “The Gift of Fear” for another lesson that can be useful in our context. He says:
Intuition is always right in at least two important ways; it is always in response to something. It always has your best interest at heart
Again, this is out of context, but the lesson we can learn from this is that after analyzing the facts to death, you should also listen to what your intuition is saying, because it’s trying to help you.
 Add a buffer if your gut tells you something doesn’t sound right (cognitive dissonance), and feel free to subtract from the estimate if your gut tells you that it won’t actually take “that long” (for whatever reason).
The important considerations here are the “unknowns”, which generally influence your intuition:
- known unknowns
- unknown unknowns
“Known unknowns” are things that you know you don’t know, and don’t have information for yet. If these are present, then you know you should add a little extra buffer, just in case.
“Unknown unknowns” are even worse. What if you implement this new caching system, and something comes up that you never even thought to think of?
These two categories of “unknowns” are generally present in more complex tasks (and can be present in simple tasks), but the simpler the task is in complexity, the easier it is to reliably estimate (and even cut off time during your final gut check) because there simply may not be any “unknowns” (aside from irrelevant situations that may affect your task completion, like unrelated server issues, etc.)
In the conclusion of this post, I’ll give an example of merging the “effort-based” and “time-based” frameworks for estimating a task.
The psychology of estimating
Here we’ll discuss barriers to accurately estimating (and how these also affect even experienced engineers’ intuition):
- Planning Fallacy
- Dunning-Kruger Effect
- Anchoring (false premises)
- Obedience to Authority
- Rebellion (silent or active)
Before we dive in, it is worth it to explain why I included this section.
You should look at psychological factors as external forces that – unbeknownst to you – are attempting to influence your decision-making: once you are aware of these phsycological influences and can define them (and see the role they’re playing in your own thought processes), the easier it is to work past them.
In other words, you can discover your own natural biases and prevent them from limiting you. But, the first step is to be aware of them.
Planning fallacy
This is a simple one:
a phenomenon in which predictions about how much time will be needed to complete a future task display an optimism bias and underestimate the time needed.
The takeaway here is: be skeptical of your optimism about a task. On the other hand, also be careful of your own skepticism. The key is to find a balance.

In other words, this is a good lesson in humility, especially for new engineering who might be feeling a bit of impostor syndrome.
The takeaway here is: be humble about yourself and your capabilities, and seek as much information as is reasonably appropriate before making an important decision.
“Can I really do this in a day? Can I implement that algorithm from scratch? Whose help will I need? What resources should I use?”
Anchoring
a cognitive bias that describes the common human tendency to rely too heavily on the first piece of information offered (the “anchor”) when making decisions. During decision making, anchoring occurs when individuals use an initial piece of information to make subsequent judgments. Once an anchor is set, other judgments are made by adjusting away from that anchor, and there is a bias toward interpreting other information around the anchor. For example, the initial price offered for a used car sets the standard for the rest of the negotiations, so that prices lower than the initial price seem more reasonable even if they are still higher than what the car is really worth.
In our case, this is also means that we need not to be scared of readjusting estimates when we have more information. For example, if in a meeting with managers, we say “this sounds like something that could take about a week”, and then come back a couple days later after thinking about it more and saying “this will take 2 weeks”, we had already based all of our other discussions over those couple of days on the idea that the task would take a week, and we are more resistant to being open to discussing a new estimate, even when we have new information (more on this in the section about communicating with stakeholders).
“You said it was gonna take a week… now you’re saying it’s gonna take longer? Why’d you tell me a week, then, in the first place?”
The takeaway here is: as a company, don’t be afraid of flexibility. Don’t anchor yourself to initial premises that can be proved wrong once you get new information.
Also, try not to go fishing for estimates at inappropriate times.
This is related to the logical fallacy of drawing conclusions based on false premises.
Obedience to Authority
Obedience is a form of social influence where an individual acts in response to a direct order from another individual, who is usually an authority figure. It is assumed that without such an order the person would not have acted in this way.
This isn’t meant to say that you shouldn’t listen to your boss: instead, it is important to keep in mind that you might easily feel pressured into giving an inaccurate estimate because you don’t want to disappoint your boss with an estimate he or she didn’t expect (more on this in the section about communicating with stakeholders).
The takeaway here is: be honest in your estimates, even if it isn’t pleasant.
This is extremely important, too, for the person who is going to be doing the work. If you tell your boss that it’ll take a day, knowing that it will take a week, you’re doing disservice to yourself, and everyone else:
- there’s no way you’re gonna get it done in a day, unless you sacrifice your own well-being
- you will be perceived more and more as incompetent in your estimations
- end result: you didn’t deliver on time, and possibly negatively impacted the business
Rebellion (silent or active)
In contract to “Obedience to Authority”, you might feel oppressed by your boss and feel the need to give inappropriate estimates in order to spite him or her, because after all, you are in control of the work output. Without you, your boss would need to find another engineer to do the work. This gives you leverage. However, it’s important to keep this in mind as well: the important thing is the success of the business (because, after all, it benefits you, especially if you have equity). The key principle you should keep in mind is that you are in search of a correct estimate, but not necessarily an estimate that is pleasing to you. The two should not be conflated.
This is very similar to the concept of finding a correct solution, and not just being biased towards your own solution (“leaving your ego at the door”).
The takeaway here is: you’re on the same team. You all succeed together.
Now that we’re aware of psychological and logical barriers to providing estimates, let’s discuss how to communicate to the bosses.
Communicating with stakeholders
In this context, we’ll think of “stakeholders” as anybody else who is not an engineer, and who has a degree (limited or otherwise) of influence in your decision-making and the trajectory of the business.
We’ll discuss some common situations, and how to deal with them:
- Us vs. them
- Ineedanestimatenow-itus
- Trust issues (sandbagging, honesty, incompetence, black swan)
- Communication friction
Us vs. them
I want to talk about this one first, because it’s very important. Generally, engineers view businesspeople as just that… “the businesspeople”. You know, the oppressive authority figures lurking in the shadows.
However, we want to limit this dynamic as much as possible. Just like salespeople shouldn’t refer to operations professionals as gatekeepers, engineers shouldn’t think of businesspeople as “the other guys”.
Although there can be frequent friction and conflict, the important thing is to understand that you are both attempting to achieve a mutual goal. When the boss says, “why isn’t this done yet?”, it’s probably not because he or she wants to make your life miserable; instead, it’s because your boss (especially if your boss is someone in the C-Suite) has vested emotional interest in the outcome of the company (or, maybe you’re working for a middle-manager who’s just an asshole, but usually you only start encountering these issues at larger firms, since hiring in small organizations and startups can be very selective, and cultural fit is a key aspect that’s looked at… usually).
Assuming that it’s not the latter case (and your boss isn’t just a salty middle-manager), we can then conclude that there are 1 or 2 issues here:
- the boss’s perception is that you’re purposely resisting them, and/or
- you’re not doing a good job of communicating your decision-making
Usually, the 2 issues are related (a vicious cycle).
Maybe the boss has had prior experiences with lazy engineers or free-loaders, and their default view (the premise from which they base their conclusions – their operating principle) is that other engineers will probably be the same. They are inherently skeptical. This is not your problem, it is theirs. However, you still need to be on the same team. You can still take steps to alter this dynamic.
Or, maybe the boss’s trust issues stemmed from your bad job at communicating your decision-making in the first place. You make silent decisions that affect scope of work, and the boss is left in the dust, confused about the progress of work, and thinking that there was no plan. Maybe the boss is flexible, but you’re not communicating your flexible decisions appropriately.
Remember, if this person has vested emotional interest in the outcome of the company, anything that may stand in the way of that is unconsciously (or worse, consciously) branded as an enemy.
We can see, then, that the fault isn’t always necessarily just one person’s. We can alter this dynamic through effective communication (I’ll discuss this after the next few sections).
Ineedanestimatenow-itus
Your boss asks, “I know it’s hard to give an estimate right now, but if you had to guess, how long do you think this could take?”
What do you respond with?
Optimially, he or she gives you space to be able to say, “I’d love to throw something out there, but I think my best bet might be to let this all churn in my head a little first, and then I can come back to you with something that makes sense.”
But, what if they insist? Well, this may be a good opportunity to explain something we’ve already talked about before: anchoring. The tactic would be to preface your gut estimate with a warning about the anchoring fallacy.
“For the sake of discussion, we can frame our thinking right now based on the idea that this could take about a week, but let’s be flexible; I need to look into more, and then I can give you a more reliable initial estimate.”
Optimally, everyone should be on the same page on how we, as a team, handle “initial gut estimates”. There can be many tactics for this:
- Give a quick organized presentation to the team on the psychological barriers we talked about above
- Or, have a one-on-one with the person who has Ineedanestimatenow-itus, and explain the issues that this can cause. Remember to frame it in the correct context: you are both on the same team, and you want to be able to give a reliable estimate and not be anchored to an unreliable one. This is for the benefit of the business.
As a side note, this StackExchange post echoes my point by quoting The Pragmatic Programmer:
What to Say When Asked for an Estimate
You say “I’ll get back to you.”
You almost always get better results if you slow the process down and spend some time going through the steps we describe in this section. Estimates given at the coffee machine will (like the coffee) come back to haunt you.
Trust issues
Sandbagging
hiding the strength, skill or difficulty of something or someone early in an engagement
This can occur when you accidentally overestimate a task, and complete it earlier than intended. If this happens often, it looks like a tactic, and can cause trust issues.
This brings up 2 important points:
- be thorough in your estimates
- communicate, communicate, communicate
I hate to place all the blame on the engineer for not communicating properly. However, you should have some tactics in mind for when someone asks you the question, “why were you able to complete this so quickly?”
A good response might be:
“Well, I did my best to estimate accurately, but it turns out, I was actually able to build on top of some good previous architectural decisions [resuable components, etc.]”
This also gives emphasizes a good point to the questioner: it is important to invest time in good architecture.
Perceived incompetence
This is opposite to sandbagging. This happens when you tend to underestimate tasks, and exceed deadlines. If it happens once, ok. If it happens twice, you need to re-evaluate your system. If you it happens three times, there’s a major issue.

Unfortunately, those two ideas can get easily conflated.
Honesty
Always, always, always, be honest with your estimates. If you succumb to the “Obedience to Authority” fallacy (or on the opposite end of the spectrum, “Rebellion”), then this is the quickest way to put yourself in a situation where you can’t be trusted – and the worst part is, you could’ve avoided it in the first place. You know when you’re being honest, and you know when you’re being dishonest. Choose to be honest.
Black swan theory
1 - The event is a surprise (to the observer).
2 - The event has a major effect.
3 - After the first recorded instance of the event, it is rationalized by hindsight, as if it could have been expected; that is, the relevant data were available but unaccounted for in risk mitigation programs. The same is true for the personal perception by individuals.
This is when you’re blamed for an “unknown unknown”, with the assumption that it could’ve been predicted based on the information at the time. It’s easy to armchair quarterback engineers.
It is important to communicate up-front about your estimates, and everybody should be on the same page that “shit happens”.
Communication friction
You and stakeholders are on the same team; you just communicate in different terms.
There is a difference between “dealing with” businesspeople, and being on the same team as them. You should re-frame your thinking in your interactions if you, by default, view them as people to be “dealt with”. If you don’t, you will set yourself up for failure.
Once you operate from this principle, you can then delve into methods for reducing friction in communication:
- metaphors
- business terms
Metaphors
This one kind of makes me laugh out loud, but it’s very useful.
 When someone says “server”, you might know to ask: “you mean, the app server or the db server?”.
Other people probably don’t.
So, explain it in non-technical terms. The easiest way to do this sometimes is with metaphors.
- What’s the difference between changing styles and adding functionality? That’s like re-painting a house versus installing new electrical wiring. Re-painting is easier; re-wiring takes a lot of different kind of effort.
- What does it mean that the process is running out of memory? It’s like when the drain gets clogged and the sink starts to overflow.
 I have to control this impulse as well.  And you are not superior to them because you are; you just have different sets of skills and knowledge.
Business terms
When discussing trade-offs and implementation, talk about them in business terms.
- “If we don’t spend time on configuring our database to support encryption-at-rest, this could open us up to leaking customer data, which could bring down the business.”
- “If we don’t spend the time to implement this caching mechanism correctly, then critical customer information can be operated on when it’s potentially out-of-date, and cause rippling effects throughout the system; this would take days to fix, and then we can implement feature X, Y, and Z.”
The boss only cares about good engineering practices to the extent that it makes the product better and mitigates risk to the business. And so should you.
In other words, the boss is a good check/balance on your ability to be pragmatic. He is completely uninfluenced by any tech implementation details; he just wants something that works, and works well.
Keep this idea in mind. It is useful to you. Use this ignorance to your benefit.
Conclusion
Let’s do a real-world example to help put this into our context:
- You are designing an admin page that displays a list of users
- You are using a RESTful API on a Node.js back-end, and Angular on the front-end
- We already have a “grid component” (say, using Kendo Web UI Components), which we’ve determined is suitable for most of our internal admin display pages
The components involved in a time-based estimate for this task are:
- A server endpoint to retrieve a list of users (only authorized people can query this endpoint)
- A UI component to draw the users on an internal admin webpage
The effort here is minimally complex. We already have most of our basic components to work with. We’ll call this a “3” in complexity.
How does this translate to time though? What’s involved in setting up the REST endpoint? What about the grid to draw the list of users?
Ok, the server endpoint will take an hour:
- attach the endpoint to Express router
- ensure only authorized users can access it
- write a damn unit test
- ask someone for a code review and merge the PR
Side note: Always account for testing, code review, and deployment.
The UI is super simple; just need to wire up an existing component. That’s a half hour.

It was a minimally complex task (a “3”), but the time necessary is about 2 and a half hours. What’s the gut check on that? You will know, if you know your system. To me, something like this “feels” right. 2 and a half hours is probably more than enough to get through this, and it feels safe.
Remember, throughout all of this, we need to be communicating. If something changes, tell the boss about the business implications. Why is it more important to spend time on a different part of it? What is the important of having a unit test for it?
If takes less time than you originally thought, you’re not sandbagging. You built on top of previous good architecture. But, it’s important to keep this in mind when analyzing your estimate in the first place. You need to hit your mark.
There is a soft counterpart to the technical implementation of a system. Use it to your advantage.


The Best Disney+ Movies You Actually Have To Search For
by Josh OcampoDisney+ is finally available in Australia. The Netflix competitor comes with over 600 Disney movies, which can be a lot to sift through. With that in mind, here are some highlights to get you started that you won't find on the front page.
By now, you probably know that Disney+ is home to a bunch of Pixar, Marvel and Star Wars titles, including the Toy Story trilogy, every Avengers movie and The Last Jedi. But judging by the response on social media, the most exciting thing about the service is the huge back catalogue of Disney shows and movies you once loved and cherished.
While our friends at Gizmodo have compiled the absurdly long list of movies and TV shows as part of the announcement, who is actually looking forward to streaming the very mediocre sequel to Twitches?
Instead, defer to our list of the best — and we mean best — film and TV coming to Disney+, beginning with some classics (and then followed by some Lifehacker staff favourites.) Enjoy!
The classics
- 101 Dalmations
- 20,000 Leagues Under the Sea
- Aladdin
- Alice in Wonderland
- The Aristocats
- Bambi
- Cinderella
- Dumbo
- Escape to Witch Mountain
- A Goofy Movie
- Honey, I Shrunk the Kids
- Journey to the Centre of the Earth
- The Jungle Book
- Lady and the Tramp
- Little Mermaid
- The Lion King
- Mary Poppins
- Miracle on 34th Street
- The Muppet Movie
- Newsies
- Old Yeller
- Peter Pan
- Pochahontas
- Pollyanna
- Robin Hood
- The Sound of Music
- Tron (and Tron Legacy)
- Turner & Hooch
- Who Framed Roger Rabbit
Our favourites
- Blank Check
- Brink!
- The Cheetah Girls
- Double Teamed
- Even Stevens
- Halloweentown
- Heavyweights
- Hocus Pocus
- Johnny Tsunami
- Kazaam
- Lizzie McGuire
- The Luck of the Irish
- Mum’s Got a Date with a Vampire
- Motocrossed
- Mulan
- The Parent Trap
- Phantom of the Megaplex
- Recess
- Rip Girls
- The Sandlot
- Smart House
- Smart Guy
- Sister Act
- Sister Act 2: Back in the Habit
- Spider-Man: Unlimited
- The Thirteenth Year
- Zenon: Girl of the 21st Century
If you want to sign up for Disney+, head over to their website; streaming will cost $8.99 a month (or $89.99 for a year).


Select Top N
Select the top N nodes based on a type
Select the top N nodes based on a node/transaction type and the count of transactions between the nodes.
This utility plugin automates an analytic that could also be achieved via the histogram in a few steps.
NOTE: If multiple nodes are selected then a top N will be calculated for each node.
Parameters
- Mode - The graph element (node, transaction) whose types you want to filter on
- Type Category - The category of the type which needs to be selected first
- Specific Types - The specific types to be included when calculating the top N
- Limit - The limit (i.e. the value of N). Default is top 10


DC changed 09:13am
DC Changed 09:17am on local branch
DC Changed 09:25 on local branch
Resolved conflicts and adding changes : AK 09.25am
Change by AT 9:18
AK: change on AT local branch 09.43
AK: change to AT_LOCAL branch.
AK: 2nd change to AT_LOCAL branch.
AT: new change


Forrest Gump (1994) A movie review by Serdar Yegulalp (C) 1997 by Serdar Yegulalp
CAPSULE: A cultural landmark despite its many flaws, GUMP is at the very least unique.
Many movies are about people who are unintentionally depicted as stupid, and are therefore boring to watch. FORREST GUMP is about a man who is not intelligent, but is never boring to watch, because the way he reacts to his improbably dreamlike existence is the very substance of this unique but troubled movie.
The very oddest thing about FORREST GUMP is how some parts of it work so well and come so naturally, and how other parts of it are at such odds with the rest of the film. I wondered how no one making the movie could sense the inherent schizophrenia. And yet, as a whole, the movie works in ways that defy description. It's vastly overrated, but it's still worth seeing.
Forrest is played with the grace of a tightrope walker by Tom Hanks. He (Gump) is mildly retarded; he has an IQ of 75 at the movie's start and stays pretty much on that level all the way through. His trove of facts increases, but his basic methodology of handling the world never changes. As a boy, with braces on his legs, he peers at life and expects little more than to be heard and acknowledged, and the first person aside from his doting mother to do that with him is his lifelong love, Jenny (played glowingly by Robin Wright, of THE PRINCESS BRIDE).
 He couples that with advice from Jenny -- that the best thing to do when you're in trouble is just run -- and this becomes the big asset that gets him through college on a football scholarship. And the one thing that gets him through Vietnam, allowing him to save most of his platoon and receive the Congressional Medal of Honor*. Although he rescues his platoon leader (Gary Sinise), the man has nothing but rancor and bitterness, since he lost his legs, while Gump only got shot in the rear (in a development which starts funny and then gets tiresome).
Good luck rains down on Gump the way bad luck rains down on the rest of us. He goes on to be the captain of a shrimp boat, a Ping-Pong champion (clobbering the Chinese in the process), a millionaire, a cross-country runner. The sly thing about the movie is the way he just sort of backs into everything, doing what comes naturally, and is even happy when nothing happens. All he wants out of life is the love of a woman, even though she's a damaged and desperate person who frantically avoids real love out of the fear that she will just bring a person that's better than her down.
Too much of any one thing in Hanks' performance would have sent the whole thing crashing down. The balance is almost unbelieveable: it's no wonder he won an Oscar for this role.  He understands just enough about evil to know that it's something to be avoided, and leaves the analysis to someone else. He asks himself a question at the end of the movie -- do we have a destiny, or are we just playthings of destiny? -- and based on everything he's seen, he's convinced the answer is a little of both.
The movie throws this into sharp relief with Sinise's character -- a man who has been screwed badly, but eventually finds a kind of peace with himself, when he realizes he wanted to die nobly but on false pretenses.
There are two big trends in the movie that work against it.  Another is the way he's consistently involved with high-profile historical figures in ways that are totally peripheral and only used to make shallow historical pointers. (The scene where he "accidentally" spills the beans on the Watergate break-in, for instance.) After a while, I started questioning the wisdom of this whole strategy: What was the real point, story-wise, of having him intersect with such high-profile fate? To further throw his attitude about life into sharp relief? It only makes us conscious of how the screenwriter (Eric Roth) is employing the whole thing as a manipulative gimmick.
This attitude extends into other areas of the movie. In another scene, Forrest, still in his Army outfit, winds up at a peace rally, and when asked to speak about the war, the PA malfunctions and all we see is his mouth moving. The scene serves ultimately only to reconnect him with Jenny, so it's another irritating throwaway. I, for one, would have loved to hear what he had to say. The way the script sabotages its own development through scenes like this is annoying; it makes the Gump character into a gimmick, not a person.
There's also a tendency throughout the movie to paint people that have more discrimination and analysis than Forrest in their blood as buffoons: a scene in a Black Panther cell, for instance, or a scene where he's mobbed by reporters and hangers-on when running cross-country. Gump isn't morally superior to these people (how could he be?), just differently motivated, and to try and make them look like fools is itself foolish. It's a troubling sign that the filmmakers themselves didn't quite understand what they were doing, that they hadn't quite taken the extra step in making the film more than just the sum of its ingredients.
And yet, what an unmistakeably different movie this is, and at times, a very moving one. The best moments are the simplest: The ice cream in the bedpan. The ping-pong matches. Or when Forrest finds Jenny as a stripper, or when he has his son introduced to him for the first time. I am reminded strongly of BEING THERE, the mind-blowing film in which Peter Sellers played a simpleminded man whose entire outlook on life has been formed by television, and how his attitude is misperceived by everyone who comes into contact with him. BEING THERE was far wickeder and knowing that GUMP, and contained a final shot that even today people still have heated arguments about. GUMP never quite has a moment like that, sadly.
Two and a half out of four feathers.
* A friend of mine, who was in the service, commented that Sinise's
character would have been required to put in a recommendation in order for
Gump to win the medal. I decided that the movie wasn't ultimately
interested in the factual details of his life, but it did irk me.
<EMAIL_ADDRESS>EFNet IRC: GinRei
http://www.io.com/~syegul another worldly device...
Finger me on IRC for address for after-hours (EST) experimental HTTP server.
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


@* * Copyright 2023 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import controllers.routes.SignOutController @import scala.concurrent.duration.Duration @(keepAliveUrl: String, timeout: Duration, countdown: Duration)(implicit messages: Messages)


Simplistic design can enhance any existing smoke detection system.
There is no need to purchase new fire alarms. With our compact chip, you can easily bring your home's security to the next level.
Real-time notifications
In case of a fire, your family and a circle of close friends will be notified. Easily let them know when you are safe.
A fraction of the cost of competitors
We keep prices low, without sacrificing quality. We provide exactly what you need to keep your home safe.
Did you know?
In 2012, there were 365,000 house fires,
causing over $7.5 million in damages.


| Number of Classes | Line Coverage | Mutation Coverage |
|---|---|---|
| 4 | 17% | 16% |
| Name | Line Coverage | Mutation Coverage |
|---|---|---|
| EncodeChromeUrl.java | 100% |
100% |
| Find.java | 0% |
0% |
| FindAll.java | 0% |
0% |
| FindOrReturn.java | 0% |
0% |


053,530,984,91,392,445,188,792,230,535,1195,791,573,107,394,550,425,430,515,405,195,466,475,448,146,809,182,1134,35,675,437,192,245,200,785,1005,1152,960,732,1125,459,684,574,263,735,609,12


X Factor's Dermot stutters as he almost forgets Love Islanders' names live on air
The X Factor: Celebrity presenter was almost left red-faced after struggling to recall their names
by Rose Hill, https://www.mirror.co.uk/authors/rose-hill/Dermot O'Leary was left stuttering live on X Factor tonight as he forgot the Love Islanders' names in an awkward moment.
The presenter was left stumbling after momentarily struggling to remember who Josh Denzel and Laura Anderson were.
Josh and Laura were supporting fellow Islanders Eyal Booker, Wes Nelson , Samira Mighty and Zara McDermott in the audience when Dermot came over to speak to them.
Welcoming viewers back from the ad break, Dermot began by saying: "I've managed to get a prime spot in the audience (I know the maitre'd!) right here with..."
Sitting down, he looked at Josh and Laura and appeared to struggle to remember their names.
However the names soon clicked and he said: "...Josh and Laura."
It was a night of awkwardness after Martin Bashir was left in tears as he tried to stop his performance twice.
The presenter, 56, looked lost on the stage as he forgot the lyrics to Lionel Richie's Easy.
However the judges didn't go easy on him, with Louis Walsh comparing him to a "drunken uncle at a wedding".
Judge Nicole Scherzinger hit back, saying that it was an "honour" to have him on the show.
In the middle of his performance, he shocked viewers and judges by announcing: "I've forgotten my words."
He tried to carry on but later added: "I do apologise."
Backstage, fellow star Victoria held her hands to her chest while Jenny looked on in horror.
Afterwards, Simon Cowell asked what had happened.
Martin claimed that a last minute song change was to blame for his lapse in memory.
"I'm not trying to make excuses but my song had to change," he said. "I've been anxious all evening and it went out of my mind."
*The X Factor: Celebrity returns next Saturday on ITV


This is a model of the mechanical part of one cylinder of an engine. It is similar to Loops.Engine1a. The difference is that a simple model for the gas force in the cylinder is added and that the model is restructured in such a way, that the central part of the planar kinematic loop can be easily replaced by the assembly joint "Modelica.Mechanics.MultiBody.Joints.Assemblies.JointRRP". This exchange of the kinematic loop is shown in Loops.Engine1b_analytic. The advantage of using JointRRP is, that the non-linear algebraic equation of this loop is solved analytically, and not numerically as in this model (Engine1b).
An animation of this example is shown in the figure below.


Quick Tips
Search (ICBOE only)
The following search fields are available when your Infor CRM installation includes an Infor CRM Back Office Extension integration and they supplement that in the Infor CRM Help:
-
Accounts
Search Fields
- ERP Customer ID : starts with
-
Account Persons
Search Fields
-
Back Offices
Search Fields
- Name : starts with
- Logical ID : starts with
-
Back Office Acounting Entities
Search Fields
-
Bill To Accounts
Search Fields
- Bill To Name : starts with
-
Contact Account
Search Fields
- Contact Name : starts with
-
Invoices
Search Fields
- Account Name : starts with
- Invoice ID : starts with
-
Invoice Items
Search Fields
- Line Number: starts with
- Product Name : starts with
- Product Description : starts with
-
Invoice Persons
Search Fields
-
Products
Search Fields
- Actual ID: starts with
- Family: starts with
- Name: starts with
-
Quotes
Search Fields
- Quote Number : starts with
- Account Name : starts with
- ERP Order ID : starts with
-
Quote Items
Search Fields
- Line Number : starts with
- Product Name : starts with
- Product Description : starts with
- Quote Number: starts with
-
Quote Persons
Search Fields
- Name: starts with
- Quote ID: starts with
-
Receivables
Search Fields
- Receivable ID: contains
- Account Name: contains
- Invoice ID : contains
-
Receivable Items
Search Fields
- Invoice ID: contains
- Receivable ID: contains
-
Returns
Search Fields
-
Sales Orders
Search Fields
- Sales Order Number: starts with
- Account Name: starts with
- ERP Order ID: starts with
- Customer PO: starts with
-
Sales Order Items
Search Fields
- Line Number: starts with
- Product Name: starts with
- Product Description: starts with
- Sales Order Number: starts with
-
Sales Order Persons
Search Fields
-
Shipments
Search Fields
- Account Name: starts with
- Shipment ID: starts with
-
Shipment Lines
Search Fields
- Line Number: starts with
- Product Name: starts with
- Sales Order ID: starts with
-
Ship To Accounts
Search Fields
- Ship To Name: starts with


--- layout: post title: "10 tips for better Pull Requests" description: "Making a good Pull Request involves more than writing good code." date: 2015-01-15 10:06 UTC tags: [Productivity] --- {% include JB/setup %}
{{ page.description }}
The Pull Request model has turned out to be a great way to build software in teams - particularly for distributed teams; not only for open source development, but also in enterprises. Since some time around 2010, I've been reviewing Pull Requests both for my open source projects, but also as a team member for some of my customers, doing closed-source software, but still using the Pull Request work flow internally.
During all of that time, I've seen many great Pull Requests, and some that needed some work.
A good Pull Request involves more than just some code. In most cases, there's one or more reviewer(s) involved, who will have to review your Pull Request in order to evaluate whether it's a good fit for inclusion in the code base. Not only must you produce good code, but you must also cater to the person(s) doing the review.
Here's a list of tips to make your Pull Request better. It isn't exhaustive, but I think it addresses some of the more important aspects of creating a good Pull Request.
A small, focused Pull Request gives you the best chance of having it accepted.
The first thing I do when I get a notification about a Pull Request is that I look it over to get an idea about its size. It takes time to properly review a Pull Request, and in my experience, the time it takes is exponential to the size; the relationship certainly isn't linear.
If I get a big Pull Request for an open source project, I do realize that the submitter has most likely already put in substantial work in his or her spare time, so I do go to some lengths to review a big Pull Request, even if I think it's too big - particularly when it looks like it's a first-time contributor. Still, if the Pull Request is big, I'll need to schedule time to review it: I can't review a big chunk of code using five minutes here and five minutes there; I need contiguous time to do that. This already introduces a delay into the review process.
If I get a big Pull Request in a professional setting (i.e. where the submitter is being paid to write the code), I often reject the Pull Request simply because of the size of it.
How small is small enough? Obviously, it depends on what the Pull Request is about, but a Pull Request that touches less than a dozen files isn't too bad.
Just as the Single Responsibility Principle states that a class should have only one responsibility, so should a Pull Request address only a single concern.
Imagine, as a counter-example, that you submit a Pull Request that addresses three independent, separate concerns (let's call them A, B, and C). The reviewer may immediately agree with you that A and C are valid concerns, and that your solution is correct. However, the reviewer has issues with your B concern. Perhaps he or she thinks it's not a concern at all, or she disagrees with the way you've addressed it.
This becomes the start of a lengthy discussion about concern B, and how it's being addressed. This discussion can go on for days (particularly if you're in different time zones), while you attempt to come to agreement; perhaps you'll need to make changes to your Pull Request to address the reviewer's concerns. This all takes time.
It may, in fact, take so much time that other commits have been merged into master in the meantime, and your Pull Request has fallen so much behind that it no longer can be automatically merged. Welcome to Merge Hell.
All that time, your perfectly acceptable solutions to the A and C concerns are sitting idly in your Pull Request, adding absolutely no value to the overall code base.
Instead, submit three independent Pull Requests that address respectively A, B, and C. If you do that, the reviewer who agrees with A and C will immediately accept two of those three Pull Requests. In this way, your non-controversial contributions can immediately add value to the code base.
The more concerns you address in a single Pull Request, the bigger the risk that at least one of them will block acceptance of your contribution. Do only one thing per Pull Request. It also helps you make each Pull Request smaller.
The reviewer of your Pull Request will most likely be reviewing your contribution using a diff tool. Both GitHub and Stash provide browser-based diff views for reviewing. A reviewer can even configure the diff view to be side-by-side; it makes it much easier to understand what changes are included in the contribution, but it also means that the code must be readable on half a screen.
If you have wide lines, you force the reviewer to scroll horizontally.
There are many reasons to keep line width below 80 characters; making your code easy to review just adds another reason to that list.
You may feel the urge to change the formatting of the existing code to fit 'your' style. Please abstain.
Every byte you change in the source code shows up in the diff views. Some diff viewers have options to ignore changes of white space, but even with this option on, there are limits to what those diff viewers can ignore. Particularly, they can't ignore if you move code around, so please don't do that.
If you really need to address white space issues, move code around within files, change formatting, or do other stylistic changes to the code, please do so in an isolated pull request that does only that, and state so in your Pull Request comment.
Before submitting a Pull Request, build it on your own machine. True, works on my machine isn't particularly useful, but it's a minimum bar. If it doesn't work on your machine, it's unlikely to work on other machines as well.
Watch out for compiler warnings. They may not prevent you from compiling, so you may not notice them if you don't explicitly look for them. However, if your Pull Request causes (more) compiler warnings, a reviewer may reject it; I do.
If the project has a build script, try to run that, and only submit your pull request if the build succeeds. In many of my open source projects, I have a build script that (among other things) treats warnings as errors. Such a build script may automate or implement various rules for that particular code base. Use it before submitting, because the reviewer most likely will use it before merging your branch.
Assuming that the code base in question has automated tests, make sure all tests pass before submitting a Pull Request.
This should go without saying, but I regularly receive Pull Requests where one or more tests are failing.
Again, assuming that the code in question already has automated (unit) tests, do add tests for the code you submit.
It doesn't often happen that I receive a Pull Request without tests, but when I do, I often reject it.
This isn't a hard rule. There are various cases where you may need to add code without test coverage (e.g. when adding a Humble Object), but if it can be tested, it should be tested.
You'll need to follow the testing strategy already established for the code base in question.
Self-documenting code rarely is.
Yes, code comments are apologies, and I definitely prefer well-named operations, types, and values over comments. Still, when writing code, you often have to make decisions that aren't self-evident (particularly when dealing with Business 'Logic').
Document why you wrote the code in the way you did; not what it does.
My preferred priority is this:
Write good code, but also write good prose. This is partly subjective, but there are rules for both code and prose. Code has correctness rules: if you break them, it doesn't compile (or, for interpreted languages, it fails at run-time).
The same goes for the prose you may add: Code comments. Commit messages. Pull Request messages.
Please use correct spelling, grammar, and punctuation. If you don't, your prose is harder to understand, and your reviewer is a human being.
Sometimes, a reviewer will point out various issues with your Pull Request, and you'll agree to address them.
This may cause you to add more commits to your Pull Request branch. There's nothing wrong with that per se. However, this can lead to unwarranted thrashing.
As an example, your pull request may contain five commits: A, B, C, D, and E. The reviewer doesn't like what you did in commits B and C, so she asks you to remove that code. Most people do that by checking out their pull request branch and deleting the offending code, adding yet another commit (F) to the commit list: [A, B, C, D, E, F]
Why should we have to merge a series of commits that first adds unwanted code, and then removes it again? It's just thrashing; it doesn't add any value.
Instead, remove the offending commits, and force push your modified branch: [A, D, E]. While under review, you're the sole owner of that branch, so you can modify and force push it all you want.
Another example of thrashing that I see a lot is when a Pull Request is becoming old (often due to lengthy discussions): in these cases, the author regularly merges his or her branch with master to keep the Pull Request branch up to date.
Again: why do I have to look at all those merge commits? You are the sole owner of that branch. Just rebase your Pull Request branch and force push it. The resulting commit history will be cleaner.
One or more persons will review your Pull Request. Don't make your reviewer work.
The more you make your reviewer work, the greater the risk is that your Pull Request will be rejected.