From version 1.0.3, the Toolkit supports tracing a path between a given source and target node using an Overlay.
// setup two nodes and connect
var toolkit = jsPlumbToolkit.newInstance();
var renderer = toolkit.render({
container:"myElement"
});
toolkit.load({
data:{
nodes: [ a bunch of nodes. let's pretend they have IDs from 1 - 34 ],
edges:[ a bunch of edges ]
}
});
var traced = renderer.tracePath({
source:1,
target:23,
overlay:"Arrow"
});
if (!traced) alert("There was no such path");
In this example we've attempted to trace an arrow overlay along the shortest path from node 1 to node 23, using the default animation options, which are:
You can change the default animation options if you need to:
var traced = renderer.tracePath({
source:1,
target:23,
overlay:"Arrow",
options:{
speed: 25, // pixels per second
rate: 60 // frames per second
dwell: 50 // dwell on intermediate elements for 50 milliseconds
}
});
The two examples given so far do not mandate any specific Path to travel from the source to the target, so the Toolkit will pick the shortest path (which is controlled by both number of hops and edge cost if you have provided that for any of your edges). However, you can supply any Path to this method, should you want to.
To get a Path that is not the shortest path you will need to make use of a nodeFilter
and/or edgeFilter
when you
call getPath
on some Toolkit instance, as discussed on this page. An example:
var path = toolkit.getPath({
source:1,
target:23,
edgeFilter:function(edge) {
return !edge.data.type == "aTypeIWouldIgnore"
}
});
This path can then be passed to tracePath
instead of providing a source
and target
:
renderer.tracePath({
path:path,
overlay:"Arrow",
options:{
speed: 25, // pixels per second
rate: 60 // frames per second
dwell: 50 // dwell on intermediate elements for 50 milliseconds
}
});
During the lifetime of a path traversal, the following classes are used:
| Class | Assigned To | Purpose |
|---|---|---|
| jtk-animate-node-traversing | Nodes | Indicates the path is currently dwelling on the given Node |
| jtk-animate-edge-traversing | EdgesIndicates the Edge is currently being traversed |
These events will be fired by the renderer during a path traversal:
| Event | Description | Parameters |
|---|---|---|
| startOverlayAnimation | Fired at the beginning of the traversal. | connection:Connection |
| endOverlayAnimation | Fired at the very end of the traversal. | connection:Connection |
| startNodeTraversal | Fired when a node has been reached and is being traversed. | {connection:Connection, element:DOM Element} |
| endNodeTraversal | Fired at the end of traversing a Node. | {connection:Connection, element:DOM Element} |


Contents
-
igv
-
Browser
-
disableZoomWidget()
-
enableZoomWidget(zoomHandlers)
-
toggletCursorGuide(genomicStateList)
-
toggleCenterGuide(genomicStateList)
-
getFormat(name)
-
loadTracksWithConfigList(configList)
-
loadTrack(config)
-
addTrack(track)
-
reorderTracks()
-
removeTrack(track)
-
findTracks(property, value)
-
reduceTrackOrder(trackView)
-
increaseTrackOrder(trackView)
-
setTrackHeight(newHeight)
-
resize()
-
repaint()
-
repaintWithLocusIndex(locusIndex)
-
update()
-
updateWithLocusIndex(locusIndex)
-
loadInProgress()
-
updateLocusSearchWithGenomicState()
-
syntheticViewportContainerBBox()
-
syntheticViewportContainerWidth()
-
viewportContainerWidth()
-
minimumBasesExtent()
-
goto(chrName, start, end)
-
zoomIn()
-
zoomOut()
-
selectMultiLocusPanelWithGenomicState(genomicState)
-
closeMultiLocusPanelWithGenomicState(genomicState)
-
multiLocusPanelLayoutWithTruthFunction(filterFunction)
-
emptyViewportContainers(trackContainer)
-
buildViewportsWithGenomicStateList(genomicStateList)
-
parseSearchInput(string)
-
getGenomicStateList(loci, viewportContainerWidth, continuation)
-
on(eventName, fn)
-
un(eventName, fn)
-
fireEvent(eventName, args, thisObj)
-
isLocusChrNameStartEnd(locus, genome, locusObject)
-
validateLocusExtent(chromosome, extent)
-
parseSearchResults(data)
-
initialize(options)
-
graphics
-
setProperties(ctx, properties)
-
strokeLine(ctx, x1, y1, x2, y2, properties)
-
fillRect(ctx, x, y, w, h, properties)
-
fillPolygon(ctx, x, y, properties)
-
strokePolygon(ctx, x, y, properties)
-
fillText(ctx, text, x, y, properties, transforms)
-
strokeText(ctx, text, x, y, properties, transforms)
-
strokeCircle(ctx, x, y, radius)
-
fillCircle(ctx, x, y, radius)
-
drawArrowhead(ctx, x, y, size, lineWidth)
-
dashedLine(ctx, x1, y1, x2, y2, dashLen, properties)
igv
Browser
Initializes the basic values for the browser itself, as well as setting up
mouse events and other handlers.
- options
- Set up initially
- trackContainerDiv
- Div that is meant to contain the tracks themselves
Turns off the widget that allows zooming in and out
Turns on the widget that allows zooming in and out
- zoomHandlers
- All pieces that need to be capable of zooming in/out
toggletCursorGuide(genomicStateList)
Enable/Disable cursor guides
- genomicStateList
- All pieces with loci to show a line through the cursor
toggleCenterGuide(genomicStateList)
Enable/Disable guide through the center of the track
- genomicStateList
- All pieces with loci to be split
Returns a format as long as it was supplied from the options list.
- name
- the format that is requested
- return ->
- the format
loadTracksWithConfigList(configList)
Load several tracks that are passed in as a list of configurations for each
individual track. Calls igv.Browser.loadTrack(config)
- configList
- An array of configurations for each respective track
- return ->
- all of the tracks that have been loaded
loadTrack(config)
Loads a specific track with a given configuration, requires a case added to the
config types
- config
- the configuration passed in for the track
- return ->
- the track that's been loaded
addTrack(track)
Add a track to the igv viewer, and ensure it fits properly into the containing
div element. Calls igv.Browser.reorderTracks()
- track
- the track that has been completely built to be added
reorderTracks()
Sort the tracks and ensure that they are in said order in the containing div
removeTrack(track)
Remove a selected track, and take it out of the container div.
- track
- track to remove; should be in the
findTracks(property, value)
Search for tracks that contain a particular value
- property
- property to search for
- value
- expected value for the property
- return ->
- the tracks with the requested value
reduceTrackOrder(trackView)
Move a track up the view to be higher up (lower order?)
Calls igv.Browser.reorderTracks()
- trackView
- the track to be moved
increaseTrackOrder(trackView)
Move a track down the view to be lower (higher order?)
Calls igv.Browser.reorderTracks()
- trackView
- the track to be moved
setTrackHeight(newHeight)
Set a new uniform height for the tracks
- newHeight
- pixel? height of the tracks
resize()
Calls a resize on everything renderable in the browser
repaint()
Calls a repaint on everything renderable in the browser
repaintWithLocusIndex(locusIndex)
Calls a repaint on Karyo, Ideo, and Viewports with a locus index
- locusIndex
- the index that needs to be repainted
update()
Updates the Locus Search, then updates the Genomic State, then renderables and
finally each of the individual tracks
updateWithLocusIndex(locusIndex)
Update the genomicState, then a specific locus of the genomicState, then
Ideo, Karyo, and Viewports. Update the center guide as well
- locusIndex
- the index of the genome
loadInProgress()
Check if any tracks are still trying to load and return that
- return ->
- boolean whether loading or not
updateLocusSearchWithGenomicState()
Updates the current locus being searched for data, and fire the event
syntheticViewportContainerBBox()
Object that describes the position and size of the div containing the genome
viewport.
- return ->
- rect with { position, width, height }
syntheticViewportContainerWidth()
Get the width of the viewport containing the tracks
- return ->
- number with width
viewportContainerWidth()
Get the visible width of a track (should be the same for all of them)
- return ->
- number width of the viewport
minimumBasesExtent()
- return ->
- 40...?
goto(chrName, start, end)
Updates the genomicState to go straight to a specified location given by the
chromosome, start base pair and end base pair. Ends by running
igv.Browser.update().
- chrName
- name of the chromosome
- start
- start base pair
- end
- end base pair
zoomIn()
Zoom into the tracks, only if all tracks have already finished loading
zoomOut()
Zoom out of the tracks, only if all tracks have finished loading
selectMultiLocusPanelWithGenomicState(genomicState)
Create a panel of locuses that match the given Genomic State. Calls
igv.Browser.multiLocusPanelLayoutWithTruthFunction(fn).
- genomicState
- state variable to try matching
closeMultiLocusPanelWithGenomicState(genomicState)
Close the panel of viewports that match the genomicState. Do this by only
leaving all of the other genomicStates open. Calls
igv.Browser.multiLocusPanelLayoutWithTruthFunction(fn).
- genomicState
- state variable to try matching
multiLocusPanelLayoutWithTruthFunction(filterFunction)
Filter genomicStates possible using the given function. Build the relevant
viewport. Calls
igv.Browser.emptyViewportContainers(trackContainer).
Then calls
igv.Browser.buildViewportsWithGenomicStateList(gsList)
- filterFunction
- function used to filter the genomicStates
emptyViewportContainers(trackContainer)
Remove everything from a specific track container.
- trackContainer
- container to empty
buildViewportsWithGenomicStateList(genomicStateList)
For each of the track views, update the relevant genomicStates.
- genomicStateList
- Array of genomicState objects that define what should be
placed in the viewport
Calls igv.Browser.getGenomicStateList(loci, viewportContainerWidth, continuation)
to fill the track containers with anything from the passed in string of loci.
- string
- Loci used in the search
getGenomicStateList(loci, viewportContainerWidth, continuation)
Takes the loci and maps it to a list of relevant genomicStates.
- loci
- array of locus strings (e.g.
'chr1:1-100'
, 'egfr'
)
- viewportContainerWidth
- width of the viewport in pixels
- continuation
- callback to receive the genomicStates list.
on(eventName, fn)
Set up a callback under an event name
- eventName
- evnt to be fired on
- fn
- function to fire with the event
un(eventName, fn)
Unsubscribe a function from an event
- eventName
- Event to unsubscribe from
- fn
- Function to remove from firing
fireEvent(eventName, args, thisObj)
Set off an event with the object and any relevant arguments
- eventName
- event to fire
- args
- arguemnts to fire the event into
- thisObj
- object to set as the scope for the event handler
isLocusChrNameStartEnd(locus, genome, locusObject)
Create a #locusObject out of a passed in locus string with a given genome.
- locus
- string for the locus (e.g.
'chr1:1-100'
, 'chr2'
)
- genome
- relevant genome to search into
- locusObject
- where to return into
validateLocusExtent(chromosome, extent)
Ensure that the extent (start, end) of the chromosome is valid in the browser's
igv.Browser.minimumBasesExtent(). Fix the
extent to be valid once the function finishes.
- chromosome
- the chromosome we're checking
- extent
- start, end range to check
parseSearchResults(data)
Parse the line-oriented search results
- data
- the line-oriented search results
- ex:
EGFR chr7:55,086,409-55,123,543 refseq
initialize(options)
Works through the config and sets up igv variables
Called from igv.Browser()
- options
- initial config for setting up
graphics
Handles Canvas graphics via function calls. Everything requires a context
(usually denoted ctx
).
setProperties(ctx, properties)
Set properties of the context itself
- ctx
- context for drawing on the canvas
- properties
- { key: value } objects for the properties
strokeLine(ctx, x1, y1, x2, y2, properties)
Draw a line on the screen from (x1, y1) to (x2, y2) using any properties passed
as well.
- ctx
- context for the canvas
- x1, y1, x2, y2
- integer values for coordinates
- properties
- properties of the lines themselves
fillRect(ctx, x, y, w, h, properties)
Draw a filled in rectangle on the screen, from (x,y) as the top left and (w,h)
as the dimensions of the rectangle.
- ctx
- context of the canvas
- x, y
- coordinates on the canvas
- w, h
- dimensions of the rectangle
- properties
- relevant properties to use for drawing
fillPolygon(ctx, x, y, properties)
Draw a filled in polygon on the screen.
- ctx
- context for the canvas
- x
- array of X coordinates for drawing
- y
- array of Y coordinates for drawing
- properties
- relevant properties to use for drawing
strokePolygon(ctx, x, y, properties)
Draw an outlined Polygon on the screen.
- ctx
- context of the canvas
- x
- array of X coordinates for drawing
- y
- array of Y coordinates for drawing
- properties
- relevant properties to use for drawing
fillText(ctx, text, x, y, properties, transforms)
Normal text drawing on the canvas?
- ctx
- context for the canvas
- text
- what to write onto the canvas
- x, y
- coordinates of the bottom left of the text on the canvas
- properties
- how to draw the text
- transforms
- how to adjust the text
strokeText(ctx, text, x, y, properties, transforms)
Outline the text on the canvas
- ctx
- context for the canvas
- text
- what to write onto the canvas
- x, y
- coordinates of the bottom left of the text on the canvas
- properties
- how to draw the text
- transforms
- how to adjust the text
strokeCircle(ctx, x, y, radius)
Outline a circle on the canvas
- ctx
- context for the canvas
- x, y
- coordinates of the center
- radius
- radius out of the center
fillCircle(ctx, x, y, radius)
- ctx
- context for the canvas
- x, y
- coordinates of the center
- radius
- radius out of the center
drawArrowhead(ctx, x, y, size, lineWidth)
- ctx
- context for the canvas
- x, y
- left center of the arrowhead
- size
- height/width of the arrowhead
- lineWidth
- width of the stroking line
dashedLine(ctx, x1, y1, x2, y2, dashLen, properties)
- ctx
- context of the canvas
- x1, y1, x2, y2
- coordinates of the beginning and end of the line
- dashLen
- length of individual dashes
- properties
- properties of the lines


{% extends "layout.html" %} {% block page_title %} Home Office - Visa and Immigration {% endblock %} {% block content %} {% include "includes/phase_banner_alpha.html" %} {% include "includes/outgoing-header.html" %} {% include "includes/applicant-details.html" %} Email failed to send There was a problem with the email address Please amend in CID and start again Start again {% endblock %}
There was a problem with the email address
Please amend in CID and start again


First Name
Last Name
Mobile Phone
Email Address
Username
Password
Confrim Password
Enable 2 factor authentication using mobile phone texting
Subscribe to newsletter
I've read the terms and conditions
Submit
Login
Remember me
Sign in


| Package | Description |
|---|---|
| org.apache.drill.exec.physical.impl.scan |
Defines the scan operation implementation.
|
| org.apache.drill.exec.physical.impl.scan.v3 |
Provides the "version 3" scan framework (which can also be thought of
as EVF version 2).
|
| org.apache.drill.exec.physical.resultSet |
Provides a second-generation row set (AKA "record batch") writer used
by client code to
Define the schema of a result set.
Write data into the vectors backing a row set.
|
| org.apache.drill.exec.physical.resultSet.impl |
Handles the details of the result set loader implementation.
|
| org.apache.drill.exec.store.avro | |
| org.apache.drill.exec.store.easy.text.reader |
Version 3 of the text reader.
|
| Modifier and Type | Method and Description |
|---|---|
protected void |
BaseScanOperatorExecTest.BaseMockBatchReader.writeRow(RowSetLoader writer,
int col1,
String col2) |
| Modifier and Type | Method and Description |
|---|---|
RowSetLoader |
FixedReceiver.rowWriter() |
| Modifier and Type | Method and Description |
|---|---|
protected void |
BaseMockBatchReader.writeRow(RowSetLoader writer,
int col1,
String col2) |
| Modifier and Type | Method and Description |
|---|---|
RowSetLoader |
RowSetLoader.addRow(Object... values)
Write a row of values, given by Java objects.
|
RowSetLoader |
RowSetLoader.addSingleCol(Object value)
Similar to
addRow(Object...) , but for the odd case in which a
row consists of a single column that is an object array (such as for
a list or map) and so is ambiguous. |
RowSetLoader |
ResultSetLoader.writer()
Writer for the top-level tuple (the entire row).
|
| Modifier and Type | Class and Description |
|---|---|
class |
RowSetLoaderImpl
Implementation of the row set loader.
|
| Modifier and Type | Method and Description |
|---|---|
RowSetLoader |
RowSetLoaderImpl.addRow(Object... values) |
RowSetLoader |
RowSetLoaderImpl.addSingleCol(Object value) |
RowSetLoader |
ResultSetLoaderImpl.writer() |
| Modifier and Type | Method and Description |
|---|---|
List<ColumnConverter> |
ColumnConverterFactory.initConverters(TupleMetadata providedSchema,
TupleMetadata readerSchema,
RowSetLoader rowWriter)
Based on given converted Avro schema and current row writer generates list of
column converters based on column type.
|
| Modifier and Type | Field and Description |
|---|---|
protected RowSetLoader |
BaseFieldOutput.writer |
| Constructor and Description |
|---|
BaseFieldOutput(RowSetLoader writer,
int maxField,
boolean[] projectionMask)
Initialize the field output for one of three scenarios:
SELECT all: SELECT *, SELECT columns.
|
RepeatedVarCharOutput(RowSetLoader loader,
boolean[] projectionMask)
Provide the row set loader (which must have just one repeated Varchar
column) and an optional array projection mask.
|
Copyright © 2021 The Apache Software Foundation. All rights reserved.


@helper.form(action = routes.PlantDiseaseController.conditionSubmit(), 'class -> "plant-disease-condition-form") {
@b3.select( plantDiseaseConditionForm("paramId"), options = PlantDiseaseCondition.weatherParameters(messages), '_label -> Messages("plant.disease.select.condition"), 'required -> "true")
@b3.select( plantDiseaseConditionForm("conditionParam"), options = PlantDiseaseCondition.conditionParams(), '_label -> Messages("plant.disease.select.conditionParam"), 'required -> "true")
@b3.number( plantDiseaseConditionForm("condition"), '_label -> Messages("plant.disease.condition.limit"), 'step -> 5, 'required -> "true")
@b3.number( plantDiseaseConditionForm("duration"), '_label -> Messages("plant.disease.condition.duration"), 'step -> 1, 'min -> 0, 'required -> "true")
}


Skittles
A list of things that changes with JavaScript
Things I Like
Here are some of the things I like to do:
Fly Helicopters
Paint My Nails
Wrestle Crocodiles
Change Your List


{{site.user_description}}
Development and Design go hand in hand. I believe that when you develop good infrastructure first, great design will naturally follow.
After developing a solid foundation of systems and technology to build from, the design comes easy simply because it's easy to build on.


/*
* 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.
*/
'use strict'
const Wallet = require('composer-common').Wallet
const mongoose = require('mongoose')
const Promise = require('bluebird')
/**
* Main class for Hyperledger Composer Wallet implementation using MongoDB as a store
*/
module.exports = class MongoDBWallet extends Wallet {
/**
* Consstruction of the class
* @param {*} options Options for this implementations
*/
constructor(options) {
super()
if (!options) {
throw new Error('Need configuration')
}
if (!options.uri) {
throw new Error('Need an URI to connect to MongoDB')
}
if (!options.collectionName) {
throw new Error('Need a collection name for the wallet')
}
if (!options.namePrefix) {
throw new Error('Need a namePrefix in options')
}
this.mongodbConfig = options
this.namePrefix = options.namePrefix
// Connect to MongoDB
this.connection = mongoose.createConnection(this.mongodbConfig.uri, this.mongodbConfig.options)
// Create the model according the schema needed by the wallet
this.wallet = this.connection.model(this.mongodbConfig.collectionName, {
name: {
type: String,
required: true
},
path: {
type: String,
required: true
},
valueBase64: {
type: String
},
valueString: {
type: String
}
})
}
/**
* Add a new credential to the wallet.
*
* @param {string} name The name of the credentials.
* @param {string} value The credentials.
* @return {Promise} A promise that is resolved when
* complete, or rejected with an error.
*/
async put(name, value) {
if (!name) {
return Promise.reject(new Error('Name must be specified'))
}
const card = {
name: name,
path: this.namePrefix
}
if (value instanceof Buffer) {
// base 64 encode the buffer and write it as a string.
card.valueBase64 = value.toString('base64')
} else if (value instanceof String || typeof value === 'string') {
card.valueString = value
} else {
return Promise.reject(new Error('Unkown type being stored'))
}
return await this.wallet.update(
{
name: card.name,
path: this.namePrefix
},
card,
{ upsert: true, overwrite: true })
}
/**
* Remove existing credentials from the wallet.
* @param {string} name The name of the credentials.
* @return {Promise} A promise that is resolved when
* complete, or rejected with an error.
*/
async remove(name) {
if (!name) {
return Promise.reject(new Error('Name must be specified'))
}
return await this.wallet.remove(
{
name: name,
path: this.namePrefix
}).exec()
}
/**
* List all of the credentials in the wallet.
* @return {Promise} A promise that is resolved with
* an array of credential names, or rejected with an
* error.
*/
async listNames() {
let result = await this.wallet.find(
{
path: this.namePrefix
},
{
'_id': false,
'name': true
}).exec()
result = result.map( (elt) => {
return elt.name
} )
return result
}
/**
* Check to see if the named credentials are in
* the wallet.
*
* @param {string} name The name of the credentials.
* @return {Promise} A promise that is resolved with
* a boolean; true if the named credentials are in the
* wallet, false otherwise.
*/
async contains(name) {
if (!name) {
return Promise.reject(new Error('Name must be specified'))
}
let result = await this.wallet.findOne(
{
name: name,
path: this.namePrefix
}).exec()
return (result !== null)
}
/**
* Get the named credentials from the wallet.
* @param {string} name The name of the credentials.
* @return {Promise} A promise that is resolved with
* the named credentials, or rejected with an error.
*/
async get(name) {
if (!name) {
return Promise.reject(new Error('Name must be specified'))
}
let card = await this.wallet.findOne(
{
name: name,
path: this.namePrefix
}).exec()
if (!card) {
throw new Error('The specified key does not exist')
}
card = card.toObject() // Convert MongoDB Document to JS Object
let data = null
if (card.hasOwnProperty('valueBase64')) {
data = Buffer.from(card.valueBase64, 'base64')
}
else if (card.hasOwnProperty('valueString')) {
data = card.valueString
}
else {
throw new Error('Unkown type being stored')
}
return data
}
/**
* Gets all the objects under this prefix and tag
* An empty storage service will return a map with no contents
*
* @return {Promise} A Promise that is resolved with a map of the names and the values
*/
async getAll() {
let results = new Map()
let keys = await this.listNames()
// use the keys to get the data, the get handles the types as needed
for (const key of keys) {
const value = await this.get(key)
results.set(key, value)
}
return results
}
}


{% extends "base1.html" %} {% block title %}About Us · {{ block.super }}{% endblock %} {% block breadcrumb-wrapper %}{% endblock %} {% block content %}
Started in the year 2018, ADBAZZAR has taken the first into the world of becoming the leading marketing communication agency where businesses will find their way to brand recognition. With the idea of being among the leading competitors in the marketplace, we have associated with the most exemplary dedicated professionals who intend to provide result-oriented ideas without any loopholes.
We have ventured into the journey of transforming a business into a successful brand name with the implementation of the most innovative ideas to garner the trust and the loyal of the consumers. We intend in providing the best solution to our consumers that they have been looking forward to curating your needs and requirements. We aspire to take your business to a new pinnacle with your ideas and our innovation.
Regardless of the type of industry, ADBAZZAR is always at your service. We are working with our existing clients for a long period of time now and haven’t let them down at any cost. Being a marketing agency, we thrive to perform the impossible. We are here to take your business to a new toll incorporating the unparalleled dimensions in the digitalized world.
Divide and Conquer!
This is the approach that we follow, we break down the projects into sub-projects, until these become simpler enough to solve directly. The solutions to the sub-projects are then combined to give a wonderful output to the original project.
Build Like a Pro
We believe in making a brand an emotion in the hearts of the people. It is not only about the marketing but also about the attention it should receive from the audience and its consumers. At ADBAZZAR, we aim at the development of the brand through the implementation of result-oriented strategies. Refining of the strategies and campaigns in done for the better outcome. ADBAZZAR offers high-quality web and print-based advertising services that will help you to create newer ways that enhance your business outlook and increase your bottom line.
We have associated with the top creative minds who are there to formulate the best plans and ideas for your company to enhance the vision of your brand. Being an advertising agency, we aim to provide the best and stand out from the rest.
Proven Results!
We won’t say that we have years of experience but yes, every project that we have taken we have proved us right!
As it is said, “Growth is never by mere chance; it is the result of forces working together.”
And we believe in hard work.


Library Welcome Week Set
Aug 2016, UX intern | Information Service | University of Edinburgh
Designed a set of visual elements including 2 leaflets, 1 bag, 1 pen, 3 postcards. The project is based on Edinburgh University branding design guidelines.
Raccoon Van Branding
May 2015, Freelancer | A Chinese Restaurant
Designed a set of visual elements including a logo, a business card and a set of a package. Proposed a van visual design.
Target: Chinese teenagers. Style: Cartoon, energetic.
Why Raccoons?
Memrise Marketing Graphic Design
Aug 16 - Aug 30, 2017, Freelancer | Memrise Educational App
Designed assets for the Marketing department, including 3 sets of UAC graphic, 2 sets of App-store graphic, 1 set of email campaign template (built it!), 1 set of blog template.
Talk to Bill Business Card Design
Oct, 2014, Freelancer | Bill the teacher from U.S.
Bill is an English teacher based in Xiamen. He works as a professor in Xiamen University and has his own private courses aiming at helping students practice oral English. He needs a business card that tells people what he is doing and how to connect him. Designed the business card and supervised the printing process.
NCoins - Virtual currency for rewarding nice neighbours' helpView More
Sep 2016 - Dec 2016, Design Informatics
The initial goal was to design a digital service for preventing residents from abandoning their trash on the street. During the product design process, the idea has been developed into encouraging people to help each other and engage in the community activities.
In this project, an unusual prototyping method was proposed to adapt to the specific circumstance.
Library Mapping Digital Map View Live
Feb 2016 - May 2017, UX intern | Information Service | University of Edinburgh
Designed and built the interface of the WebApp collaborating with two back-end developers. Ran usability tests and fixed some functions using Ruby on Rails afterwards. Extended the current map to other UoE libraries.
GithubFoodsharing App View More
Nov 2015 - Feb 2016, Volunteer | Foodsharing Org
Foodsharing is an eco-friendly app with an incentivising model that will encourage people to share food that might otherwise go to waste. I worked as a UI designer, collaborating with an Android developer and two persons from Foodsharing Org.
Jack Daniel's Landing Page Redesign View More
June 2017, Redesign for an E-Commerce task
Integrated three separated Jack Daniel's E-Commerce websites. Designed the responsive landing page including the navigation on multi-devices.


Buy Bitcoin by transferring money from your bank account to a Bitcoin vendor.
Don’t want to leave the house? You can use a number of popular payment apps.
Have a gift card you don't need? Trade it here for Bitcoin instantly.
Become a vendor on BTCS50 and empower millions around the world with financial freedom. Offer multiple payment methods that buyers like, eliminate middlemen, and we will help you with all the resources and guidance needed to succeed.


Following up: Based on models we have looked at, we realize that being Black and getting suspended can happen together, so those events are not mutually exclusive. When I know that being truant means not attending school regularly, I realize that the events in Event pair B are complements and have to be mutually exclusive. Event pair C is the most difficult to really take apart. Common sense-wise and experience-wise it seems like maybe the people who got good grades didn’t get in real trouble at school, but then again there is no reason why they couldn’t get into trouble. This means that they have to be not mutually exclusive events.
in-context


Stager, Ethan
Welcome to IS445 Homework 2
Education
- 2018, B.S., Business Administration emphasis in Management Information Systems, California State University, Long Beach
Working Experience
- Banking and Technology Intern, City National Bank, 3 months
- Contemporary Worship Intern, Rolling Hills Covenant Church, 4 months
Expectation for this course
I'd like to learn more about Javascript and things like AJAX and JQuery


{{metadata.app.title}} lets you search across {{statistics.collection_count | number}} collections of South African gazettes from opengazettes.org.za.
As new material gets added, you can stay informed about any additional matches for your previous searches by setting up e-mail alerts.
Gazettes are cross-referenced with persons and companies by ID and CIPC numbers respectively.


$if(error == "passwordMismatch"):
Whoops! Your entries in the new password and retype new password fields did not match.
$elif(error == "passwordInsecure"):
Whoops! The password you entered did not clear our password security check.
$else:
An administrator has required that you reset your password before you can continue using the site.


Copyright 2013 University of Washington, School of Nursing. http://opensource.org/licenses/BSD-3-Clause
Initialized with a controller, accepts inputs and returns them with specially-formatted substitution strings (e.g. "%(FIRSTNAME)") replaced by the appropriate value for the session.
Substitution strings in the format %([function name] arg1 arg2) with [SPACE] to be replaced by ' ' when the args are evaluated Substitution string examples: %(FIRSTNAME) %(RELATIVE_DATETIME 3[SPACE]months[SPACE]ago)
All functions are implemented in the Substitutions class. To add more, add the functions to that class, or subclass Substitutions and then initialize the new class as $this->substitutions in the startup method. All functions will only receive the current session id.


update files
print files on paper
data entry
All of the above
2. What is the language used by most of the DBMSs for helping their users to access data?
High level language
Query language
SQL
4GL
3. An-owner-member set in the CODASYL specifications may have
only one owner but many owner occurrences
only one member but many member occurrence
more than one member but only one occurrence per member
All of the above
4. Which of the following statements contains an error?
Select * from emp where empid = 10003;
Select empid from emp where empid = 10006;
Select empid from emp;
Select empid where empid = 1009 and lastname = ‘GELLER’;
5.
The wildcard in a WHERE clause is useful when?
An exact match is necessary in a SELECT statement.
An exact match is not possible in a SELECT statement.
An exact match is necessary in a CREATE statement.
An exact match is not possible in a CREATE statement.
6. Consider the following set of relations
EMP ( emp_no,emp_name,dept_no,salary)
DEPT (dept_no,dept_name,location)
Write SQL query for the following
Find all the employees whose departments are located in 'Mumbai' and salary is greater than Rs. 20,000.
select emp_name from dept where dept_no and location='Mumbai';
select emp_name from emp where salary > 20,000 and dept_no in (select dept_no from dept where location = 'Mumbai');
select dept_no ,count(emp_no) from emp where salary > 50,000 group by dept_no;
update table emp where emp_name='Mumbai';


| Error | whitespace | WhitespaceAfter | ',' is not followed by whitespace. | 330 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 330 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 331 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 331 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 332 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 332 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 335 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 336 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 339 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 339 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 340 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 340 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 341 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 341 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 342 |
| Error | coding | MagicNumber | '504' is a magic number. | 342 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 342 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 343 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 343 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 345 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 345 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 346 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 346 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 347 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 347 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 349 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 349 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 351 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 351 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 352 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 352 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 353 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 353 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 355 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 356 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 356 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 356 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 356 |
| Error | blocks | RightCurly | '}' should be alone on a line. | 357 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 357 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 357 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 357 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 360 |
| Error | coding | MagicNumber | '504' is a magic number. | 360 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 360 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 361 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 361 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 51 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 51 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 52 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 54 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 54 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 60 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 62 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 62 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 73 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 73 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 73 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 76 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 76 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 78 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 78 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 79 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 79 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 81 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 82 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 82 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 83 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 83 |
| Error | blocks | RightCurly | '}' should be alone on a line. | 84 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 84 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 84 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 84 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 85 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 85 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 91 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 91 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 95 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 95 |
| Warning | javadoc | JavadocMethod | Expected an @return tag. | 104 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 104 |
| Warning | javadoc | JavadocMethod | Expected @param tag for 'locator'. | 104 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 104 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 104 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 105 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 105 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 108 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 108 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 111 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 112 |
| Error | whitespace | WhitespaceAfter | ';' is not followed by whitespace. | 112 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 113 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 113 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 114 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 114 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 115 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 115 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 46 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 47 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 165). | 50 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 50 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 50 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 50 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 166). | 54 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 54 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 54 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 186). | 57 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 57 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 57 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 57 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 57 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 169). | 60 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 60 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 60 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 60 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 60 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Error | imports | AvoidStarImport | Using the '.*' form of import should be avoided - org.junit.Assert.*. | 59 |
| Info | javadoc | JavadocVariable | Missing a Javadoc comment. | 74 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 78 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 93 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 112 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 147 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 169 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 178 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 197 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 204 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 211 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 218 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 225 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 232 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 239 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 250 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 260 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 267 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 278 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 299 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 311 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 323 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 335 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 142). | 371 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 133). | 398 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 133). | 413 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 615 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 615 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 620 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 620 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 142). | 625 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 642 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 642 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 643 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 643 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 43 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 45 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 49 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 60 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 62 |
| Error | coding | MagicNumber | '18' is a magic number. | 73 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 43 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 134). | 49 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Error | extension | TreeWalker | Got an exception - expecting EOF, found 'this' | 97 |
| Severity | Category | Rule | Message | Line |
|---|---|---|---|---|
| Error | imports | UnusedImports | Unused import - org.apache.archiva.repository.Repository. | 32 |
| Error | imports | UnusedImports | Unused import - org.junit.BeforeClass. | 35 |
| Error | imports | AvoidStarImport | Using the '.*' form of import should be avoided - org.mockito.Mockito.*. | 49 |
| Error | javadoc | JavadocType | Missing a Javadoc comment. | 51 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 51 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 51 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 121). | 52 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 52 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 52 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 63 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 63 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 74 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 74 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 88 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 88 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 120 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 128). | 126 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 133 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 133 |
| Error | blocks | LeftCurly | '{' should be on a new line. | 133 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 134 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 134 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 137 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 137 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 138 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 138 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 139 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 139 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 159 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 159 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 159 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 159 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 159 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 159 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 160 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 160 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 161 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 161 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 161 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 161 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 162 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 162 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 163 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 163 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 164 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 164 |
| Warning | javadoc | JavadocMethod | Missing a Javadoc comment. | 167 |
| Error | sizes | LineLength | Line is longer than 120 characters (found 124). | 205 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 208 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 208 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 208 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 208 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 208 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 208 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 209 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 209 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 209 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 209 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 209 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 209 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 211 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 211 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 212 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 212 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 213 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 213 |
| Error | whitespace | ParenPad | '(' is not followed by whitespace. | 213 |
| Error | whitespace | ParenPad | ')' is not preceded with whitespace. | 213 |


This post describes how to apply a clustering method to a dataset and visualize the result as a dendrogram with colors and legends.
This is a upgrade of the basic dendrogram presented in the figure #29. Please refer to this previous post to understand how a dendrogram works.
In this exemple, we just show how to add specific colors to leaves and sample name. It allows to check if the expected groups are indeed found after clustering.
# Build dataset (just copy and paste, this is NOT interesting)
sample <- paste(rep("sample_",24) , seq(1,24) , sep="")
specie <- c(rep("dicoccoides" , 8) , rep("dicoccum" , 8) , rep("durum" , 8))
treatment <- rep(c(rep("High",4 ) , rep("Low",4)),3)
data <- data.frame(sample,specie,treatment)
for (i in seq(1:5)){
gene=sample(c(1:40) , 24 )
data=cbind(data , gene)
colnames(data)[ncol(data)]=paste("gene_",i,sep="")
}
data[data$treatment=="High" , c(4:8)]=data[data$treatment=="High" , c(4:8)]+100
data[data$specie=="durum" , c(4:8)]=data[data$specie=="durum" , c(4:8)]-30
rownames(data) <- data[,1]
# Have a look to the dataset
# head(data)
# Compute Euclidean distance between samples
dist=dist(data[ , c(4:8)] , diag=TRUE)
# Perfor clustering with hclust
hc <- hclust(dist)
dhc <- as.dendrogram(hc)
# Actually, each leaf of the tree has several attributes, like the color, the shape.. Have a look to it:
specific_leaf <- dhc[[1]][[1]][[1]]
# specific_leaf
# attributes(specific_leaf)
#So if I Want to color each leaf of the Tree, I have to change the attribute of each leaf. This can be done using the dendrapply function. So I create a function that # # add 3 attributes to the leaf : one for the color (“lab.col”) ,one for the font “lab.font” and one for the size (“lab.cex”).
i=0
colLab<<-function(n){
if(is.leaf(n)){
#I take the current attributes
a=attributes(n)
#I deduce the line in the original data, and so the treatment and the specie.
ligne=match(attributes(n)$label,data[,1])
treatment=data[ligne,3];
if(treatment=="Low"){col_treatment="blue"};if(treatment=="High"){col_treatment="red"}
specie=data[ligne,2];
if(specie=="dicoccoides"){col_specie="red"};if(specie=="dicoccum"){col_specie="Darkgreen"};if(specie=="durum"){col_specie="blue"}
#Modification of leaf attribute
attr(n,"nodePar")<-c(a$nodePar,list(cex=1.5,lab.cex=1,pch=20,col=col_treatment,lab.col=col_specie,lab.font=1,lab.cex=1))
}
return(n)
}
# Finally I just have to apply this to my dendrogram
dL <- dendrapply(dhc, colLab)
# And the plot
plot(dL , main="structure of the population")
legend("topright",
legend = c("High Nitrogen" , "Low Nitrogen" , "Durum" , "Dicoccoides" , "Dicoccum"),
col = c("red", "blue" , "blue" , "red" , "Darkgreen"),
pch = c(20,20,4,4,4), bty = "n", pt.cex = 1.5, cex = 0.8 ,
text.col = "black", horiz = FALSE, inset = c(0, 0.1))


About
After completing my undergrad degree in Industrial and Systems Engineering, I've had this craving to make everything in my life as efficient as possible. Combining this with my love of woodworking drove me to set up my own automated manufacturing process using tools like a CNC Machine, Laser Cutter,and 3D Printer. A process where you utilize automation, woodworking, engineering, and graphic design to go from concept to reality. While it takes a great deal of time and practice, the end products are extremely rewarding.
My full-time position is as a Data Scientist, so I try to utilize these techniques for problems ranging from finding a new apartment to mastering fantasy football. To continue progressing in this domain, I’ll be completing my Master of Computer Science at Georgia Tech through the OMSCS program. I intend to specialize in Machine Learning to grow my skills as a Data Scientist, while enhancing my Computer Science fundamentals. I will focus on applications in the fields of Computer Vision and Natural Language Processing.


AKAN NAMING
Its an application that calculates the day a user is born depending on
their gender and then outsputs their Akan name
Akan names are derived from the Ghanian culture
Below are the Ghanian day names:
Male
- Sunday:Kwasi
- Monday:Kwadwo
- Tuesday:Kwabena
- Wednesday:Kwaku
- Thursday:Yaw
- Friday:Kofi
- Saturday:Kwame
Female
- Sunday:Akosua
- Monday:Adwoa
- Tuesday:Abenaa
- Wednesday:Akua
- Thursday:Yaa
- Friday:Afua
- Saturday:Ama


There are plenty of pizza places out there in the world, but some of them lack imagination.Don't get us wrong, there is nothing like a tried and true tradition pepperoni pizza, but sometimes you want to kick it up a notch and and some sasuage atop. Or maybe you want to outside of the box and throw on some roasted brussel sprouts. You pick the size, you pick the sauce, the cheese, and whatever toppings you want, and we will take care of the rest! Order down below!
Your pizza will cost: $!
Thanks for your order!


JSFrame.js examples
Window Control Command
Fullscreen
Restore from fullscreen
Hide
Restore from hid
View source on GitHub


I could paste the lyrics to Dolly Parton's "Travelin' Thru" here, but that just seems excessive.
Footage not found.
Text me<PHONE_NUMBER>), or email me (dirgnifish@gmail.com), but pleasedon't call me. Follow me on Twitter.


|
Lane Line Detection System
Midsemester project of Hrishikesh Tawade and Kapil Rawal
A\tLanelinedetectionsystem
|
Class for camera module. More...
#include <LaneLineDetectionSystem.h>
Public Member Functions | |
| LaneLineDetectionSystem () | |
| Constructor. More... | |
| ~LaneLineDetectionSystem () | |
| Destroys the object. More... | |
| void | detectLaneLineForImage (const std::string &) |
| Detects lane line in an image of a car driving on a highway. More... | |
| void | detectLaneLineForVideo (const std::string &) |
| Detects lane line in a video of a car driving on a highway. More... | |
Class for camera module.
| LaneLineDetectionSystem::LaneLineDetectionSystem | ( | ) |
Constructor.
Constructs the object.
| LaneLineDetectionSystem::~LaneLineDetectionSystem | ( | ) |
Destroys the object.
| void LaneLineDetectionSystem::detectLaneLineForImage | ( | const std::string & | pathToImage | ) |
Detects lane line in an image of a car driving on a highway.
Detects Lane line from an image.
| path | to the image |
| pathToImage | The input image link |
Getting image
Converting image to gray scale
Blurring image
applying canny filter
Masking image
Find hough lines in the image
Drawing lines
Merging images
Calculating drive heading error
Putting text on image
| void LaneLineDetectionSystem::detectLaneLineForVideo | ( | const std::string & | pathToVideo | ) |
Detects lane line in a video of a car driving on a highway.
Stores video from input link.
| path | to the video |
| pathToVideo | The input video link |
Saving video format
Getting video frame
Converting image to gray scale
Blurring image
applying canny filter
Masking image
Find hough lines in the image
Drawing lines
Merging images
Calculating drive heading error
Putting text on frame
Storing output frame


--- layout: post title: "Deep Learning on Graphs: Successes, Challenges, and Next Steps" subtitle: "Michael Bronstein, Imperial College London" date: 2020-10-07 11:00:00 background: '/img/posts/bronstein.png' future_date: False layer_shift: True ---
Deep learning on graphs and network-structured data has recently become one of the hottest topics in machine learning. Graphs are powerful mathematical abstractions that can describe complex systems of relations and interactions in fields ranging from biology and high-energy physics to social science and economics. In this talk, Michael Bronstein will outline the basic methods, applications, challenges and possible future directions in the field.
Michael Bronstein is a professor at Imperial College London, where he holds the Chair in Machine Learning and Pattern Recognition, and Head of Graph Learning Research at Twitter. Michael received his PhD from the Technion in 2007. He has held visiting appointments at Stanford, MIT, Harvard, and Tel Aviv University, and has also been affiliated with three Institutes for Advanced Study (at TU Munich as a Rudolf Diesel Fellow (2017-2019), at Harvard as a Radcliffe fellow (2017-2018), and at Princeton (2020)). Michael is the recipient of five ERC grants, Member of Academia Europaea, Fellow of IEEE, BCS, IAPR, and ELLIS, ACM Distinguished Speaker, and World Economic Forum Young Scientist. In addition to his academic career, Michael is a serial entrepreneur and founder of multiple startup companies, including Novafora, Invision (acquired by Intel in 2012), Videocites, and Fabula AI (acquired by Twitter in 2019). He has previously served as Principal Engineer at Intel Perceptual Computing and was one of the key developers of the Intel RealSense technology.
The event will take place on Wednesday, 07 October, 2020 at 11:00am . It will be a joint event with the DKFZ Data Science Seminar and will take place online. You can join the live stream at this URL and ask questions via chat! Kindly help us plan ahead by registering for the event on our meetup page.


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object gr.forth.ics.graph.path.Traverser
public class Traverser
A utility that simplifies executing graph traversals. A traversal may be executed in a depth-first
or breadth-first fashion, while it can also be configured not to visit twice the same
node or the same edge. A traversal is modelled as an iterator of Path
instances, representing
the various discovered paths of the graph. The direction of the traversal is also configured
(see {traverse(InspectableGraph, Node, Direction)
), so the traversal may flow
towards the direction of the discovered edges (Direction.OUT
), oppositely
(Direction.IN
) or either way (Direction.EITHER
).
This example prints all paths that discover a new node in a graph:
InspectableGraph graph = ...;
Traverser traverser = Traverser.newDfs().withoutRepeatingNodes().build();
for (Path path : traverser.traverse(graph, graph.aNode(), Direction.OUT)) {
System.out.println(path);
}
This (slow by nature) example collects all directed paths of a graph:
InspectableGraph graph = ...; //should be a dag, or else the paths are infinite
Traverser traverser = Traverser.newDfs().build();
Set<Path> paths = new HashSet<Path>();
for (Node n : graph.nodes()) {
PathIterator iterator = traverser.traverse(graph, n, Direction.OUT).iterator();
while (iterator.hasNext()) {
Path path = iterator.next();
if (paths.contains(path)) {
iterator.skipExplorationOfLastPath(); //discontinue the exploration of already visited path
} else {
paths.add(path);
}
}
}
| Nested Class Summary | |
|---|---|
static interface |
Traverser.PathIterable
An iterable of Path s, which return iterators of type Traverser.PathIterator . |
static interface |
Traverser.PathIterator
A iterator of Path s, used by Traverser . |
static class |
Traverser.TraverserBuilder
A builder for a Traverser . |
| Method Summary | |
|---|---|
static Traverser.TraverserBuilder |
newBfs()
Specifies that breadth-first-search will be used for the traversal of a graph, and returns a builder to further configure that traversal. |
static Traverser.TraverserBuilder |
newCustom(java.util.Comparator<? super Path> pathComparator)
Specifies that the traversal will visit the discovered paths using a priority queue with the given path comparator, and returns a builder to further configure that traversal. |
static Traverser.TraverserBuilder |
newDfs()
Specifies that depth-first-search will be used for the traversal of a graph, and returns a builder to further configure that traversal. |
Traverser.PathIterable |
traverse(InspectableGraph graph,
Node startNode,
Direction direction)
Initiates a traversal of the specified graph, starting with the given node (which must be contained in the graph) and returns a Traverser.PathIterable that returns the explored paths in a step-by-step fashion. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Method Detail |
|---|
public Traverser.PathIterable traverse(InspectableGraph graph, Node startNode, Direction direction)
Traverser.PathIterable
that returns the explored paths in a step-by-step fashion.
A traversal starts at a node and tries to expand, via incident edges, as much as possible. The traversal
consider only edges that are incident to already discovered nodes, and have compatible direction
to the direction
parameter given. For example, if node A
has been discovered
via some path, it may lead to the discovery of node B
if
{A-->B}
and direction was set to Direction.OUT
or Direction.EITHER
, or
{B-->A}
and direction was set to Direction.IN
or Direction.EITHER
The return iterators do not support Iterator.remove()
method.
graph
- the graph on which to perform the traversalstartNode
- the node to start the traversaldirection
- defines the direction that edges must have in order
to be considered when expanding already explored paths
public static Traverser.TraverserBuilder newDfs()
public static Traverser.TraverserBuilder newBfs()
public static Traverser.TraverserBuilder newCustom(java.util.Comparator<? super Path> pathComparator)
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


|
Elektra
0.9.5
|
elektrad
in GoWe are proud to release Elektra 0.9.2.
With the 0.9.x series of releases we shift our focus to bugfixes and stability improvements as needed for the KDE and GNOME integration. We do not guarantee any compatibility in this series.
Elektra serves as a universal and secure framework to access configuration settings in a global, hierarchical key database. For more information, visit https://libelektra.org.
You can also read the news on our website
elektrad
rewritten in GoWe created a fork of KDE's KConfig
configuration system and patched it to use libelektra. We have done some initial testing and replaced the KConfig
library for Kate and KDevelop successfully.
Additionally, we added a new Elektra plugin called kconfig
, which can read and write kconfig's INI files. The plugin enables smooth migration of existing KDE configurations. _(Dardan Haxhimustafa)_ and _(Felix Resch)_
We continued work on Elektra's bindings for GNOME GSettings. Our implementation should be able to replace the widely used dconf backend. Elektra's gsettings
bindings are not yet ready for production use, but they are already able to replace dconf
for a complete GNOME session without problems. We are still lacking proper dbus integration for change notifications. _(Mihael Pranjić)_
elektrad provides an HTTP API to access Elektra remotely. elektrad
is now completely rewritten in Go, which drastically improves the performance by leveraging the new go-elektra bindings instead of calling the kdb
command-line tool on every request. The new elektrad
creates a session per user to reuse the same KDB handle for correct conflict handling and better performance. _(Raphael Gruber)_
You can try out the latest Elektra release using our docker image elektra/elektra. This is the quickest way to get started with Elektra without compiling and other obstacles.
Get started with Elektra by running docker run -it elektra/elektra
.
We removed the maintained
status of the following plugins:
New maintainers are very much welcomed!
connect-gpg-agent
failed. _(Peter Nirschl)_array
. _(René Schwaiger)_rename
fails. This problem might occur if another file system is mounted at /tmp
. _(Peter Nirschl)_swig_foo
to foo
. _(Manuel Mausz)_as array unless the parent key user/example
contains the meta key array
. _(René Schwaiger)_
type
with the value boolean
for boolean data. _(René Schwaiger)_ENABLE_LOGGER=ON
),BUILD_FULL=ON
) version of Elektra, andldd
any more. _(René Schwaiger)_argv
given by the /offset
config key. If /offset
is set, gopts
will ignore a number of arguments at the start of argv
. This can be used in e.g. python scripts to ignore the interpreter arguments. _(Klemens Böswirth)_gopts
now also writes help message into the key proc/elektra/gopts/help/message
in addition to setting proc/elektra/gopts/help = 1
. This is especially useful in non-C/C++ environments. _(Klemens Böswirth)_gopts
is also affected by the changes and improvements to the opts
library outlined below.XDG_CACHE_HOME
when resolving the mmap cache directory. _(Mihael Pranjić)_The text below summarizes updates to the C (and C++)-based libraries of Elektra.
system/elektra/version/constants/KDB_VERSION_MICRO
to system/elektra/version/constants/KDB_VERSION_PATCH
to be compatible with Semantic Versioning 2.0.0. _(Markus Raab)_elektraGetOpts
now supports sub-commands. Sub-commands are best explained by looking at an application that uses them, like git
. For example add
is a sub-command in git add
, and interprets -p
differently from git
: git -p add
is git --paginate add
, but git add -p
is git add --patch
. elektraGetOpts
now implements this notion of sub-commands. For more information take a look at the tutorial for command-line-options. By extension this functionality is also available via the gopts
plugin. _(Klemens Böswirth)_args=remaining
metadata (because their opt/help
may not be the same). _(Klemens Böswirth)_Bindings allow you to utilize Elektra using various programming languages. This section keeps you up to date with the multi-language support provided by Elektra.
elektra
and elektra-sys
to crates.io. _(Philipp Gackstatter)_kdb cache
tool synopsis to reflect man page. _(Mihael Pranjić)_meta-set
instead of setmeta
) introduced with Elektra 0.9.1
. _(René Schwaiger)_cmake-format
0.6.3. _(René Schwaiger)_The scripts
now uses clang-format
9 to reformat the code base. _(René Schwaiger)_
shfmt
3, which formats parts of the code base slightly differently. _(René Schwaiger)_1.10
to test Elektra. _(René Schwaiger)_...
any more. _(René Schwaiger)_KDB_EXEC_PATH
is not being set globally to contain the build directory any longer. _(Peter Nirschl)_fork
and execv
instead of system
. _(Peter Nirschl)_We do not use implicit typing in the code of the
augeas
,base64
, andblockresolver
plugin any more. After this update, the code compiles without any warnings, even though we now use the compiler switch -Wconversion
. _(René Schwaiger)_
3.4
(released in November 2015). _(René Schwaiger)_add_msr_test
and add_msr_test_plugin
do not export the list of required plugins as environment variable any more. _(René Schwaiger)_debian-unstable-full-clang
due to upstream issue. _(Mihael Pranjić)_debian-unstable-clang-asan
and debian-unstable-full-clang
now use Clang 9 to compile Elektra. _(René Schwaiger)_Jenkins.monthly
in the Jenkins' scripts file. _(Djordje Bulatovic)_Cargo.lock
file. _(Philipp Gackstatter)_The website is generated from the repository, so all information about plugins, bindings and tools are always up to date. Furthermore, we changed:
We are currently working on following topics:
We closed 40 issues for this release.
About 23 authors changed 653 files with 15221 insertions(+) and 18890 deletions(-) in 815 commits.
Thanks to all authors for making this release possible!
René Schwaiger finished his thesis about parsing techniques and parsing tools for configuration files.
We welcome new contributors! Read here about how to get started.
As first step, you could give us feedback about these release notes. Contact us via our issue tracker.
You can download the release from here or GitHub
The hashsums are:
The release tarball is also available signed by Mihael Pranjic using GnuPG from here or on GitHub.
The following GPG Key was used to sign this release: 9C18145C22F9E746D743DEC59ECC0F4CF0359C7B
Already built API-Docu can be found here or on GitHub.
Subscribe to the RSS feed to always get the release notifications.
If you also want to participate, or for any questions and comments please contact us via our issue tracker on GitHub.
For more information, see https://libelektra.org
Best regards, Elektra Initiative


Help
Examples of making a query to KIndex.
Notes
Newspaper
- How to call: /newspaper?title=Here_goes_the_title
- Title may contain spaces, but the url string has to be URL Encoded (ex: “space” -> %20)
- Article can be retrieved ONLY by title
- Newspaper crawling takes place every 12 hours. Last articles may not be indexed yet.
- Some articles in this newspaper are restricted from free access. Only publicly free articles are indexed (If a user can read an article in the browser, this article is publicly available!)
- The response is in json format. The Content of the article is in “content” field
- Source: http://www.tagblatt.de
- Execute Newspaper Crawling
Document
- How to call: /index?query=baby sleep
- Query may contain spaces, but the url string has to be URL Encoded (ex: “space” -> %20)
- The response is in json format. The Content of the webpage is in “content” field.
- The passage is in “passage” field (For the current version, passage retrieval is not implemented yet, the passage provided is the 200 first characters of the document)
Passage Retrieval
Weather Service
Social Media
Extra services
Other
- KBfeed static json. From the first version of Relation Extraction.
- WebAPQuery static json.


echosign
Ruby Gem to consume Adobe's EchoSign e-signature service - REST service v5
Installation
gem install echosign
Documentation
The bulk of the API is on the Echosign::Client class
You can read Echosign's full API Documentation
It wouldn't hurt to read Adobe's Echosign API documentation
Usage
Initializing a client with an existing refresh token
require 'echosign'
credentials = Echosign::Credentials.new(app_id, app_secret)
access_token = credentials.refresh_access_token(refresh_token)
client = Echosign::Client.new(access_token)
Initializing a client with an authorization code
Workflow before authorizing: - redirect_uri
must be set in the
EchoSign API configuration - scope
will typically be something
like 'agreement_write:account agreement_send:account'
require 'echosign'
credentials = Echosign::Credentials.new(app_id, app_secret)
redirect_to credentials.(redirect_uri, scope)
Workflow after authorizing: “` require 'echosign'
credentials = Echosign::Credentials.new(app_id, app_secret) token = credentials.get_token(params, redirect_uri)
you should persist credentials.refresh_token somewhere to use in future
client = Echosign::Client.new(token) “`
Initializing a client with a legacy integration key
require 'echosign'
client = Echosign::Client.new(integration_key)
Setting up a new agreement from a URL
url_file_params = {
url: 'http://somedomain.com/contract.pdf',
mimeType: 'application/pdf',
name: 'contract.pdf'
}
file_info_params = {
documentURL: Echosign::UrlFileInfo.new(url_file_params)
}
recipient_params = {
role: 'SIGNER', email<EMAIL_ADDRESS>}
agreement_info = {
fileInfos: [ Echosign::Fileinfo.new(file_info_params) ],
recipientSetInfos: [ Echosign::Recipient.new(recipient_params)],
signatureFlow: "SENDER_SIGNS_LAST",
signatureType: "ESIGN",
name: "Rumplestiltskin Contract"
}
agreement = Echosign::Agreement.new(sender_id, sender_email, agreement_info)
agreement_id = client.create_agreement(agreement)
Cancelling a pending agreement
result = client.cancel_agreement(agreement_id, true, 'Because...blah blah.')
Creating a user
user_params = {
firstName: 'JohnQ',
lastName: 'Public',
email<EMAIL_ADDRESS>password: 'kN12oK9p!3',
title: 'Hedge Wizard'
}
user = Echosign::User.new(user_params)
user_id = client.create_user(user)
Sending a transient document for later referral
tran_doc_id = client.create_transient_document(file_name, mime_type, File.new('myfile.pdf'))


This document includes minitemplate.js, and contains minitemplates in the HTML for testing.
View the HTML source to see what's going on.


ObsVis is a tool to aid in observation planning which allows the inspection of sky images with overlaid instrument fields-of-view (FoV). ObsVis interfaces with the SAOimage DS9 image display tool, and facilitates detailed manipulation of Chandra pointing and instrument parameters.
Obsvis includes code to work with target offsets as specified by users, and to place targets on the detectors using those supplied offsets. To perform that mapping, obsvis uses an aimpoint in its calibration file specified in chip X and chip Y. In the following verification test, I've:
| Detector | Chip X | Chip Y | Y det offset (arcmin) | Z det offset (arcmin) | |
|---|---|---|---|---|---|
| POG Aimpoint | ACIS-I | 930.2 | 1009.6 | ||
| 6M aimpoint mon | ACIS-I | 935.8 | 996.9 | 0.104 | 0.046 |
| POG Aimpoint | ACIS-I | 200.7 | 476.9 | ||
| 6M aimpoint mon | ACIS-S | 218.5 | 483.9 | 0.146 | 0.057 |
In obsvis, with the calibration file set to use the POG aimpoint, offsets were manually determined to place the target at the corner of S3 as shown in the figure on the right
Then, the obsvis.cal file was updated with the new "6-month" aimpoint in ChipX, ChipY from the aimpoint_mon page.
Old Aimpoint in Obsvis Cal file < ACIS-S.instrumentcenter.coords.pixel "200.7, 476.9" New Aimpoint in Obsvis Cal file > ACIS-S.instrumentcenter.coords.pixel "218.5, 483.9"
New offsets were manually determined to place the target at the corner of S3 again.
| Using POG Aimpoint | Using '6-month' Aimpoint | Delta | |
|---|---|---|---|
| Y-Offset | 1.640 | 1.785 | +0.145 arcmin |
| Z-Offset | 3.905 | 3.965 | +0.060 arcmin |
In obsvis, with the calibration file set to use the POG aimpoint, offsets were manually determined to place the target at the inside corner of I3 as shown in the figure on the right
Then, the obsvis.cal file was updated with the new "6-month" aimpoint in ChipX, ChipY from the aimpoint_mon page.
Old Aimpoint in Obsvis Cal file < ACIS-I.instrumentcenter.coords.pixel "930.2, 1009.6" New Aimpoint in Obsvis Cal file > ACIS-I.instrumentcenter.coords.pixel "935.8, 996.9"
| Using POG Aimpoint | Using "6-month" Aimpoint | Delta | |
|---|---|---|---|
| Y-Offset | 0.120 | 0.220 | +0.100 arcmin |
| Z-Offset | -0.765 | -0.725 | +0.040 arcmin |
The calculated delta offsets from direct use of the proposed 6-month aimpoint in obsvis are very close to the proposed deltas already calculated and presented on the aimpoint page, and the signs appear correct. The "manually-determined" offsets are subject to some error in the manual alignment of the target on the edge of the chip.
| Obsvis manual determination | Aimpoint page values | |||
|---|---|---|---|---|
| Detector | Y-Off(arcmin) | Z-Off(arcmin) | Y-Off(arcmin) | Z-Off(arcmin) |
| ACIS-I | +0.100 | +0.040 | +0.104 | +0.046 |
| ACIS-S | +0.145 | +0.060 | +0.146 | +0.057 |


GroupsNewCtrl
TatUi
Controller of create a group
TatEngineGroupRsc
Tat Engine Resource Group
TatEngine
Tat Engine Provider
Create group with name and description. Calling Tat Engine Resource Group


Toggle navigation
Tech Trek v2.0
Logout
Add Event
Manage Questions
S. No.
Question
Tech Answer
Non Tech Answer
Hint
Level


Ember London is a community for anyone interested in Ember.js and building ambitious web applications.
We host monthly meetups with talks from contributors, library authors and enthusiasts. The aim is to cover a broad range of topics of interest to beginners and advanced users alike.
We also host monthly project nights where you can hang out and write code with fellow London Embereños.
Say hello on our forum:
discuss.emberlondon.com
And on our slack community:
www.emberlondon.io


| Document number: | ||
|---|---|---|
| Date: | ||
| Project: | Programming Language C++, Library Evolution Working Group | |
| Reply-to: | Tomasz Kamiński <tomaszkam at gmail dot com> |
This document proposes and introduction of the new library functions for performing partial function
application and act as replacement for existing std::bind
.
This paper addresses LEWG Bug 40: variadic bind.
This proposal is successor of the N4171: Parameter group placeholders for bind,
that was proposing an extension of the existing std::bind
to introduce new class of placeholders that would presents group of call arguments
instead of one.
In this paper new two new bind_front
and bind_back
are proposed that allow user to provide a values that will be passed
as first or last arguments to stored callable. The author believes that this solution is in-line with LEWG recommendation for the original paper,
that suggested to introduce only _all
placeholder.
This paper proposes two new functions for partial function application:
bind_front
for binding values of first argumentsbind_back
for binding values of last argumentsIn other worlds bind_front(f, bound_args...)(call_args...)
is equivalent to std::invoke(f, bound_args..., call_args....)
and bind_back(f, bound_args...)(call_args...)
is equivalent to std::invoke(f, call_args..., bound_args...)
.
It is worth to notice that proposed functions provide both superset of existing std::bind
functionality:
it supports passing variable number of arguments, but does not allow arbitrary reordering or removal of the arguments.
However author believes that proposed simplified functionality covers most of uses cases for original std::bind
.
Let consider an example task of writing the functor that will invoke process
method on copy of strategy
object:
struct Strategy { double process(std:string, std::string, double, double); }; std::unique_ptr<Strategy> createStrategy();
Firstly, such functor should not cause any additional overhead caused by passing the argument values form the call side to the stored callable. To achieve desired effect in case of lambda based solution, we can use forwarding reference in combination with variadic number arguments:
[s = createStrategy()] (auto&&... args) { return s->process(std::forward<decltype(args)>(args)...); }
In case of the functors produced by std::bind
, perfect forwarding is used by default for the all call
arguments that are passed in place on the placeholders, so same effect may be achieved using:
std::bind(&Strategy::process, createStrategy(), _1, _2, _3, _4)
However use of the named placeholders, has is own drawbacks. Firstly change to the functor code is required each time when the number of arguments is changed. Secondly, it allow user to write a code that will bass same value to the function multiple times, by using same placeholder twice, which in case of use of move semantics may lead to passing of unspecified values as the arguments. For example values of first and second argument are unspecified in case of following invocation:
auto f = std::bind(std::bind(&Strategy::process, createStrategy(), _1, _1, _2, _2); f(std::string("same_string"), 1);
In contrast in case of proposed bind_front
/bind_back
function, all argument provided on the call side
are forwarded to the callable. As consequence the user is not required to manually write boilerplate code for
perfect forwarding nor are exposed to potential errors caused by use of placeholders:
bind_front(&Strategy::process, createStrategy())
In our previous example the strategy object was passed stored in the callable indirectly by the use of the smart pointer, so it mutability was not affected by the functor. However in case of storing object by value we would like to propagate constness from the functor. That means for each of the following declarations:
auto f = [s = Strategy{}] (auto&&... args) { return s.process(std::forward<decltype(args)>(args)...); }; // 1 auto f = std::bind(&Strategy::process, Strategy{}, _1, _2, _3, _4); // 2 auto f = bind_front(&Strategy::process, Strategy{}); // 3
Invocation on mutable version of the functor (f
) shall invoke process
method on mutable object
(call well-formed), however in case of const qualified one (std::as_const(f)
) process
method
shall be invoked on const object (call ill-formed). This functionality is supported both by existing std::bind
(2)
and proposed bind_front
/bind_back
(3), however it is not in case of the lambda (1). This is caused by the
fact that closure created by the lambda has only one overload of the call operator that is const qualified by default.
As consequence, in case of use of lambda based solution, user must decide if he want to pass each object as const and allow only on const object, by use of:
[s = Strategy{}] (auto&&... args) { return s.process(std::forward<decltype(args)>(args)...); };
Or pass allow modification of he stored objects by allowing only calls on non-const functor, by us of:
[s = Strategy{}] (auto&&... args) mutable { return s.process(std::forward<decltype(args)>(args)...); };
Same problems may occurs in situation when stored function supports non-const calls via appropriate overloads of
operator()
. For example in case of following class:
struct Mapper { auto operator()(int i, int j) -> std::string& { return _mapping[{i, j}]; } auto operator()(int i, int j) const -> std::string const& { return _mapping[{i, j}]; } private: std::map<std::pair<int, int>, std::string> _mapping; };
Functors produced by std::bind(Mapper{}, _1, 10)
and bind_back(Mapper{}, 10)
will call
both const and non-const overloads, depending on their qualification. While in case of lambda, user will need
to decide to support only one of them, by using one of:
[m = Mapper{}](int i) -> std::string const& { return m(i, 10); } [m = Mapper{}](int i) mutable -> std::string& { return m(i, 10); }
The reader may notice that lambda functions used in previous section, are explicitly specifying their return type,
instead omitting. This is caused by the fact that lambda is using the auto
deduction for the return
type, as default. That means that the following slightly changed declaration would return std::string
object by value:
auto fc = [m = Mapper{}](int i) { return m(i, 10); }; auto fm = [m = Mapper{}](int i) mutable { return m(i, 10); };
Such slight changed in behaviour may lead to various changes in the behaviour of the program. Firstly additional move construction will be invoked in addition to copy, if the object returned by the lambda is stored by value:
auto s1 = fc(2); auto s2 = fm(2);
Secondly, the lifetime of object returned from the functor, will not longer be tied to the lifetime of the Mapper
object, which may to creation of dangling references:
auto f = [m = Mapper{}](int i) { return m(i, 10); }; std::string* ps = nullptr; { auto const& s = f(2); ps = &s; } // *ps is dangling
Lastly in case of the mutable version of functor, changing the result of the invocation, would modify the temporary not the mapped value:
fm(2) = "something";
To avoid such problems, we may use decltype
-based return type deduction, as it is done in case of
std::bind
and proposed bind_front
/bind_back
:
[m = Mapper{}](int i) -> decltype(auto) { return m(i, 10); }
If we consider following example implementation of the functor that performs memoization of the expensive
to compute function func
:
struct CachedFunc { std::string const& operator()(int i, int j) & { key_type key(i, j); auto it = _cache.find(key); if (it == _cache.end()) it = _cache.emplace(std::move(key), func(i, j)).first; return it->second; } private: using key_type = std::pair<int, int>; std::map<key_type, std::string> _cache; };
As we can see CachedFunc::operator()
is using reference qualification to allow it to be only called
on the lvalue. Use of this qualification allows us to avoid dangling reference problems, in situation when reference
returned by temporary CachedFunc
object would be stored. In addition it signals that use of CachedFunc
makes sense only in situation when it is invoked multiple times and for one-shot invocation invoking func
directly is more optimal solution.
As in case of the const
propagation, we would like to preserve/propagate value category from the functor
to stored callable. That means that for the following declarations:
auto f = [cache = CachedFunc{}] (int j) mutable -> std::string& { return cache(10, j); }; // 1 auto f = std::bind(CachedFunc{}, 10, _1); // 2 auto f = bind_front(CachedFunc{}, 10); // 3
Invocation on the lvalue (f(1)
) shall perform call on the lvalue of CachedFunc
and be
well-formed, while invocation on the rvalue (std::move(f)(1)
) shall lead to call on the rvalue and be
ill-formed.
Out of discussed option, only proposed bind_front
/bind_back
(3) functions are preserving value category.
In case of existing std::bind
and lambda solutions, the call is always performed on lvalue regardless
of the category of function object, and essentially bypass reference qualification
Same problems also occurs in case of the bound arguments, even if the callable does not differentiate between calls on lvalues and rvalues. For example if we consider following function declarations
void foo(std::string&); auto make_bind(std::string s) { return std::bind(&foo, s); } auto make_lambda(std::string s) { return [s] { return foo(s); }; } auto make_bind_front(std::string s) { return bind_front(&foo, s); } auto make_bind_back(std::string s) { return bind_back(&foo, s); }
Invocations in the form make_bind("a")()
and make_lambda("a")()
and well-formed and are
invoking function foo
with lvalue reference to temporary string. In case of proposed functions, value
category of the functor also affects stored argument and corresponding calls make_bind_front("a")()
and make_bind_back("a")()
are ill-formed.
As as consequence of the lack of propagation of the value category, existing partial function application solutions are unable to support function that provides one-shot invocation, via rvalue qualified call operator.
As consequence for the following declarations:
struct CallableOnce { void operator()(int) &&; }; auto make_bind(int i) { return std::bind(CallableOnce{}, i); } auto make_lambda(int i) { return [f = CallableOnce{}, i] { return f(i); }; } auto make_bind_front(int i) { return bind_front(CallableOnce{}, i); } auto make_bind_back(int i) { return bind_back(CallableOnce{}, i); }
Only the invocation make_bind_front(1)()
and make_bind_back(1)()
are well formed,
as the other two (make_bind(1)()
and make_lambda(1)()
) leads to unsupported call
on the lvalue of CallableOnce
.
It case of use of lambda expression it would be possible to workaround the problem by explicit use of the
std::move
:
[f = CallableOnce{}, i] { return std::move(f)(i); }
However above code is forcing calls on rvalue of CallableOnce
, even if lvalue functor is invoked.
As consequence multiple calls may be performed on single instances of CallableOnce
class.
It is worth to notice that supporting one-shot invocation for the argument binders, is leading for the improved performance.
For example let consider that we want to bind a vector v
as the first argument to the following function:
void bar(std::vector<int>, int i)
Depending on the scenario, at the point of the call of the bind-wrapper (bw
) that we will create, we may want to:
bar
function, if bw
will be called only once (one-shot)bar
function, if bw
will be called multiple timesProposed bind_front
function support both scenarios, via rvalue and lvalue overloads of call operator.
Consequently if bw
is created using bind_front(&bar, v)
:
std::move(bw)(10)
will move stored vector (pass as rvalue reference)bw(10)
will copy stored vector (pass as lvalue reference)The section provides rationale for deprecating existing std::bind
even in the situation
when proposed new functions does not strictly supersede its functionality.
In contrast to the std::bind
proposed bind_front
/bind_back
does not support
rearrangements or dropping of the call arguments, that was supported by std::bind
. The reasoning two drop
this functionality was twofold.
Firstly, handling of the placeholder was requiring a large amount of the meta-programing, to only determine types and values of the argument that will be actually passed to stored callable. However in this case required complexity of the implementation is not only affecting the vendors, but also leads to unreadable error message produced to the user.
Secondly, repeated uses of the placeholder leads to double move of the object and unspecified values of the argument. In addition the occurrence of this problems depends both of the bound arguments passed to the bind and once provided on the call side. This problem could potentially be fixed by introducing another type of placeholder that would pass rvalues as const rvalue reference or additional logic that will detect duplicated arguments on compile them and modify their value category. However both solutions would only increase the complexity of implementation and use.
Both proposed function does not give provide any special meaning to the nested bind expressions (functors produced
by std::bind
) and their are passed directly to the stored callable in case of the invocation.
Firstly, in the author opinion, use of nested bind leads to unreadable code that are clearly improved by being replaced with customer functor, especially in situation when such functor can be created in place using lambda expression.
Secondly, special treatment of nested bind expressions and placeholders hardens the reasoning about the bind
expression, by leading to the situations when std::bind(f, a, b, c)()
is not invoking f(a, b, c)
,
despite the user intent. This may occur in situation when type of argument passed to std::bind
as not know
by the programmer at point of binding, like in case when argument of function template are used:
struct apply_twice { template<typename F, typename V> auto operator()(F const& f, V const& v) const -> decltype(f(f(v))) { return f(f(v)); } }; template<typename F> auto twicer(F&& f) { return std::bind(apply_twice{}, std::forward<F>(f), _1); } double cust_sqrt(double x) { return std::sqrt(x); } double cust_pow(double x, double n) { return std::pow(x, n); }
Invocation of twicer(&cust_sqrt)(16)
is valid and return 2, while twicer(std::bind(&cust_pow, _1, 2))(2))
is invalid.
To be determined.
Example implementation of proposed bind_front
:
template<typename Func, typename BoundArgsTuple, typename... CallArgs> decltype(auto) bind_front_caller(Func&& func, BoundArgsTuple&& boundArgsTuple, CallArgs&&... callArgs) { return std::apply([&func, &callArgs...](auto&&... boundArgs) { return std::invoke(std::forward<Func>(func), std::forward<decltype(boundArgs)>(boundArgs)..., std::forward<CallArgs>(callArgs)...); }, std::forward<BoundArgsTuple>(boundArgsTuple)); } template<typename Func, typename... BoundArgs> class bind_front_t { public: template<typename F, typename... BA, std::enable_if_t<!(sizeof...(BA) == 0 && std::is_base_of_v<bind_front_t, std::decay_t<F>>), bool> = true> explicit bind_front_t(F&& f, BA&&... ba) : func(std::forward<F>(f)) , boundArgs(std::forward<BA>(ba)...) {} template<typename... CallArgs> auto operator()(CallArgs&&... callArgs) & -> std::result_of_t<Func&(BoundArgs&..., CallArgs...)> { return bind_front_caller(func, boundArgs, std::forward<CallArgs>(callArgs)...); } template<typename... CallArgs> auto operator()(CallArgs&&... callArgs) const & -> std::result_of_t<Func const&(BoundArgs const&..., CallArgs...)> { return bind_front_caller(func, boundArgs, std::forward<CallArgs>(callArgs)...); } template<typename... CallArgs> auto operator()(CallArgs&&... callArgs) && -> std::result_of_t<Func(BoundArgs..., CallArgs...)> { return bind_front_caller(std::move(func), std::move(boundArgs), std::forward<CallArgs>(callArgs)...); } template<typename... CallArgs> auto operator()(CallArgs&&... callArgs) const && -> std::result_of_t<Func const(BoundArgs const..., CallArgs...)> { return bind_front_caller(std::move(func), std::move(boundArgs), std::forward<CallArgs>(callArgs)...); } private: Func func; std::tuple<BoundArgs...> boundArgs; }; template<typename Func, typename... BoundArgs> auto bind_front(Func&& func, BoundArgs&&... boundArgs) { return bind_front_t<decay_unwrap_t<Func>, decay_unwrap_t<BoundArgs>...>{std::forward<Func>(func), std::forward<BoundArgs>(boundArgs)...}; }
To properly handle std::reference_wrapper
in above code, we use decay_unwrap
auxilary trait, which is defined as follows:
template<typename T> struct decay_unwrap; template<typename T> struct decay_unwrap<std::reference_wrapper<T>> { using type = T&; }; template<typename T> struct decay_unwrap : std::conditional_t< !std::is_same<std::decay_t<T>, T>::value, decay_unwrap<std::decay_t<T>>, std::decay<T> > {}; template<typename T> using decay_unwrap_t = typename decay_unwrap<T>::type;


What’s the best blue electric kettle on the market?
The best blue electric kettle is up for debate today. Obviously electric machines are very popular, and to meet the demand there are tons of companies that make them. In other words, finding the right one is not that easy. If you are stuck as to which one to buy, here is one to consider:
Alessi MG32
I’ll warn you now - this isn’t a cheap kettle. In fact, it’s a pretty amazingly expensive one. However, it’s worth it.
First, it looks great. It’s designed by architect Michael Graves, and it’s been a favourite design for more than 25 years now. The earlier versions were not electric, but the newer electric models share the same style as the older ones. The outside is stainless steel, and is surrounded by a bright blue bottom and handle. It is topped off by an interesting bird spout, which is pretty much unique on the market.
In other words, this one is not for the faint of heart, and is definitely for the more daring homeowner.
The other reason it is one of the best is that it is actually quite functional. In other words, it does not sacrifice functionality for style. First it is made with quality stainless steel, which is a marked upgrade over the cheaper plastic material many models use.
Plastic not only does not last as long, but also many owners have trouble adjusting to the foul smell the material gives off. For both these reasons, stainless steel is superior. Another great thing about this model is that it boils a maximum load, 1.4 liters of water, within 4 minutes - pretty swift.
The one negative about this model is the price. Due mostly to the unique styling, it sells for $300 at most sites, which is 200-300% as much as other models. Obviously the functionality is good, but it really is not that much superior in quality to other models.
In other words, you are paying for the design - make no mistake about it. It’s a premium price, but f you are looking for a way to spruce up your kitchen, then you simply cannot beat this model.
The bottom line is, the Alessi MG32 is one of the, if not the top blue electric kettle on the market. It is expensive. However, check [http://www.eBay.com]. Here you can occasionally find it for as low as $240 in some instances.
Definitely wanting a cheaper blue kettle? Well, you won’t find anything this nice. However, the Morphy Richards “Accents” pyramid kettle has a similar vibe - it’s stainless steel, it’s quite traditional in appearance, and importantly it gets stellar reviews from users. Not a designer kettle, maybe, but a good alternative.