--- layout: post title: unused shots for a commercial date: '2015-10-08T02:05:06+02:00' categories: - Storyboards picture_url: https://film-Storyboards.tumblr.com/post/130736395046/unused-shots-for-a-commercial ---
Unused shots for a commercial.


Module CTaskStack
The class for the task stack
version 0.91 beta for the task stack
Global(s)
| CTaskStack() |
Constructor of the class CTaskStack |
| taskstack |
A global object of the class CTaskStack This is the default object |
Type CTaskStack
| CTaskStack.empty() |
Get if the stack is empty? |
| CTaskStack.getn() |
Get the size of the stack. |
| CTaskStack.list() |
list values on screen |
| CTaskStack.new() |
It's a fabric method for objects of the class CTaskStack |
| CTaskStack.peek() |
Let you peek on the top of the stack without removing anything. |
| CTaskStack.pop(num) |
Pop a object from the top of the stack of |
| CTaskStack.push(...) |
Push a object on to the stack of |
| CTaskStack.push_args(...) |
Put the list of args to the task on top of the stack |
| CTaskStack.push_args_switch(args, fail_args, success_args) |
Put the lists of args to the task on top of the stack This version is for the distribution of the args when you creating logical switches when you don't want to return to the original task |
| CTaskStack.push_switch(...) |
Remove a value from the stack and than push a new value on the stack This method is for creating logical switches when you don't want to return to the original task when the new task is finished through fail or success. |
| CTaskStack.push_task(name, func, fail_name, fail_func, success_name, success_func) |
Push a new task on the top of the stack The new task that will be pushed on the stack depends on the args |
| CTaskStack.run() |
Run the function for the task which is on top of the stack. |
Global(s)
- CTaskStack()
-
Constructor of the class CTaskStack
- taskstack
-
A global object of the class CTaskStack This is the default object
Type CTaskStack
Field(s)
- CTaskStack.empty()
-
Get if the stack is empty?
Return value
#boolean: if the stack is empty or not.
- CTaskStack.getn()
-
Get the size of the stack.
Return value
#number: size of the stack..
- CTaskStack.list()
-
list values on screen
- CTaskStack.new()
-
It's a fabric method for objects of the class CTaskStack
Return value
#CTaskStack: new instance object of CTaskStack
- CTaskStack.peek()
-
Let you peek on the top of the stack without removing anything.
Return value
CTask#CTask: Return the task from the top of the stack.
- CTaskStack.pop(num)
-
Pop a object from the top of the stack of
Parameter
-
#number num
: optional) Number of object which should be removed from the top of the stack if nil 1
Return value
CTask#CTask: Return the task(s) from the top of the stack depend on the param num
-
- CTaskStack.push(...)
-
Push a object on to the stack of
Parameter
-
#vars ...
: A single object or a list of objects to push on the stack.
-
- CTaskStack.push_args(...)
-
Put the list of args to the task on top of the stack
Parameter
-
#vars ...
: List of args which should append on the task
-
- CTaskStack.push_args_switch(args, fail_args, success_args)
-
Put the lists of args to the task on top of the stack
This version is for the distribution of the args when you creating logical switches when you don't want to return to the original task
Parameters
-
#table args
: List of args which should append on the task for default -
#table fail_args
: List of args which should append on the task for the case that the task fails. -
#table success_args
: List of args which should append on the task for the case that the task success.
-
- CTaskStack.push_switch(...)
-
Remove a value from the stack and than push a new value on the stack
This method is for creating logical switches when you don't want to return to the original task when the new task is finished through fail or success.
That the code is outsouced has only symatic reasons.
Parameter
-
CTask#CTask ...
: A single task or a list of tasks to push on the stack.
-
- CTaskStack.push_task(name, func, fail_name, fail_func, success_name, success_func)
-
Push a new task on the top of the stack The new task that will be pushed on the stack depends on the args
Parameters
-
#string name
: The name of the label for this task -
#function func
: The function which should be called in this task -
#string fail_name
: (optional) Name for the label of the task which should be called if the previous task fails. -
#function fail_func
: (optional)The function which should be called if the previous task fails. -
#string success_name
: (optional) Name for the label of the task which should be called if the previous task success. -
#function success_func
: (optional)The function which should be called if the previous task success.
-
- CTaskStack.run()
-
Run the function for the task which is on top of the stack.
Return values
-
#boolean: if call was success full,
-
CTask#CONSTANCE: What happend STATEPENNDING, STATEFAILED ,STATESUCCESS, STATENIL.
-
#vars: Unknown amount of args from the called function.
-
Type var
Any type of var including lists
Type vars
One or more incoming argument.


During 36 caffeine-filled, sleepless hours, students from the University of Tennessee and elsewhere will brainstorm, build, break, test, and deploy whatever they can imagine, for the chance to win amazing prizes.
There will also be plenty of time to interact with professional mentors and engineers, meet recruiters, and listen to great tech talks and tutorials from sponsors.
venue
hours
spots
The Min Kao building is one of the newest buildings on campus, with an expansive interior, modern architecture, and ridiculous internet speeds. Min Kao houses the Department of Electrical Engineering and Computer Science, and is a hotspot of innovation at the university. This weekend, it will be home to over 300 hackers building the technology of tomorrow.
square feet
wifi
food and drinks
mile from downtown
floors of hacking space
swag
Register online to reserve your place! That way, if we fill up, we don't have to give you a thumbs-down after you get here.
Student RegistrationA student hackathon is a marathon of innovation, usually 24-36 hours in which students passionate about creating concepts and technology form teams and compete with other teams to generate, develop and/or implement a new idea from scratch in order to learn and have fun."
Nothing. Zero. Null. The event is completely free for eligible and registered students. We will provide you with the venue, food, drinks, place to sleep if needed, Wi-Fi, etc.
All current undergraduate and graduate students, or those who graduated within the last 12 months, are allowed to attend (if you registered through https://volhacks2018-studentreg.herokuapp.com/login). If you currently attend the University of Tennessee, you are guaranteed a spot, with or without registration — but please register to make sure we have enough swag and food!
The VolHacks team is excited to offer travel reimbursement this year for hackers attending our event! We want to lighten the burden on hackers who are coming from far away! You can find our exact travel reimbursement model when you confirm your application acceptance. If you have any questions or need special accommodations please feel free to reach out to us. If you sign up, please make all efforts to attend!
Yes! Absolutely! We will provide catered meals, drinks at all times, snack breaks, and endless caffeine.
We will have a designated quiet sleeping area on site, and you are encouraged to bring sleeping bags, blankets, pillows, toiletries, and anything else you need to sleep. There are no showers at the venue, so please be prepared to go without showering unless you have other accommodations.
VolHacks will take place on September 28th to September 30th, at the University of Tennessee, Knoxville in the Min Kao EECS Building. Click here for directions.
There is a maximum of 4 people per team. Once the idea brainstorming session is done, there will be an open mic and networking time to find a team. Everyone registered will also be invited to the VolHacks Slack team prior to the hackathon in order to network and discuss ideas.
Yes! VolHacks is not just software! The Hardware Lab is an area where you can borrow hardware you need to create your hack, using your government issued ID. Feel free to bring your own hardware or send suggestions on what feel you would like to use. You can review a list of hardware lab here.
Yes, we abide by the Major League Hacking Code of Conduct.
Nope, we are not a lock-in. We realize that 36 hours is a long time, and that some people might have other commitments during that time. Feel free to stay and leave as you choose.
Free parking is available in the 11th Street Parking Garage, right across the street from Min Kao.
No worries at all. We will be providing mentors during the hackathon and running workshops, as well as providing food and drinks and a place to sleep if you don't have one. We will also have a Slack team for anyone to get help at during the hackathon. You don't need to be good at writing code or building things, this is a learning experience and chance to have fun above everything else!
You will definitely need your laptop, phone, their chargers, as well as a valid government issued ID. Feel free to also bring along a sleeping bag, and we recommend some comfortable clothes.
You are not limited to what you can make, hack, or build for the hackathon except for the following restrictions:
Don't worry at all! We will walk you through how to brainstorm great ideas at the beginning of VolHacks.
Feel free to email us about the event, sponsoring us, partnering with us, or with any other questions!
VolHacks will take place in the Min Kao EECS building on UT's campus:
1520 Middle Dr, Knoxville, TN 37996
You can park in the 11th Street Parking Garage right across the street for free.


Titanic
In the first and last voyage of the chic Titanic, two meet. The lower deck passenger Jack won a ticket at cards, and the heiress rose goes to America to marry for convenience. The feelings of young people only have time to blossom, and not even class differences will create a test for lovers, but an iceberg that stood in the way of a ship that was considered unsinkable.


Head Database¶
The author of PetBlocks is in a official partnership with the author of the Head Database plugin.
This means you can use all of the heads of the Head Database plugin in PetBlocks.
Warning
Please notice that Head Database plugin is a premium plugin and the author of PetBlocks is not responsible for any legal agreements between the author of Head Database and yourself.
You need to get a valid spigot account in order to buy and download the plugin from the following url.
https://www.spigotmc.org/resources/14280
Configuring in the config.yml¶
Set the following script tag to any GUI item in the config.yml to initiate a head database connection.
script-tag
connect-head-database
config.yml
headdatabase-skins:
row: 3
col: 8
script: 'connect-head-database'
icon:
id: 397
damage: 3
name: '&c&lHead Database costumes'
skin: 'http://textures.minecraft.net/texture/3bb612eb495ede2c5ca5178d2d1ecf1ca5a255d25dfc3c254bc47f6848791d8'
lore:
- '&7Use heads from an external plugin as costume.'
Usage ingame¶
Click on the headdatabase icon on the wardrobe page.
Click on a category to select a skin.
Click on any skin you like.
The GUI of PetBlocks opens again with your selected skin.
Note
Note - You can even use the search compass in HeadDatabase when selecting a PetBlocks skin.


Chocolate Pizza
POSTED ON 15 DEC 2013/DESERTS
For the fig-swirl:Melt butter over medium heat in a saucepan.Add brown sugar and stir to dissolve.Halve all of the figs and toss in the saucepan with water and lemon juice.Cook over medium heat, stirring frequently, until you have a chunky-jammy mixture.Add salt with one or two stirs,set aside and let cool completely.
Ice cream: In a small pot over medium heat, combine milk, and granulated sugar until sugar is completely dissolved abd the milk is just barely lukewarm.Whisk in the egg yolks. Set mixture in the fridge and wait until the fig mixture is cooled.
Using an ice cream amchine, pour liquids into the frozen basin and process according to manufacturer instructions i.e., let spin and thicken for 20 minutes before adding mascarpone, fig jam mixture,and the nuts.Continue to process for +/- 10 minutes. Pour semi-frozen mixture into a pyrex dish or glass tupperware. Freeze for at least two hours before serving.


Ram raid will have 'dramatic impact' on villagers, say locals
by Will JeffordA ram raid in a Suffolk village could have a 'dramatic impact' on residents, leaving them without a cashpoint or a potentially life-saving defibrillator.
Ram raiders targeted the Co-op in Debenham the third time - using a JCB to smash the wall and remove the cash machine, damaging the village's defibrillator in the process.
Councillors are now saying that the resulting damage and the continued targeting of the Co-op means that the effect of this break-in will be longer than just the shop closure.
The shop was last targeted in February 2018 where residents awoke to a similar scene as the one today.
Raiders again smashed the wall of the shop, removing the cashpoint again using a JCB just weeks after the store was again targeted, this time by burglars who stole cigarettes from the store.
Kathie Guthrie, Ward councillor for Debenham Ward said: "It really does have a dramatic impact on the villagers. It will last for a while. It is not nice to see crime like this going on in your village.
"There is another cash point in Debenham, but it is in the Post Office, inside the Co-op, which is of course now closed.
"There are lots of elderly people in this community and they want to use cash in the shops around here.
"We have a lovely grocery and a paper shop but this is the only convenience store here. When it is closed people have to go to Framlingham or Stowmarket and a lot of the residents can't get there."
Businesses also say they will also feel the pinch after the ram raid due to a reduction in the number of people coming to the village centre to visit the shops located there.
"Last time this happened our takings went down," said Kelly Hammond, from Henry Abbott Hardware.
"They have done serious damage this time and it affects our business."
Another lasting effect on the village is the damage to the defibrillator bought by the Co-op for the village which will now be out of use for the foreseeable future, according to Debenham First Responders.
Cllr Guthrie added: "The defibrillator is a vital bit of equipment in the village.
"We have fantastic first responders in the village who will have to fun another defibrillator if it is damaged and I'm sure that Debenham residents will stand up to help with that, but I don't know where it will be located now.
"I don't think that people that do this kind of thing realise the small consequences which could effect people's lives."
Following the incident, Suffolk police arrested a man in connection with the raid.


A refreshed JavaScript Datepicker and Rangepicker — accessible, lightweight, no dependencies, modular CSS.
Since version 1.0 Pikaday is a stable and battle tested date-picker. Feel free to use it however you like but please report any bugs or feature requests to the GitHub issue tracker, thanks!
Hinderling Volkart AG | BSD & MIT license | Copyright © 2014 David Bushell | BSD & MIT license


If you want to give a talk at JAMS or participate in our events, you can approach one of our committee members directly or email us at siamsc@maths.ox.ac.uk


public interface AuditManager
Auditing currently saves audit data to a raw XML file which can later be processed and mined for information.
| Modifier and Type | Field and Description |
|---|---|
static int |
PRESENCE_AVAILABLE_AVAILABLE |
static int |
PRESENCE_AVAILABLE_UNAVAILABLE |
static int |
PRESENCE_UNAVAILABLE_AVAILABLE |
static int |
PRESENCE_UNAVAILABLE_UNAVAILABLE |
| Modifier and Type | Method and Description |
|---|---|
void |
addXPath(String xpathExpression)
Adds an XPath expression to be used for filtering packets to be audited.
|
Auditor |
getAuditor()
Factory method for creating auditors that are configured by this
audit manager.
|
Collection<String> |
getIgnoreList()
Returns the list of usernames that won't be audited.
|
String |
getLogDir()
Returns the absolute path to the directory where the audit log files will be saved.
|
int |
getLogTimeout()
Returns the time in milliseconds between successive executions of the task that will save
the queued audited packets to a permanent store.
|
int |
getMaxDays()
Returns the maximum number of days to keep audit information.
|
int |
getMaxFileSize()
Obtain the maximum size of audit log files in megabytes.
|
int |
getMaxTotalSize()
Returns the maximum size in megabytes that all audit log files may have.
|
Iterator |
getXPathFilters()
Obtain an iterator over the XPath expressions (Strings) currently registered
with the audit manager.
|
boolean |
isAuditIQ()
Determines if the server will audit all iq packets.
|
boolean |
isAuditMessage()
Determines if the server will audit all message packets.
|
boolean |
isAuditPresence()
Determines if the server will audit all presence packets.
|
boolean |
isAuditXPath()
Determines if the server will audit packets using XPath expressions.
|
boolean |
isEnabled()
Determines if auditing is enabled at all.
|
void |
removeXPath(String xpathExpression)
Removes the XPath expression from the set being used for filtering packets to be audited.
|
void |
setAuditIQ(boolean enabled)
Enables or disables the server auditing of all iq packets.
|
void |
setAuditMessage(boolean enabled)
Enables or disables the server auditing of all message packets.
|
void |
setAuditPresence(boolean enabled)
Enables or disables the server auditing of all presence packets.
|
void |
setAuditXPath(boolean enabled)
Enables/disables server auditing of packets using XPath expressions.
|
void |
setEnabled(boolean enabled)
Turns auditing off or on for the manager as a whole.
|
void |
setIgnoreList(Collection<String> usernames)
Sets the list of usernames that won't be audited.
|
void |
setLogDir(String logDir)
Sets the absolute path to the directory where the audit log files will be saved.
|
void |
setLogTimeout(int logTimeout)
Sets the time in milliseconds between successive executions of the task that will save
the queued audited packets to a permanent store.
|
void |
setMaxDays(int count)
Set the the maximum number of days to keep audit information.
|
void |
setMaxFileSize(int size)
Set the maximum size of audit log files in megabytes.
|
void |
setMaxTotalSize(int size)
Sets the maximum size in megabytes that all audit log files may have.
|
static final int PRESENCE_UNAVAILABLE_AVAILABLE
static final int PRESENCE_AVAILABLE_AVAILABLE
static final int PRESENCE_AVAILABLE_UNAVAILABLE
static final int PRESENCE_UNAVAILABLE_UNAVAILABLE
boolean isEnabled()
void setEnabled(boolean enabled)
enabled
- true if auditing is enabled, false indicates no auditing will occur.Auditor getAuditor()
int getMaxTotalSize()
void setMaxTotalSize(int size)
size
- the maximum size of all audit logs in megabytes.int getMaxFileSize()
void setMaxFileSize(int size)
size
- the maximum audit log file size in megabytes.int getMaxDays()
void setMaxDays(int count)
count
- the maximum number of days to keep audit information
or -1 for unlimitedint getLogTimeout()
void setLogTimeout(int logTimeout)
logTimeout
- the time in milliseconds between successive executions of the task that will save
the queued audited packets to a permanent store.String getLogDir()
void setLogDir(String logDir)
logDir
- the absolute path to the directory where the audit log files will be saved.boolean isAuditMessage()
Determines if the server will audit all message packets.
This is a speed optimization and convenience for logging all message packets rather than using an XPath expression.
void setAuditMessage(boolean enabled)
Enables or disables the server auditing of all message packets.
This is a speed optimization and convenience for logging all message packets rather than using an XPath expression.
enabled
- True if all messages are to be auditedboolean isAuditPresence()
Determines if the server will audit all presence packets.
This is a speed optimization and convenience for logging all presence packets rather than using an XPath expression.
void setAuditPresence(boolean enabled)
Enables or disables the server auditing of all presence packets.
This is a speed optimization and convenience for logging all presence packets rather than using an XPath expression.
enabled
- True if all presence are to be auditedboolean isAuditIQ()
Determines if the server will audit all iq packets.
This is a speed optimization and convenience for logging all iq packets rather than using an XPath expression.
void setAuditIQ(boolean enabled)
enabled
- true if all iq are to be audited.boolean isAuditXPath()
void setAuditXPath(boolean enabled)
Enables/disables server auditing of packets using XPath expressions.
XPath expressions provide a lot of power in specifying what is logged. However, it is much more compute intensive than other techniques and requires all packets be transformed into DOM objects (which can be computationally expensive).
enabled
- true if XPath expressions should be auditedvoid addXPath(String xpathExpression)
xpathExpression
- the xpath expression to add to the list of auditing filters.void removeXPath(String xpathExpression)
Removes the XPath expression from the set being used for filtering packets to be audited.
XPath expressions aren't evaluated or used for filtering unless isAuditXPath() returns true.
xpathExpression
- The xpath expression to remove from the list of auditing filtersIterator getXPathFilters()
Obtain an iterator over the XPath expressions (Strings) currently registered with the audit manager.
XPath expressions aren't evaluated or used for filtering unless isAuditXPath() returns true.
void setIgnoreList(Collection<String> usernames)
usernames
- the list of usernames that won't be audited.Collection<String> getIgnoreList()
Copyright © 2003-2008 Jive Software.


{% extends 'base.html' %} {% block content %}
View the LTI configuration xml here
This configuration is used to install your LTI tool into an LSM. This xml can be referenced by url or copied and pasted durring the install process.
View the LTI Launch endpoint here
Note, this url is typically sent a POST request with all sorts of LTI data. If you access it directly, it'll display an error page indicating your request did not validate.


File not found (404 error)
You are out in the weeds ...
If you think what you're looking for should be here, please contact the site owner.
You are out in the weeds ...
If you think what you're looking for should be here, please contact the site owner.


Today I had my phone interviews with Amazon for the Software Engineering Intern position in Seattle. This was my first “real” technical interview and consisted of two 45 minute sessions. Both interviewers were very nice and they didn’t waste any time getting to the technical questions. It began with simple OO questions such as:
How are abstract classes and interfaces different?
What are the differences between runtime exceptions and a checked exception?
There were some more questions like this but I don’t recall all of them. Next was the programming portion so I was told to hop on Collabedit where the interviewer typed comments describing what the program should do. I used Java because the interviewers knew it and I’ve been practicing with it. The first program was a pretty basic hash problem where I had to write a function that returned the intersection of two input sets. I mentioned the brute-force O(n2) time approach with O(1) space and then decided to use a HashMap<Integer, Boolean> for my implementation for O(n) time and O(n) space. I initially just used the map’s value to indicate whether the element was inserted or not allowing for duplicates but later used the value to filter out duplications once the interviewer asked me to.
The second question was to implement a deck of cards along with shuffle() and deal(). Once again a pretty typical question and my answer was pretty standard although I disliked the way I handled the randomization in shuffle(). I realized that repeating rand % 52 until all the empty slots are filled would take forever but my workaround wasn’t ideal. Anyways, the interviewer then let me ask some questions about Amazon so we talked about team sizes, interaction, and the people.
The next interviewer covered one of the projects on my resume, followed by some additional quick questions that covered sets, lists, and maps. He then asked me to write a function that takes in two strings, A & B. The function then returns a String with the characters of A in the order of B. An example of this is A: cat, B: tar, sorted: tac. Notice how ‘c’ is not in B so it is just pushed to end of the returned list. I didn’t quite finish my implementation during the interview but this is an example of a solution I wrote up afterwards. I haven’t tested it thoroughly but it works for simple cases.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
After the interview I was not too happy with my performance but it was a great experience. To prepare for it I have been reading Cracking the Coding Interview so I will keep going at that and schedule some more interviews for additional practice. I would definitely recommend the book for anyone who is interested in a Software Engineering position at a major technology company like Amazon, Google or Apple.


Delay Estimation Methodology
Context
This doc describes the delay estimation methodology used in XLS and related background.
Estimating delays through networks of CMOS gates is a rich topic, and Static Timing Analysis (STA) is used in chip backend flows to ensure that, even for parts operating at the tail end of the distribution, chips continue to function as specified logically in the netlist.
In stark contrast to something with very concrete constraints, like a "post-global routing, high-accuracy parasitics static timing analysis", the HLS tool needs to estimate at a high level, reasonably near to the user's behavioral specification, what delay HLS operations will have when they are "stacked on top" of each other in a data dependent fashion in the design.
This information lets the HLS tool schedule operations into cycles without violating timing constraints; e.g. if the user specifies 1GHz (= 1000ps) as their target clock frequency, the HLS tool may choose to pack as much data dependent work into the 1000ps budget (minus clock uncertainty) as it can on any given cycle.
Although what we're estimating is a close relative of Static Timing Analysis, the fact it's being analyzed at a very high level presents a different set of tradeoffs, where coarse granularity estimation and conservative bounds are more relevant. Fine-grained / precise analyses are used later in the chip design process, in the backend flows, but the HLS tool acts more like an RTL designer, creating an RTL output that early timing analysis deems acceptable.
Notably, we don't want to be too conservative, as being conservative on timing can lead to designs that take more area and consume more power, as the flops introduced by additional pipeline stages are significant. We want to be as accurate as possible while providing a good experience of being able to close timing quickly (say, in a single pass, or with a small number of iterations in case of a pathological design).
Background
What XLS is compiling
XLS currently supports feed-forward pipelines -- once the user program is unrolled into a big "sea of nodes" we must schedule each of those operations (represented by nodes) to occur in a cycle.
It seems clear that an operation like add(bits[32], bits[32]) -> bits[32]
takes some amount of time to produce a result -- we need to be able to determine
what that amount of time is for packing that operation into a given cycle.
1 Note that XLS operations are parametric in their
bitwidth, so add(bits[17], bits[17]) -> bits[17]
is just as possible as a
value like 32
. This ain't C code.
1: Note that we currently pack operations into cycles
atomically -- that is, we don't break an add
that would straddle a cycle
boundary into add.first_half
and add.second_half
automatically to pull
things as early as possible in the pipeline, but this is future work of
interest. Ideally operations would be described structurally in a way that could
automatically be cut up according to available delay budget. This would also
permit operations in the IR that take more than a single cycle to produce a
value (currently they would have to be "legalized" into operations that fit
within a cycle, but that is not yet done, the user will simply receive a
scheduling error).
Some operations, such as bit_slice
or concat
are just wiring "feng shui";
however, they still have some relevance for delay calculations! Say we
concatenate a value with zeros for zero extension. Even if we could schedule
that in "cycle 0", if the consumer can only be placed in "cycle 1", we would
want to "sink" the concat down into "cycle 1" as well to avoid unnecessary
registers being materialized sending the zero values from "cycle 0".
The delay problem
Separately from XLS considerations, there are fundamental considerations in calculating the delay through clouds of functional logic in (generated) RTL.
Between each launching and capturing flop is a functional network of logic gates, implemented with standard cells in our ASIC process flows. Chip designs target a particular clock frequency as their operating point, and the functional network has to produce its output value with a delay that meets the timing constraint of the clock frequency. The RTL designer typically has to iterate their design until:
timing path delay <= target clock period - clock uncertainty
For all timing paths in their design, where clock uncertainty includes setup/hold time constraints, and slop that's built in as margin for later sources of timing variability (like instantiating a clock tree, which can skew the clock signal observed by different flops).
In a reasonable model, gate delay is affected by a small handful of properties, as reflected in the "(Method of) Logical Effort" book:
- The transistor network used to implement a logic function (AKA logical effort): on an input pin change, the gate of each transistor must be driven to a point it recognizes whether a 0 or 1 voltage is being presented. More gates to drive, or larger gates, means more work for the driver.
- The load being driven by the logic function (AKA electrical effort): fanning out to more gates generally means more work to drive them all to their threshold voltages. Being loaded down by bigger gates means more work to drive it to its threshold voltage.
- Parasitic delays: RC elements in the system that leech useful work, typically in a smaller way compared to the efforts listed above.
The logical effort book describes a way to analyze the delays through a network of gates to find the minimal delay, and size transistors in a way that can achieve that minimal delay (namely by geometrically smoothing the ability for gate to drive capacitance).
Confounding factors include:
- Medium/large wires: sizing transistors to smooth capacitance becomes difficult as fixed-capacitance elements (wires) are introduced. It seems that small wires have low enough capacitance they can generally be treated as parasitic.
- Divergence/reconvergence in the functional logic network (as a DAG). Different numbers of logic levels and different drive currents may be presented from different branches of a fork/join the logic graph, which forces delay analysis into a system of equations to attempt to minimize the overall delay, as observed by the critical path, with transistor sizing and gate choices. (Some simplifications are possible, like buffering non-critical paths until they have the same number of logic levels so they also have plenty of current to supply at join points.)
Somewhat orthogonal to the analytical modeling problem, there are also several industry standards for supplying process information to Static Timing Analysis engines for determining delay through a netlist. This information is often given in interpolated tables for each standard cell, for example in the NLDM model describing how delay changes as a function of input transition time and load (load capacitance).
These models and supplied pieces of data are important to keep in mind for contrast, as we now ignore it all and do something very simple.
Simple Delay Estimation
Currently, XLS delay estimation follows a conceptually simple procedure:
- For every operation in XLS (e.g. binary addition):
* For some relevant-seeming set of bitwidths; e.g.
{2, 4, 8, 16, ..., 2048}
* Find the maximum frequency at which that operation closes timing at that bitwidth, in 100MHz units as determined by the synthesis tool. 2 Call the clock period for this frequencyt_best
. (Note that we currently just use a single process corner / voltage for this sweep.) * Subtract the clock uncertainty fromt_best
. * Record that value in a table (with the keys of the table being operation / bitwidth).
2: The timing report can provide the delay through a path at any clock frequency, but a wrinkle is that synthesis tools potentially only start using their more aggressive techniques as you bump up against the failure-to-close-timing point -- there it'll be more likely to change the structure of the design to make it more delay friendly. The sweep helps to try to cajole it in that way.
Inspecting the data acquired in this way we observe all of the plots consist of one or more the following delay components:
- Constant as a function of bitwidth for a given op (e.g. binary-or just requires a single gate for each bit regardless of the width of the inputs).
- Logarithmic as a function of bitwidth (e.g. adders may end up using tree-like structures to minimize delay, single-selector muxes end up using a tree to fan out the selector to the muxes, etc.).
- Linear as a function of bitwidth (e.g., ripple-carry adders and some components of multipliers).
So given this observation we fit a curve of the form:
a * bitwidth + b * log_2(bitwidth) + c
to the sweep data for each operation, giving us (a, b, c)
values to use in our
XLS delay estimator.
The utility delay_model_visualizer
under the tools
directory renders a graph
of the delay model estimate against the measured data points. This graph for add
shows a good correspondence to the measured delay.
Sweeping multiple dimensions
Operations with attributes in addition to bitwidth that affect delay are swept
across multiple dimensions. An example is Op::kOneHotSelect
which has
dimensions of bitwidth and number of cases. For the Op::kOneHotSelect
example
the formula is:
a * bitwidth + b * log_2(bitwidth) + c * (# of cases) + d * log_2(# of cases) + c
Below is plot of delay for Op::kOneHotSelect
showing the two dimensions of
bitwidth and operand count affecting delay:
Sources of pessimism/optimism
This simple method has both sources of optimism and pessimism, though we hope to employ a method that will be generally conservative, so that users can easily close timing and get a close-to-best-achievable result (say, within tens of percent) with a single HLS iteration.
Sources of pessimism (estimate is conservative):
- The operation sweeps mentioned are not bisecting to the picosecond, so there is inherent slop in the measurement on account of sweep granularity.
- We expect, in cycles where multiple dependent operations are present, there would be "K-map style" logic reductions with adjacent operations. For example, because we don't do cell library mapping in XLS delay estimation, something a user wrote that mapped to an AOI21 cell would be the sum of (and+or+invert) delays.
- [Unsure] May there be additional logic branch splitting options and earlier-produced results available to the synthesis tool when there are more operations in the graph (vs a lone critical path measured for a single operation)?
Sources of optimism (estimate is overeager):
- For purposes of the sweep the outputs of an operation are only loaded by a
single capture flop flop -- when operations have fanout the delay will
increase.
Note that we do account for fanout within individual operations as part of this sweep; e.g. a 128-bit selector fanout (e.g. 128 ways to 128 muxes) for a select is accounted for the in delay timing of the select operation. It is the output logic layer that is only loaded by a single flop in our characterization. Notably because most of these operations turn into trees of logic, there are \(\(log_2(bitcount)\)\) layers of logic in which we can potentially smoothly increase drive strength out to the output logic layer, and paths can presumably be replicated by synthesis tools to reduce pointwise fanout when multiple high-level operations are data-dependent within a cycle. (Is it possible for a user to break up their 32-bit select into bitwise pieces in their XLS code to mess with our modeling? Sure, but probably not too expected, so we're currently sort of relying on the notion people are using high level operations instead of compodecomposing them into bitwise pieces in our graph.)
A potential way to reconcile this output fanout in the future is to do a delay sweep with a high-capacitive fanout (e.g. four flops of load) and then ensure the IR has a maximum fanout of four for our delay estimation.
- Wiring delay / load / congestion / length are not estimated. This will need additional analysis / refinement as we run XLS through synthesis tools with advanced timing analysis, as it is certainly not viable for arbitrary designs (tight pipelines may be ok for now, though).
Iterative refinement
The caveats mentioned above seem somewhat daunting, but this first cut approach appears to work comfortably at target frequenties, in practice, for the real-world blocks being designed as XLS "first samples".
Notably, human RTL designers fail to close timing on a first cut as well -- HLS estimations like the above assist in getting a numeric understanding (in lieu of an intuitive guess) of something that may close timing on a first cut. As this early model fails, we will continue to refine it; however, there is also a secondary procedure that can assist as the model improves.
Let's call the delay estimation described above applied to a program a
prediction of its delays. Let's call the first prediction we make p0
: p0
will either meet timing or fail to meet timing.
When we meet timing with p0
, there may be additional wins left on the table.
If we're willing to put synthesis tool runs "in the loop" (say running a "tuner"
overnight), we can refine XLS's estimates according to the realities of the
current program, and, for example, try to squeeze as much as possible into as
few cycles as possible if near-optimality of latency/area/power were a large
consideration. This loop would generate p1
, p2
, ... as it refined its model
according to empirical data observed from the synthesis tool's more refined
analysis.
When we fail to close timing with p0
, we can feed back the negative slack
delays for comparison with our estimates and relax estimates accordingly.
Additionally, an "aggression" knob could be implemented that backs off delay
estimations geometrically (say via a "fudge factor" coefficient) in order to
ensure HLS developer time is not wasted unnecessarily to ensure. Once a
combination of these mechanisms has obtained a design that closes timing, the
"meeting timing, now refine" procedure can be employed as described above.
On Hints
To whatever extent possible, XLS should be the tool that reasons about how to target the backend (vs having a tool that sits on top of it and messes with XLS' input in an attempt to achieve a result). User-facing hint systems are typically very fragile, owing to the fact they don't have easily obeyed semantics. XLS, by contrast, knows about its own internals, so can do things with awareness of what's happened upstream and what remains to happen downstream.
By contrast, we should continue to add ways for users to provide more semantic information / intent as part of their program (e.g. via more high-level patterns that make high level structure more clear), and make XLS smarter about how to lower those constructs into hardware (and why it should be lowering them that way) in the face of some prioritized objectives (power/area/latency).
That being said, because we're probably trying to produce hardware at a given point in time against a given technology, it likely makes sense to permit human users to specify things directly (at a point in time), even if those specifications might be ignored / handled very differently in the future or against different technology nodes. This would be the moral equivalent of what existing EDA tools do as a "one-off TCL file" used in a particular design, vs something carried from design to design. Recall, though, that the intent of XLS is to make things easier to carry from design to design and require fewer one-off modifications!
Tools
XLS provides tools for analyzing its delay estimation model. (Note that the
given IR should be in a form suitable for code generation; e.g. it has run
through the opt_main
binary).
$ bazel run -c opt //xls/tools:benchmark_main -- $PWD/bazel-bin/xls/examples/crc32.opt.ir --clock_period_ps=500 --delay_model=sky130
<snip>
Return value delay: 8351ps
Critical path entry count: 43
Critical path:
8351ps (+ 21ps): not.37: bits[32] = not(xor.213: bits[32], id=37, pos=[(0,30,51)])
8330ps (+128ps): xor.213: bits[32] = xor(concat.203: bits[32], and.222: bits[32], id=213, pos=[(0,25,19)])
8202ps (+ 81ps): and.222: bits[32] = and(mask__7: bits[32], literal.395: bits[32], id=222, pos=[(0,25,33)])
8121ps (+621ps)!: mask__7: bits[32] = neg(concat.199: bits[32], id=202, pos=[(0,24,15)])
7330ps (+ 0ps): concat.199: bits[32] = concat(literal.387: bits[31], bit_slice.198: bits[1], id=199, pos=[(0,24,21)])
7330ps (+ 0ps): bit_slice.198: bits[1] = bit_slice(xor.196: bits[32], start=0, width=1, id=198, pos=[(0,24,21)])
7330ps (+128ps): xor.196: bits[32] = xor(concat.194: bits[32], and.221: bits[32], id=196, pos=[(0,25,19)])
7202ps (+ 81ps): and.221: bits[32] = and(mask__6: bits[32], literal.394: bits[32], id=221, pos=[(0,25,33)])
<snip>
In addition to the critical path, the cycle-by-cycle breakdown of which operations have been scheduled is provided in stdout.


The Thief of Bagdad (1924)
Grade: 67
TOB is a lengthy, silent movie that moves slowly but is still very interesting to watch. The story is a classic of love not only conquering all, but also changing one's very nature.
Douglas Fairbanks Sr is the Thief, who is proud of his ability to take whatever he wants. He steals a magic rope that can be used to scale the highest walls. He raids the Royal Palace to steal the Princess' jewels, but falls in love with her from one gaze as she sleeps.
On her birthday, royal custom has it that she must choose a husband from among suitors, who must be princes. Four princes are the candidates. The first is nondescript, the second is very fat, the third is evil, the fourth is our hero, the Thief, who has stolen princely garment from a slumbering merchant to have dress for the occasion. He proclaims himself "Prince of the Isles and Seven Seas".
His fraud is discovered, and he is caught, beaten and released. But his efforts has won the love of the Princess. She does not want to wed any other Prince, so she stalls by saying she will choose the suitor who in seven moons brings the rarest treasure.
Our hero must overcome many obstacles to procure his treasure, a magic box from which any object desired can be removed. The other princes each also find rare objects: a magic crystal that can see the future, a flying carpet, a magic apple that can restore life to the dead.
The evil prince is the villian in this movie. He is oriental, and is always cunning and scheming. The other orientals in the film are also this way, actually a weakness of the film. He poisons the princess so that his apple can cure her. He stocks the palace with soldiers so that he can conquer Bagdad. Our hero the thief must overcome not only his treachery, but also his army.
The movie has reasonable special effects, although the monsters would be more scary if they did not simply loom over Fairbanks until he gets around to slicing them with his trusty knife.
http://members.tripod.com/~Brian_Koller/movies.html
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


CoComparable
CoConsole
CoConsoleTextArea
CoDirChoice
CoFile
CoFileList
CoFilenameFilter
CoLoad
CoOpen
CoOrder
CoProgress
CoSort
CoSource
CoStatus
CoTabbed
Ftp
FtpConnect
FtpContext
FtpFile
FtpInputStream
FtpListInputStream
FtpOutputStream
FtpSetting
JCoConsoleTextArea
JCoDirComboBox
JCoFileTable
LocalFile
LocalSource
MultiLabel
MultiList
|


{% extends "base.html" %} {% load static %} {% block content %}
authored by {{ todo.author }} on {{ todo.created_on }}
authored by {{ comm.author }} on {{ comm.created_on }}


--- title: Default Theme ---
Here is a list of recently created themes for the default installation of Hakyll!
…or you can find more in the list of all themes.


Corporate report
Annual Ofsted report letters on the quality of inspections and reports by the School Inspection Service (SIS).
PDF , 217KB , 4 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 183KB , 5 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 157KB , 4 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 163KB , 6 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 1.4MB , 6 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 1.41MB , 5 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 1.39MB , 5 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 40.4KB , 4 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 56.3KB , 4 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
PDF , 1.12MB , 3 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
Ofsted monitors a sample of inspections and reports by the independent sectoral inspectorates, including the School Inspection Service (SIS), at the request of theDepartment for Education (DfE). You can download the annual Ofsted reports on the inspection of schools by the School Inspection Service (SIS).
Published: 27 November 2014
Updated: 23 December 2016
From: Ofsted


The Troubling Saga of Donny Developer & The Infinite Fixture
Donny Developer wants to unit test a controller which manages the online interface of a pizza joint. It looks like this:
angular.module('donny.pizzajoint.admin').controller('AdminDashboardCtrl',
function($scope, $log, $window, User, Settings, Pizza, Toppings, Sides,
Orders, Deliveries) {
$scope.getUsers = function getUsers() {
return User.getAll(Settings.location_id);
};
$scope.getPizzas = Pizza.getAll;
$scope.getSettings = function() {
return Settings;
};
$scope.getToppings = function() {
var toppings = [];
// this inexplicably returns an object, so we convert to an array.
angular.forEach(Toppings.getAll(), function(value, name) {
toppings.push(angular.extend({}, value, {name: name}));
});
return toppings;
};
$scope.getSides = function() {
return Sides.getAll();
};
$scope.getOrders = function() {
return Orders.getPreviousWeek();
};
$scope.getDeliveries = function() {
return Deliveries.getPreviousWeek();
};
});
He'll test this first function, getUsers()
.
The first thing he needs to do is tell his test framework to configure an injector for his module. Donny modifies his runner config to load his module and controller files. Then, he types out a failing test, injecting $controller
in preparation of instantiating AdminDashboardCtrl
.
describe('AdminDashboardCtrl', function() {
beforeEach(module('donny.pizzajoint.admin'));
it('should gather a list of users', inject(function($controller) {
expect(true).to.be.false;
}));
});
Donny expects his test to fail. But he didn't expect his test to error like this:
Error: [$injector:nomod] Module 'donny.pizzajoint.common' is not available! You
either misspelled the module name or forgot to load it. If registering a module
ensure that you specify the dependencies as the second argument.
Donny realizes the donny.pizzajoint.admin
module requires donny.pizzajoint.common
. He examines the donny.pizzajoint.admin
module a little closer, and:
angular.module('donny.pizzajoint.admin', ['donny.pizzajoint.common'
'donny.pizzajoint.food', 'donny.pizzajoint.account', 'donny.pizzajoint.delivery'])
.config(function(UserProvider) {
UserProvider.assertAdmin();
});
Four modules? OK, well, better get to it. He includes the module definitions for his four other modules in his test runner, and tries again. To his dismay:
Error: [$injector:nomod] Module 'ui.router' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.
It appears donny.pizzajoint.common
requires ui.router
. Not to be outdone, he requires the .js
file for the 3rd-party ui.router
in his test runner. Donny wonders if he should really be doing this; isn't it a unit test, after all?
Now, he's able to get his test to load without a nomod
error. But as you can see in the config()
block of module donny.pizzajoint.admin
, we need to be logged in as an administrator. Donny thinks maybe it's a bad idea to try to coerce his test runner into setting session cookies, so he attempts to stub out his provider.
We skip the part where Donny spends 30 minutes figuring out how to stub a provider.
Donny's test now looks like this:
describe('AdminDashboardCtrl', function () {
beforeEach(module(function ($provide) {
$provide.provider('User', function () {
this.assertAdmin = angular.noop;
this.$get = angular.noop;
});
}));
beforeEach(module('donny.pizzajoint.admin'));
it('should gather a list of users', inject(function ($controller) {
expect(true).to.be.false;
}));
});
The moons align and Donny's test fails in the way he expected:
AssertionError: expected true to be false
Awesome! Donny bubbles with excitement as he instantiates his controller,
it('should gather a list of users', inject(function ($controller, $rootScope) {
var scope = $rootScope.$new();
$controller('AdminDashboardCtrl', {
$scope: scope
});
expect(scope.getUsers()).to.eql([]);
}));
and runs his test,
[$injector:unpr] Unknown provider: SettingsProvider <- Settings
Donny didn't really forget that he had to provide Settings
; he just doesn't like to manually provide things, because nobody does. The little devil on his left shoulder says "just include the file!" while the angel on his right shoulder pleads with him not to listen. He relents and decides to stub Settings
. This one is pretty straightforward, as per his $scope.getUsers()
function:
$provide.service('Settings', function() {
this.location_id = 1;
});
While he's nearby, he modifies his User
provider to have a proper factory method:
$provide.provider('User', function () {
this.assertAdmin = angular.noop;
this.$get = function() {
return {
getAll: function() {
return [];
}
};
};
});
Good job Donny! His sense of accomplishment withers once he runs his test again:
[$injector:unpr] Unknown provider: PizzaProvider <- Pizza
Grumbling, he greps his source under test for Pizza
, and finds the $scope.getPizzas()
function. He'll need to provide a Pizza
factory with a getAll()
method...
We skip the 30 more minutes where Donny hunts around his controller for all usages of the service the Scope methods need to run, then provides them all.
Finally, Donny's test passes!
He asserted a stubbed function returns an empty array, and spent a couple hours on it! Too bad he has no confirmation his stub in User.getAll()
was actually called, and he had to include a bunch of unrelated files to be loaded by his test runner.
Donny thinks that next time maybe he will not worry too much about unit testing controller functions that do nothing. His test looks like this, in its entirety:
describe('AdminDashboardCtrl', function () {
beforeEach(module(function ($provide) {
$provide.provider('User', function () {
this.assertAdmin = angular.noop;
this.$get = function() {
return {
getAll: function() {
return [];
}
};
};
});
$provide.service('Settings', function() {
this.location_id = 1;
});
$provide.service('Pizza', function() {
this.getAll = function() {
return [];
};
});
$provide.service('Toppings', function() {
this.getAll = function() {
return {};
};
});
$provide.service('Sides', function() {
this.getAll = function() {
return [];
};
});
$provide.service('Orders', function() {
this.getPreviousWeek = function() {
return [];
};
});
$provide.service('Deliveries', function() {
this.getPreviousWeek = function() {
return [];
};
});
}));
beforeEach(module('donny.pizzajoint.admin'));
it('should gather a list of users', inject(function ($controller, $rootScope) {
var scope = $rootScope.$new();
$controller('AdminDashboardCtrl', {
$scope: scope
});
expect(scope.getUsers()).to.eql([]);
}));
});
Donny wrote about 60 lines of code to badly test one line of code. This is why his product manager hates unit tests. Donny doesn't like the outcome either, and decides to find a better way.
Enter Sinon.JS
Using Sinon.JS, you can easily provide stub functions and make assertions about them. Using Mocha and an assertion library like Chai, combined with sinon-chai, makes this integration even smoother. jasmine-sinon is also available for the Jasmine framework.
Let's take a look at Donny's test and stubs after using Sinon:
describe('AdminDashboardCtrl', function () {
var sandbox;
beforeEach(function () {
sandbox = sinon.sandbox.create('AdminDashboardCtrl');
});
afterEach(function() {
sandbox.restore();
});
beforeEach(module(function ($provide) {
$provide.provider('User', function () {
this.assertAdmin = sandbox.stub();
this.$get = function() {
return {
getAll: sandbox.stub().returns([])
};
};
});
$provide.service('Settings', function() {
this.location_id = 1;
});
$provide.service('Pizza', function() {
this.getAll = sandbox.stub().returns([]);
});
$provide.service('Toppings', function() {
this.getAll = sandbox.stub().returns({});
});
$provide.service('Sides', function() {
this.getAll = sandbox.stub().returns([]);
});
$provide.service('Orders', function() {
this.getPreviousWeek = sandbox.stub().returns([]);
});
$provide.service('Deliveries', function() {
this.getPreviousWeek = sandbox.stub().returns([]);
});
}));
beforeEach(module('donny.pizzajoint.admin'));
it('should gather a list of users', inject(function ($controller, $rootScope, User) {
var scope = $rootScope.$new();
$controller('AdminDashboardCtrl', {
$scope: scope
});
expect(scope.getUsers()).to.eql([]);
expect(User.getAll).to.have.been.calledOnce;
}));
});
This test is now a bit more valuable, because now he can assert his stubs were called, at least. His function is working properly.
Still, that's a lot of code. Donny knows there's a more elegant solution. He's getting smarter by the minute!
Enter angular-debaser
Donny stumbles across this project, installs it via bower
and gives it a spin. He's able to reduce his file dependencies to the following:
3p libs:
angular.js
angular-mocks.js
angular-debaser.js
sinon.js
Files under test:
admin.module.js
admindashboard.ctrl.js
admindashboard.ctrl.spec.js
Only the controller and the spec are included; no dependencies of modules whatsoever are included.
You can actually get around requiring the file declaring the module. Hint: it depends on the order in which files are loaded.
The Big Payoff
His test now looks like this:
describe('AdminDashboardCtrl', function () {
beforeEach(function () {
debaser()
.module('donny.pizzajoint.admin')
.object('Settings', {
location_id: 1
})
.object('User').withFunc('getAll').returns([])
.object('Pizza').withFunc('getAll').returns([])
.object('Toppings').withFunc('getAll').returns({})
.object('Sides').withFunc('getAll').returns([])
.object('Orders').withFunc('getPreviousWeek').returns([])
.object('Deliveries').withFunc('getPreviousWeek').returns([])
.debase();
});
it('should gather a list of users',
inject(function ($controller, User) {
var scope = $controller('AdminDashboardCtrl');
expect(scope.getUsers()).to.eql([]);
expect(User.getAll).to.have.been.calledOnce;
}));
});
It's certainly easier to write simple stubs for dependencies this way. Good job Donny! They lived happily ever after.
Epilogue
Let's take a closer look at the code and explain important lines.
window.debaser()
window.debaser()
gives you a Debaser
instance, which provides many goodies. As you can see, all methods of this object are chainable; they all return the same instance.
This is typically done in a beforeEach()
block.
It can be done elsewhere, and you can actually name your Debaser instances and reference them later, but I haven't tested it much. Sorry!
.module('donny.pizzajoint.admin')
This will detect an existing module, queue it for loading (via angular-mocks
), and stub the config()
block. The stubbing behavior can be turned off via options passed to the debaser()
function (skipConfigs: false
).
.module('donny.pizzajoint.common')
.module('donny.pizzajoint.food')
.module('donny.pizzajoint.account')
.module('donny.pizzajoint.delivery')
The above four lines simply stub out these modules; anything depending on them will be satisfied.
.object('Settings', {
location_id: 1
})
This provides an object based on the second parameter. If this object contained any functions, they would be spied on via Sinon, if sinon
object is present in the global context. If the object was not defined, we would simply provide an empty object.
It's helpful to think in terms of objects and functions when using angular-debaser; it doesn't matter whether you are providing via a value, constant, service, factory, or provider--what matters is the code under test gets the correct data structure injected into it.
Note: You can pass an Array
, Date
, RegExp
, or custom object as the second parameter to object()
. In theory.
Behind the scenes, we declare an anonymous module which provides a
value()
; the value of which is the object.
.object('User').withFunc('getAll').returns([])
.object('Pizza').withFunc('getAll').returns([])
.object('Toppings').withFunc('getAll').returns({})
.object('Sides').withFunc('getAll').returns([])
.object('Orders').withFunc('getPreviousWeek').returns([])
.object('Deliveries').withFunc('getPreviousWeek').returns([])
Each of these lines say, "provide an object with a function in it which returns blah". If you are using Sinon.JS (just load it up with your test runner; angular-debaser will take care of the rest), each of the functions you can apply to a Sinon.JS "stub" are present, and each one will return an instance of Debaser. In this case, returns()
is actually a Sinon.JS function. Thus, if you are not using Sinon.JS, returns()
is simply not available.
There is an exception to this rule (which is an exception in Sinon.JS as well): If you start using the
onCall()
function or its brethren, you don't actually get a stub function back from Sinon.JS; you get aStub
object, which is different. We have you covered. Once you are done configuring your calls, you can simply call.end()
and you will be returned to a Debaser context.
Every line in the code above begins with what is considered a base function. When you execute a base function (only object()
, func()
or module()
at the time of this writing), you start anew, and your previous call(s) are placed into angular-debaser's internal execution queue. So, it's important to understand you can't go backwards. withFunc()
for example, is not a base function, and will only be available after a call to object()
or module()
; otherwise, it will be undefined
and a TypeError
will be thrown.
To create an AngularJS
constant
, usemodule('foo').withFunc('bar')
ormodule('foo').withObject('baz')
. With optionskipConfigs: true
(the default), however, this is rarely necessary.
.debase();
Think of everything before this as simply items going into a bucket. When you execute debase()
, you tip the bucket and magic pours out.
Simply, once you are done configuring your stubs, execute debase()
.
var scope = $controller('AdminDashboardCtrl');
It's common to simply call $rootScope.$new()
in a beforeEach()
block and hand that Scope to the $controller
function. There's an option (on by default) autoScope
which decorates the $controller
function and does this work for you, then returns you the Scope it made. Rarely are you messing with the guts of a controller instance; mostly you want to test Scope members (if anything). This is just a handy shortcut.


|
|
int4 | getId (void) const |
| |
|
int4 | getMaxNum (void) |
| |
|
virtual UnifyConstraint * | clone (void) const =0 |
| |
|
virtual void | initialize (UnifyState &state) |
| |
|
virtual bool | step (UnifyState &state)=0 |
| |
|
virtual void | buildTraverseState (UnifyState &state) |
| |
|
virtual void | setId (int4 &id) |
| |
|
virtual void | collectTypes (vector< UnifyDatatype > &typelist) const |
| |
|
virtual int4 | getBaseIndex (void) const |
| |
|
virtual void | print (ostream &s, UnifyCPrinter &printstate) const =0 |
| |
|
virtual bool | isDummy (void) const |
| |
|
virtual void | removeDummy (void) |
| |
The documentation for this class was generated from the following file:


Works restart at Forrestania Nickel Operation in Western Australia
by HimajaNickel mining firm Western Areas has resumed normal operations at its Forrestania project in Western Australia, following a bush fire incident last week.
The Forrestania Nickel Operation is located 400km east of Perth.
Western Areas noted that the bush fire incident, which likely took place due to a lightning strike, led to the temporary suspension of Forrestania operations last week.
The company added that the mains power was interrupted during the weekend as a result of damage to three power lines. The power was restored by the weekend and mining operations were restarted on site using back-up power generation.
Operations at the Cosmic Boy mill were suspended until the power transmission was restored.
The incident, however, does not have any impact on the company’s nickel production or cost guidance for the 2020 financial year.
At the time of the incident, Western Areas said: “No mining or infrastructure assets have sustained damage and normal operations are expected to resume imminently.”
Forrestania Nickel Operation (FNO) Response Team and various firefighting teams have assisted towards the safe resumption of operation at Forrestania.
Constructed and designed by GR Engineering Services, the Cosmic Bay concentrator uses conventional flotation technology to process ore into nickel concentrate with an average grade of 14% nickel.
Flying Fox is the first mine to be developed at the Forrestania project, which contains some of the highest grade nickel in the world.
Western Areas opened the Forrestania Nickel Concentrate Plant in March 2009. The nickel concentrator at Cosmic Boy treats high-grade nickel ore from Flying Fox.


Move cursor up
Move cursor down
Move cursor left
Move cursor right
Fill
Insert line
Delete line
Clear to end-of-line
Clear to end-of-screen
Clear screen


Kirsten Dunst claims Spider-Man bosses pressured her to fix her teeth
In the spirit of Hollywood smiles being all perfect veneers and bright, white, blinding grins, Kirsten Dunst has revealed Spider-Man bosses once tried to cover up her famous snaggletooth.
Kirsten’s grin was endearing and basically the smile led us into the 00s, strong in the conviction Hollywood was going to be alright.
Be that as it may, as she starred as Mary-Jane Watson in 2002’s Spider-Man (before going on to reprise her role in 2004 and 2007), Kirsten has revealed bosses tried to alter her perfectly imperfect smile.
‘…on Spider-Man one of the producers tried to subtly coerce me into changing my teeth into those perfect Barbie doll teeth,’ Kirsten told News.com.au.
‘I was like, “Nope, not doing that either”.’
She’d recalled the anecdote while talking about a stunt she wasn’t keen to do, and her steadfast objection to doing it despite pushes from bosses.
Advertisement Advertisement
At the age of 20 she was evidently already quite comfortable with sticking up for herself in an industry where other 20-something actress may have felt they were unable.
Speaking about the way in which she was brought up, she cited the strong females who inspired her, as well as landing in the industry and working with the likes of Sofia Coppola as a teenager.
‘You know what, when I was younger I had really strong females around me – my mother, working with Sofia Coppola at 16 when I was really becoming a woman,’ she continued.
‘I had very good influences personally of women who were like, “You’re great, love your teeth, don’t change a thing”.
‘I was given a strong sense of what I feel comfortable with. And, ultimately, it’s a TV show or a movie, so I’m not going to kill myself and get in an accident.
‘If my intuition’s telling me “No, no, no”, then I’m not going to do it…’
Got a showbiz story?
If you've got a story, video or pictures get in touch with the Metro.co.uk Entertainment team by emailing us<EMAIL_ADDRESS>calling 020 3615 2145 or by visiting our Submit Stuff page - we'd love to hear from you.


{% load i18n %}
{% trans "If you aren't registered to vote visit" %} {% trans "https://www.gov.uk/register-to-vote" as register_to_vote_url %} {{ register_to_vote_url }}.
{#{% trans "Register before midnight on Monday 19th April to vote in the election(s) on Thursday 6th May." %}
#}{% trans "You don't need to register again if you've already registered at your current address." %}


The developers expressed that they would readily welcome any further usability help and especially (...) by having a usability specialist as a close-knit part of their team.
Open Source and HCI Philosophies in Open Source Projects - Incompatible or Co-Existent?, M. Rajanen, N. Iivari, University of Oulu, Finland, 2013


About Brainhack
The purpose of Brainhack
Answering the next generation of open questions in neuroscience will require very large data sets and complex analytical methods. The purpose of Brainhack is to bridge the data science and neuroscience research communities by bringing them together to collaborate on a multitude of projects. Brainhack is a unique conference that convenes researchers from across the globe and a myriad of disciplines to work together on innovative projects related to neuroscience. Year after year, global Brainhack events have brought together researchers to participate in open collaboration, and regional Brainhack events keep the momentum going throughout the year.
These collaborative workshops combine elements of Hackathons and Unconferences, with a variety of educational activities, to accelerate the adaptation of data science and computational methods in Neuroscience. Much of the conference is allocated to open working time during which attendees are encouraged to work together in interdisciplinary teams on projects that utilize computational techniques to solve problems in neuroscience. Periodic unconference sessions provide an opportunity for attendees to share their expertise on topics that become relevant through the course of the event. In parallel to these activities, an educational track provide hands-on tutorials on relevant tools such as python, github, cloud computing, and innovative statistical methods.
Who is Brainhack.org?
Board
The board is currently made up of the founders of Brainhack. The board meets quarterly to plan future Brainhack events and discuss other business.
Cameron Craddock, director
Daniel Margulies
Pierre Bellec
Nolan Nichols
Tal Yarkoni
Current Members
The Brainhack organization is composed of individuals that have previously hosted brainhack events and those that plan to host events in the future. Members include:
|
Scott Peltier, PhD, Functional MRI Laboratory, University of
Michigan |
Dan Kessler, University of Michigan |
Alejandro De La Vega, PhD, University of Texas at Austin |
Zuo
Xi-Nian, PhD, Chinese Academy of Sciences |
|
Olaf Sporns, PhD, University of
Indiana at Bloomington |
Sharlene
Newman, PhD, University of Indiana at Bloomington |
Satra
Ghosh, PhD, The Neuro Bureau |
Koene
Van Dijk, PhD, Harvard University |
|
Kirstie Whitaker, PhD, University of Cambridge |
Jason Druzgal, PhD, University of
Virginia |
Amalia McDonald, University of Virigina |
Tor Dessart Wager, PhD, University
of Colorado at Boulder |
|
Luka Ruzic, Duke Institute for Brain
Sciences |
Vesa Kiviniemi, MD, PhD, Oulu University Hospital |
Zang
Yu-Feng, MD, Hangzhou Normal University |
Yating Lv, MD, Beijing Normal University |
|
Anders Eklund, PhD, Universtiy of Linkoping |
Gary Egan, PhD, University of Melbourne |
Lucina Uddin, PhD, The Neuro Bureau |
Angie Laird, PhD, Department of Physics, Florida International
University |
|
Kathryn Mills, PhD, Oregon Health & Science University |
Roberto Toro, PhD, The Neuro Bureau |
Gael Varoquaux, PhD, |
Felipe Rech Meneguzzi,
PhD, Faculdade de Informática,
PUCRS |
|
Gautam
Prasad, PhD, Laboratory of Neuro Imaging, Stevens Neuroimaging and
Informatics Institute, Keck School of Medicine of University of Southern
California |
Tonya White, MD, PhD, University of Rotterdam |
Jean-Baptiste Poline, PhD, Helen
Wills Neuroscience Institute, University of California |
Daniel J. Lurie, PhD, Department of Psychology, University of
California |
|
Russ Poldrack, PhD, Stanford
University |
Ariel Rokem, PhD, The University of
Washington eScience Institute |
Juan Helen Zhou, PhD, The Agency for Science, Technology and
Research, Singapore |
Thomas Yeo Boon Thye. PhD, National
University of Singapore, SINAPSE, Duke-NUS & Athinoula
A. Martinos Center for Biomedical Imaging (Harvard
University) |
|
Asier Erramuzpe Aliaga, PhD, BioCruces Health Research Institute |
Malin Sandstrom, PhD, INCF |
Michael Milham, PhD, Center for Biomedical Imaging and
Neuromodulation, Nathan Kline Institute for Psychiatric Research |
Franz Liem, University of Zurich |
|
Brad Sutton, PhD, Beckman Institute, University of Illinois at
Urbana-Champaign |
John Capozzo, University of Illinois
at Urbana-Champaign |
Sepideh Sadaghiani, PhD, University of Illinois at
Urbana-Champaign |
Sanmi Koyejo, PhD, University of Illinois at Urbana-Champaign |
|
John VanMeter, PhD, Center for
Functional and Molecular Imaging, Georgetown University Medical Center |
Shady El Damaty, Georgetown
University |
Rasmus Birn, PhD, University of Wisconsin at Madison |
Deniz Vatansever, University of Cambridge |
|
AmanPreet
Badhwar, PhD, Centre de Recherche, Institut Universitaire de Gériatrie de Montréal |
Ben Cipollini, PhD, University of California |
Daniel Clark, Center for the Developing Brain, Child Mind
Institute |
Krzysztof J. Gorgolewski, PhD, Poldrack Lab, Department of Psychology, Stanford University |
|
Ayan Sengupta, Otto-von-Guericke University |
Zia Mohaddes, Montréal Neurological
Institute, McGill University and Institute of Pscychology |
Sebastien Dery, McConnell Brain
Imaging Center, Montreal Neurological Institute |
Weiran
Deng, PhD, University of Hawaii John A. Burns School of Medicine |
|
Glad Mihai, PhD, University of Greifswald |
Nick Ketz, Department of Psychology
and Neuroscience, University of Colorado |
Andrew Reineberg, PhD, Institute of
Cognitive Neuroscience, University College London, University of Colorado
Boulder |
Marianne C. Reddan, Department of
Psychology and Neuroscience, University of Colorado |
|
Caroline Froehlich, The Neuro Bureau |
Gil Dekel, PhD, City University of
New York-Hunter College |
Ben D. Fulcher, PhD, Monash Institute of Cognitive and
Clinical Neurosciences, Monash University |
Tristan Glatard, McGill Centre for
Integrative Neuroscience (MCIN), Ludmer Centre for Neuroinformatics and Mental Health, Montreal Neurological
Institute (MNI), McGill University |
|
Rémi
Bernard, McGill Centre for Integrative Neuroscience (MCIN), Ludmer Centre for Neuroinformatics
and Mental Health, Montreal Neurological Institute (MNI), McGill University |
Najmeh Khalili-Mahani, PhD, McGill Centre for Integrative
Neuroscience (MCIN), Ludmer Centre for Neuroinformatics and Mental Health, Montreal Neurological
Institute (MNI), McGill University |
Pierre Rioux, McGill Centre for
Integrative Neuroscience (MCIN), Ludmer Centre for Neuroinformatics and Mental Health, Montreal Neurological
Institute (MNI), McGill University |
Marc-Étienne Rousseau, McGill Centre for Integrative
Neuroscience (MCIN), Ludmer Centre for Neuroinformatics and Mental Health, Montreal Neurological
Institute (MNI), McGill University |
|
Raúl
Hernández-Pérez, PhD, Instituto de Neurobiología |
Edgar A. Morales, PhD, Instituto de Neurobiología |
Laura V. Cuaya, PhD, Instituto de Neurobiología |
Kaori L. Ito, Neural Plasticity and Neurorehabilitation
Laboratory, Chan Division of Occupational Science and Occupational Therapy,
Division of Biokinesiology and Physical Therapy,
Keck School of Medicine Department of Neurology, University of Southern
California |
|
Neda Jahanshad, Imaging Genetics
Center, Laboratory of Neuro Imaging, Keck School of Medicine of USC,
University of Southern California |
Paul Thompson, PhD, Imaging Genetics Center, Laboratory of
Neuro Imaging, Keck School of Medicine of USC, University of Southern
California |
Marcel Falkiewicz, PhD, Max Planck
Research Group for Neuroanatomy & Connectivity, Max Planck Institute for
Human Cognitive and Brain Sciences |
Julia M. Huntenburg, Max Planck
Research Group for Neuroanatomy & Connectivity, Max Planck Institute for
Human Cognitive and Brain Sciences |
|
Luis C.T. Herrera, PhD, Institute of Physics, University of
Campinas |
Daniela Dentico, Waisman
Center, University of Wisconsin |
Vanessa Sochat, PhD, Program in
Biomedical Informatics, Stanford University |
Anibal Sólon Heinsfeld,
Faculdade de Informática,
PUCRS |
|
Fernando A. Barrios, PhD, Instituto
De Neurobiología, Universidad Nacional Autónoma de México |
Yves Burnod, PhD, Laboratoire d’Imagerie Biomédicale, Sorbonne Universités,
UPMC Université Paris 06, |
Christopher J. Cannistraci,
Translational and Molecular Imaging Institute, Icahn School of Medicine at
Mount Sinai |
Julien Cohen-Adad, PhD, Functional Neuroimaging Unit, Centre
de Recherche de l’Institut
Universitaire de Gériatrie
de Montréal |
|
Katharine Dunlop, MRI-Guided rTMS
Clinic, University Health Network |
Andrew Gerber, MD, PhD, New York State Psychiatric Institute |
Thomas J. Grabowski, MD, Department of Radiology, University
of Washington |
Sean Hill, PhD, International Neuroinformatics
Coordinating Facility |
|
Donald G. McLaren, PhD, The Neuro Bureau |
Maarten Mennes, PhD, Radboud University |
Salma Mesmoudi, PhD, Institut des Systèmes Complexes
de Paris-Île-de-France |
Erick H. Pasaye, Instituto
De Neurobiología, Universidad Nacional Autónoma de México |
|
Ziad S.
Saad, Scientific and Statistical Computing Core,
National Institute of Mental Health |
Yonggang
Shi, PhD, Laboratory of Neuro Imaging, Stevens Neuroimaging and Informatics
Institute, Keck School of Medicine of University of Southern California |
John D. Van Horn, USC Mark and Mary Stevens Neuroimaging and
Informatics Institute, University of Southern California |
Ting Xu, PhD, Center for the Developing Brain, Child Mind
Institute |
|
Kristina Visscher, PhD, University
of Alabama at Birmingham |
Eleftherios Garyfallidis, Département d’informatique, Université de Sherbrooke |
Samir Das, Montréal Neurological Institute, McGill University
and Institute of Pscychology |
Cécile Madjar, Douglas Mental Health
Institute |
|
Keith Heberlin, PhD, Emory
University |
David Kennedy, PhD, University of Massachusetts Medical School |
Eric Earl, Oregon Health & Science University |
Damion V. Demeter, Oregon Health & Science University |
|
Erik Kan, The Saban
Research Institute of Children’s Hospital |
Matteo Visconti di Oleggio Castello,
PhD, Department of Pscyhological & Brain
Sciences, Dartmouth College |
Anne-Lise Goddings,
Institute of Cognitive Neuroscience, University College London |
Javier Gonzalez-Castillo, PhD, Section on Functional Imaging
Methods, Laboratory of Brain and Cognition, National Institute of Mental
Health |
|
Hans J. Johnson, PhD, Carver College of Medicine, The
University of Iowa |
Sook-Lei Liew, PhD, The Neuro Bureau |
Reza Adalat,McGill Centre for
Integrative Neuroscience (MCIN), Ludmer Centre for Neuroinformatics and Mental Health, Montreal Neurological
Institute (MNI), McGill University |
Natacha Beck, McGill Centre for Integrative Neuroscience
(MCIN), Ludmer Centre for Neuroinformatics
and Mental Health, Montreal Neurological Institute (MNI), McGill University |
|
Aaron Heller, PhD, University of Wisconsin at Madison |
Vince Calhoun, PhD, The Mind Research Network |
Alan C. Evans, PhD, McGill Centre for Integrative Neuroscience
(MCIN), Ludmer Centre for Neuroinformatics
and Mental Health, Montreal Neurological Institute (MNI), McGill University |
Yaroslav O.
Halchenko, PhD, Department of Pscyhological
& Brain Sciences, Dartmouth College |
|
Augusto Buchweitz, PhD, PUCRS |
Alexandre Rosa Franco, PhD, The Neuro Bureau |
Julia Anglin, Chan Division of Occupational Science and
Occupational Therapy, USC |
Michael Borich, DPT, PhD, Division
of Physical Therapy, Department of Rehabilitation Medicine, Emory University
School of Medicine |
|
Anisha Keshavan, University of California San Francisco |
Matthew Brett, Berkeley Brain Imagin
Center |
David O'Connor, Center for the Developing Brain, Child Mind
Institute |
Rickson Mesquita, PhD, Institute of
Physics, University of Campinas |
|
Alex Schaefer, National University of Singapore |
Anqi Qiu, PhD, National University of Singapore |
Julio E. Villalon-Rei, Imaging
Genetics Center, Mark and Mary Stevens Neuroimagng
and Informatics Institute, Keck School of Medicine of University of Southern
California |
Sarael Alcauter, PhD, Instituto De Neurobiología, Universidad Nacional Autónoma
de México |
|
Yoko Yamaguchi, PhD, RIKEN |
Stephen Strother, PhD, Institute of
Medical Sciences, University of Toronto |
Benjamin De Leener, Institute of
Biomedical Engineering, Ecole Polytechnique
de Montréal |
Jonathan Downar, PhD, MRI-Guided rTMS Clinic, University Health Network |
|
Robert C Welsh, PhD, Department of Psychiatry, University of
Michigan, Ann Arbor |
Thomas Nichols, PhD, Warwick University |
R. Matthew Hutchinson, PhD, The Neuro Bureau |
Prantik Kundu, PhD, The Neuro Bureau |
|
Hao-Ting
Wang, University of York |
Jörg P.
Pfannmöller, Functional Imaging Unit, Center for
Diagnostic Radiology, Unviersity Medicine
Greifswald |
Ramon Fraga Pereira, Faculdade de Informática, PUCRS |
Pierre-Olivier Quirion, Functional
Neuroimaging Unit, Centre de Recherche de l’Institut Universitaire de Gériatrie de Montréal |
How to become a member?
If you would like to join the organization please contact a board member or email<EMAIL_ADDRESS>How do you host a brainhack?
Brainhack publications
Brainhack Proceedings
We publish short reports describing projects completed at Brainhack events that occured during the year in a Annual Brainhack Proceedings.
Brainhack Thematic Series
We invite full length publications that describe projects worked on as part of Brainhack or that are consistent with the Brainhack Proceedings to be published in the GigaScience Brainhack Thematic Series. ...
Brainhack Outcomes
Below is a brief list of some of the projects that have been created at Brainhack events. More detailed information can be found in the Brainhack Proceedings and in our recent publication on Brainhack.
|
Project |
Brainhack
Event |
|
A child psychiatrist and a 3D
video artist initiated a collaboration to develop a movie to be shown to
participants during resting-state fMRI scans to reduce head motion in
hyperkinetic populations |
2012 Brainhack
& Unconference (Leipzig) |
|
The ABIDE Preprocessing Initiative
is an ongoing project to share preprocessed versions of the Autism Brain
Imaging Data Exchange (ABIDE) dataset |
2012 Brainhack
& Unconference (Leipzig) |
|
An analysis to identify
differences in cortical thickness and structural covariance between individuals
with autism spectrum disorder and neurotypical
controls |
2012 Brainhack
& Unconference (Leipzig) |
|
A project team amassed a dataset
of 14,781 structural MRI scans to estimate the distribution of brain sizes
across individuals for optimizing scan acquisition parameters |
Brainhack
2013 Paris |
|
The development team of LORIS, an
open source database system for neuroimaging and phenotypic data, have
repeatedly used Brainhack as an opportunity to meet
and collaborate on new features |
|
|
An early version of the
Daydreaming app, an Android application for real-time assessment of users’
mind-wandering |
Brainhack
2013 Paris |
|
The Clubs of Science project has
built a web-based visualization of the social web underlying neuroimaging
research |
Brainhack
Montreal 2015 |
|
The linkRbrain
tool for integrating and querying neuroimaging data with activation peaks
from the literature and gene expression data was partially developed and
first tested |
Brainhack
2013 Paris |


This REST API reference is for those interested in developing automation workflows and other applications using Tintri VMstore. This document explains how developers can leverage REST APIs over HTTP.
Tintri requires that all requests are done over SSL. All requests to port 80 are converted to port 443 for VMstore.
All strings passed to and from the Tintri APIs need to be UTF-8 encoded.
Over time, the Tintri APIs will change. Future versions may add new managed entities or keys. To keep older clients working, the behavior and return values with given parameters will not change from the documented behavior except for undocumented request parameters or additional response keys.
With this in mind, clients should avoid passing undocumented parameters and accept keys that are not currently documented. API clients will have to be modified to obtain new Tintri features.
| API Version | TXOS Version | TGC Version |
|---|---|---|
| v310.1 | 3.1.0.x | --- |
| v310.11 | 3.1.1.x | --- |
| v310.21 | 3.2.1.x | <IP_ADDRESS> |
| v310.31 | 4.0.0.x | 2.1.0.x |
| v310.41 | 4.1.0.x | 2.1.0.x |
| v310.51 | 4.2.0.x | 3.0.0.x |
| v310.53 | 4.2.1.x | 3.0.1.x |
| v310.61 | 4.3.0.x | 3.5.0.x |
| v310.64 | 4.3.2.x | 3.5.0.x |
| v310.66 | 4.3.3.x | 3.5.1.x |
| v310.71 | 4.4.0 | 3.7.0 |
| v310.81 | 4.4.1 | 3.8.0 |
| v310.91 | 4.5.0 | 4.0.0 |
| v310.93 | 4.5.1 | 4.1.x |
| v310.101 | 4.6.0.x | 5.0.0 |
| v310.111 | 5.0.0.x | 5.0.1 |
| v310.121 | 5.1.0.x | 5.2.x |
| v310.131 | 5.2.0.x | 5.3.x |
| v310.141 | 5.3.0.x | 5.3.x |
| v310.151 | 5.4.0.x | 5.4.x |
Tintri uses the standard HTTP error code syntax. The error codes are listed below:
| HTTP Status Code | Tintri explanation |
|---|---|
| 200 | Successful API call with non empty result body. |
| 204 | Successful API call with empty result body. |
| 400 | Bad request - Request validation failed. Request content incorrect/invalid. |
| 401 | Non authorized API access - User needs to successfully login with needed privileges to perform the operation. |
| 403 | Forbidden - invalid credentials or licenses. Some APIs, like /v310/vm/sync require a license. |
| 404 | API not found. |
| 405 | Method not allowed. |
| 409 | Conflict - object already exists when creating object. |
| 500 | Internal Error - something went wrong in the server side processing. |
| 501 | Not Implemented - For example if supported by VMstore but not TGC. |
| 503 | Service unavailable - External service, like active directory, is unavailable. This is usually temporary and worth retrying later. |
When an API error occurs, TintriError is returned. An example is below:
New users can be created. Each user when created is assigned a role. Currently, the roles are:
| Role | Read | Write | User Management |
|---|---|---|---|
| Admin | Yes | Yes | Yes |
| System Admin | Yes | Yes | No |
| Read Only | Yes | No | No |
The Read Only role is only allowed to read resources from the Tintri Appliance. This means that all GET APIs are allowed.
The System Admin role is the Read Only role plus updating and creating resources except for user management. This means that all GET, PUT, POST DELETE APIs are allowed except the user management DELETE, POST and PUT APIs.
The Admin role is the System Admin role plus updating and creating user management. This means that all GET, POST, PUT, and DELETE APIs are allowed.
The admin user is a special user that cannot be deleted or modified.
Filtering parameters are based on RFC 6570.
| Format | ?parm1=value&param2=value2&param3=value3? |
|---|---|
| Example | ?type=SCHEDULE_SNAPSHOT&consistency=CRASH_CONSISTENT&vmId=5CFC98F0-731C-2474-FE84-0BC2C3A28543-VIM-0000000000000020 |
Many of the Tintri APIs with GET methods return large numbers of objects. For the convenience of the client, a paged response is provided. The paged response is in the form of a Page object which is composed as follows:
| Name | Description |
|---|---|
| absoluteTotal | The absolute number of objects within the managed entity. This number includes active and deleted objects with no filtering. |
| completedIn | Time in milliseconds indicating how long it took to serve the request. |
| filteredTotal | The number of objects returned as specified by the filter. If no filter was requested, then the value is the same as total. |
| items | The API specific items. For each API, items will contain different information. |
| lastUpdatedTime | The time when the page was last updated. |
| limit | The client requested limit for the number of items in a page. Default is 2000. |
| next | The URL query string to fetch the next page. |
| offset | The client requested index of an object in the table. Possible formats include numeric offset, UUID offset, and a substring name. |
| offsetMatchFound | Indicates if the requested object/(s) is/are found. |
| overflow | A flag giving notice the amount of data did not fit into the given specified or default offset. |
| page | The current page number |
| pageTotal | The total number of objects in the page. |
| prev | The URL query string to fetch the previous page. |
| total | The number of active objects in the managed entity. |
Session login uses the session resource. An HTTP POST with the user name, password, and role is sent. A session cookie is returned and this cookie is used in all subsequent API invocations.
https://ttvm38.tintri.com/api/v310/session/login
{"username":"admin", "typeId":"com.tintri.api.rest.vcommon.dto.rbac.RestApiCredentials", "password":"mypass"}
HTTP status 200. User role name
Session logout uses the session resource. An HTTP GET is used with the session cookie provided in the session login.
https://ttvm38.tintri.com/api/v310/session/logout
HTTP status 204
Request allows for multiple properties of multiple objects to be updated at one time. The example below shows the JSON for updating the acceptIncomingTraffic property in DatastoreReplicationPath.
https://ttvm38.tintri.com/api/v310/datastore/default/replicationInfo
{'typeId': 'com.tintri.api.rest.v310.dto.Request', 'objectsWithNewValues': [{'typeId': 'com.tintri.api.rest.v310.dto.domain.beans.repl.DatastoreReplicationPath' 'acceptIncomingTraffic': 'False' }], 'propertiesToBeUpdated': ['acceptIncomingTraffic'] }
HTTP status 204.
MultipleSelectionRequest allows for multiple properties on one object for multiple resources at one time. The example below shows the JSON for updating the minNormalizedIops and minNormalizedIopsproperties in VirtualMachineQoSConfig for the API update QOS config.
https://ttvm38.tintri.com/api/v310/vm/qosConfig
{'typeId': 'com.tintri.api.rest.v310.dto.MultipleSelectionRequest', 'ids': ['A1D88A8A-8904-1E35-9DC2-589C317D31A6-VIM-00000000000001A5', 'A1D88A8A-8904-1E35-9DC2-589C317D31A6-VIM-0000000000000070' ] 'newValue': {'minNormalizedIops': '100', 'maxNormalizedIops': '248', 'typeId': 'com.tintri.api.rest.v310.dto.domain.beans.vm.VirtualMachineQoSConfig' } 'propertyNames': ['minNormalizedIops', 'maxNormalizedIops'] }
HTTP status 204.
| GET | /v310/datastore/{uuid}/systemProperty | Returns a list of system properties and related information | VMstore Only |
| GET | /v310/datastore/{uuid}/systemProperty/{propertyName} | Returns information on the specified system property | VMstore Only |
| PUT | /v310/datastore/{uuid}/systemProperty | Updates a system property's custom value | VMstore Only |
| DELETE | /v310/datastore/{uuid}/systemProperty{propertyName} | Removes the specified system property's custom value | VMstore Only |
| POST | /v310/alert/notificationPolicy | Creates a new notification policy | All |
| PUT | /v310/alert/notificationPolicy/{uuid} | Update an existing notification policy | All |
| DELETE | /v310/alert/notificationPolicy/{uuid} | Delete an existing notification policy | All |
| GET | /v310/alert/notificationPolicy/{uuid} | Get the notification policy associated with an ID | All |
| GET | /v310/alert/notificationPolicy | Get all notification policies | All |
| DELETE | v310/datastore/{uuid}/deleteAllCloudReplication | Deletes all per VM configurations that point to a cloud replication Link. | All | |
| DELETE | /v310/datastore/{uuid}/deleteAllReplication | Deletes all per VM configurations that point to an asynchronous replication link. | All | |
| PUT | /v310/datastore/{uuid}/fileShare/{fsName}/resetFileAcls | Resets the permissions of all the files on the specified share | VMstoreOnly | |
| POST | /v310/datastore/{uuid}/pauseAsyncSyncReplication | Pause asynchronous and synchronous replication | All | |
| POST | /v310/datastore/{uuid}/pauseCloudReplication | Pause cloud replication | All | |
| GET | /v310/license/eval | Returns a list of all the evaluation licenses. | All | |
| POST | /v310/license/eval/{feature} | Activates an evaluation license for a feature. | All | |
| GET | /v310/servicegroup/{id}/quota/statsHistoric | Get all of the historic quota statistics slices for the service group. | All | |
| GET | /v310/servicegroup/{id}/quotaPolicy | Returns the quota policy associated with the given service group. | All | |
| POST | /v310/servicegroup/{id}/quotaPolicy | Create a quota policy for the given service group. | All | |
| PUT | /v310/servicegroup/{id}/quotaPolicy | Update the quota policy for the given service group. | All | |
| DELETE | /v310/servicegroup/{id}/quotaPolicy | Delete the quota policy associated with the given service group. | All | |
| POST | /v310/servicegroup/{uuid}/statsDownloadable | Returns a URL for retrieving the service group historical performance statistics report. | TgcOnly | |
| POST | /v310/session/{tintriSessionId}/invalidate | Invalidate a session by a user belonging to "Admin" role. | All | |
| POST | /v310/snapshot/restore | Restore a snapshot from cloud as specified by the snapshot restore specification. | All |
| GET | /v310/appliance/{uuid}/stagingAreaInfo | Gets the Tintri appliance staging area information, which includes details about the space, software uploaded | TgcOnly |
| GET | /v310/appliance/{uuid}/stagingAreaInfo/availableSoftwares | Gets the Tintri appliance staging area available software information, which includes details of the software uploaded | TgcOnly |
| POST | /v310/appliance/{uuid}/stagingAreaInfo/availableSoftwares/cancelupgrade | Cancel the VMstore software upgrade. | TgcOnly |
| DELETE | /v310/appliance/{uuid}/stagingAreaInfo/availableSoftwares/{softwareuuid} | Delete the specified TxOS software from the staging area. | TgcOnly |
| POST | /v310/appliance/{uuid}/stagingAreaInfo/availableSoftwares/{softwareuuid}/startupgrade | Upgrades the TXOS software to the specified VMstores. | TgcOnly |
| GET | /v310/appliance/{uuid}/fileDirInfo/{path} | Fetch the file system information associated with the entity specified by path. | VMstoreOnly |
| PUT | /v310/vm/relocate | Relocate a group virtual machines to another datastore. | TgcOnly |
| PUT | /v310/vm/testRelocateVms | Validate the relocate VMs request for whether the provided VMs can be migrated to the specified destination datastore. | TgcOnly |
| POST | /v310/appliance/{uuid}/rebootSecondary | Reboot the secondary controller. | VMstoreOnly |
| GET | /v310/datastore/{uuid}/tag | Returns hypervisor tags in paginated form as specified by filter parameters in request. | All |
| GET | /v310/datastore/{uuid}/tag/{tagId} | Returns hypervisor tag information for given {tagId}. | All |
| POST | /v310/appliance/{uuid}/rpcReport | Generates a report of external RPC connections to filesystem in /var/log/tintri/rpc-connections-external.txt | VMstoreOnly |
| GET | /v310/alert/notificationPolicy/allowedUserAlertIds | Returns a sorted list of user alert IDs that are allowed for Alert Notification Policy. The sort order is ascending. | All |
| POST | /v310/appliance/{uuid}/expand/async | Expands the storage capacity of the Tintri appliance in asynchronous way. Progress can be monitored using /v310/task/{task-id} api. | VMstoreOnly |
| POST | /v310/appliance/{uuid}/restartDb | Restarts the application database. | VMstoreOnly |
| GET | /v310/appliance/authProvider | Returns the current Identity Providers configurations. Used to create the authorize request to the Id provider as part of the Authorization Code Grant workflow | TgcOnly |
| POST | /v310/appliance/authProvider | Create the Authentication Provider which contains the OAuth 2 configurations used to SSO authenticate the user. | TgcOnly |
| PUT | /v310/appliance/authProvider | Update the Auth Provider. All provided fields will be used to update the object. | TgcOnly |
| DELETE | /v310/appliance/authProvider | Delete the auth provider | TgcOnly |
The API resources are presented below. The Data Overview button presents the Data Transfer Objects (DTOs) that are transferred between the Tintri server and the client. The API Overview and API Index buttons present different views of the API endpoints. To use the endpoints in a browser or a tool like Postman, the Tintri server and /api need to prefix the endpoints presented below; for example: http://vmstore.tintri.com/api/v310/vm


Onitu
My files
Login
My files
Documents
Music
Pictures
Videos
Other
more
Archives
Code
Text files
Spreadsheets
Presentations
PDF
My drivers
{{driver.name}}
add driver
Onitu
{{directory}}


The 21st uniform polyhedron is the Cubitruncated cuboctahedron; it has Wythoff symbol 4/3 3 4|. Its dual is the tetradyakishexahedron. The pattern of polygons round each vertex is (8/3,6,8); its symmetry group is the octahedral group S4.
It has:
Euler characteristic: -4
Density: 4
Number of vertices: 48
Number of edges: 72
Number of faces: 20 (=6 octagons and 8 hexagons and 68/3).
Note: a polygon a/b means a shape made by taking a points and joining every bth of them; for instance 5/2 means a five-pointed star made by taking five points and joining every second point.


{% extends "base.html" %} {% block head %}
Reminder: Use the web to answer these two questions: Which package has a better community for clients of the package? Which package has better documentation? The two packages you are comparing are {{ package1 }} and {{ package2 }}. Start with {{ package1 }}, and the researcher will let you know when to move on to {{ package2 }}.
If you feel you have found all the information you want to find for a package, let the researcher know and you can move on.