# TVM Runtime System
TVM supports multiple programming languages for the compiler stack development and deployment. In this note, we explain the key elements of the TVM runtime.
![](http://www.tvm.ai/images/release/tvm_flexible.png)
We need to satisfy quite a few interesting requirements
Deployment: invoke the compiled function from python/javascript/c++ language.
Debug: define a function in python and call that from a compiled function.
Link: write driver code to call device specific code (CUDA) and call it from compiled host function.
Prototype: define an IR pass from python and call that from C++ backend.
Expose: compiler stack developed in c++ to front-end (i.e, python)
Experiment: ship a compiled function to an embedded device to directly run there.
We want to be able to define a function from any language and call from another. We also want the runtime core to be minimal to deploy to embedded devices.
## PackedFunc
[PackedFunc](https://github.com/dmlc/tvm/blob/master/include/tvm/runtime/packed_func.h) is a simple but elegant solution we find to solve the challenges listed. The following code block provides an example in C++
```c++ #include <tvm/runtime/packed_func.h>
- void MyAdd(TVMArgs args, TVMRetValue* rv) {
// automatically convert arguments to desired type. int a = args[0]; int b = args[1]; // automatically assign value return to rv *rv = a + b;
}
- void CallPacked() {
PackedFunc myadd = PackedFunc(MyAdd); // get back 3 int c = myadd(1, 2);
}¶
In the above codeblock, we defined a PackedFunc MyAdd. It takes two arguments
: `args`
represents input arguments and `rv`
represents return value.
The function is type-erased, which means that the function signature does not restrict which input type to pass in or type to return.
Under the hood, when we call a PackedFunc, it packs the input arguments to TVMArgs on stack,
and gets the result back via TVMRetValue.
Thanks to template tricks in C++, we can call a PackedFunc just like a normal function. Because of its type-erased nature, we can call a PackedFunc from dynamic languages like python, without additional glue code for each new type function created. The following example registers PackedFunc in C++ and calls from python.
`c++
// register a global packed function in c++
TVM_REGISTER_GLOBAL("myadd")
.set_body(MyAdd);
`
```python
import tvm
myadd = tvm.get_global_func(“myadd”) # prints 3 print(myadd(1, 2)) ```
Most of the magic of PackedFunc lies in `TVMArgs`
and `TVMRetValue`
structure.
We restrict a list of possible types which can be passed, here are the common ones
int, float and string
PackedFunc itself
Module for compiled modules
DLTensor* for tensor object exchange
TVM Node to represent any object in IR
The restriction makes the implementation simple without the need of serialization. Despite being minimum, the PackedFunc is sufficient for the use-case of deep learning deployment as most functions only take DLTensor or numbers.
Since one PackedFunc can take another PackedFunc as an argument, we can pass functions from python(as PackedFunc) to C++. ```c++ TVM_REGISTER_GLOBAL(“callhello”) .set_body([](TVMArgs args, TVMRetValue* rv) {
PackedFunc f = args[0]; f(“hello world”);
});¶
- def callback(msg):
print(msg)
# convert to PackedFunc f = tvm.convert(callback) callhello = tvm.get_global_func(“callhello”) # prints hello world callhello(f) ```
TVM provides a [minimum C API](https://github.com/dmlc/tvm/blob/master/include/tvm/runtime/c_runtime_api.h), which allows us to embed the PackedFunc into any languages. Besides python, so far we supported [java](https://github.com/dmlc/tvm/tree/master/jvm) and [javascript](https://github.com/dmlc/tvm/tree/master/web). This philosophy of embedded API is very like Lua, except that we don’t have a new language but use C++.
One fun fact about PackedFunc is that we use it for both compiler and deployment stack. - All TVM’s compiler pass functions are exposed to frontend as PackedFunc, see [here](https://github.com/dmlc/tvm/tree/master/src/api) - The compiled module also returns the compiled function as PackedFunc
To keep the runtime minimum, we isolated the IR Node support from the deployment runtime. The resulting runtime takes around 200K - 600K depending on how many runtime driver modules (e.g., CUDA) get included.
The overhead of calling into PackedFunc vs. a normal function is small, as it is only saving a few values on the stack. So it is OK as long as we don’t wrap small functions. In summary, the PackedFunc is the universal glue in TVM where we use it extensively to support our compiler and deployment.
## Module
Since TVM supports multiple types of devices, we need to support different type of drivers. We have to use the driver API to load the kernel, set up the argument in packed format and perform kernel launch. We also need to patch up the driver API so that the exposed functions are threadsafe. So we often need to implement these driver glues in C++ and expose them to the user. We can certainly not do it for each type of functions, so again PackedFunc is our answer.
TVM defines the compiled object as [Module](https://github.com/dmlc/tvm/blob/master/include/tvm/runtime/module.h). The user can get the compiled function from Module as PackedFunc. The generated compiled code can dynamically get function from Module in runtime. It caches the function handle in the first call and reuses in subsequent calls. We use this to link device code and callback into any PackedFunc(e.g., python) from generated code.
The ModuleNode is an abstract class that can be implemented by each type of device. So far we support modules for CUDA, Metal, OpenCL and loading dynamic shared libraries. This abstraction makes introduction of new device easy, and we do not need to redo the host code generation for each type of device.
## Remote Deployment
The PackedFunc and Module system also makes it easy to ship the function into remote devices directly. Under the hood, we have an RPCModule that serializes the arguments to do the data movement and launches the computation on the remote.
![](http://www.tvm.ai/images/release/tvm_rpc.png)
The RPC server itself is minimum and can be bundled into the runtime. We can start a minimum TVM RPC server on iPhone/android/raspberry pi or even the browser. The cross compilation on server and shipping of the module for testing can be done in the same script. Checkout [Cross compilation and RPC tutorial](http://docs.tvm.ai/tutorials/deployment/cross_compilation_and_rpc.html#sphx-glr-tutorials-deployment-cross-compilation-and-rpc-py) for more details.
This instant feedback gives us a lot of advantages. For example, to test the correctness of generated code on iPhone, we no longer have to write test-cases in swift/objective-c from scratch – We can use RPC to execute on iPhone, copy the result back and do verification on the host via numpy. We can also do the profiling using the same script.
## TVM Node and Compiler Stack
As we mentioned earlier, we build compiler stack API on top of the PackedFunc runtime system. We faced a constant changing of the compiler API for the need of research. We need a new language object or IR node whenever we want to test out new primitives. However, we don’t want to change our API from time to time. Besides that, we also want to
be able to serialize any language object and IRs
be able to explore, print, and manipulate the IR objects in front-end language to do quick prototyping.
We introduced a base class, called [Node](https://github.com/dmlc/HalideIR/blob/master/src/tvm/node.h#L52) to solve this problem. All the language object in the compiler stack is a subclass of Node. Each node contains a string type_key that uniquely identifies the type of object. We choose string instead of int as type key so new Node class can be added in the decentralized fashion without adding the code back to the central repo. To ease the speed of dispatching, we allocate an integer type_index at runtime for each type_key.
Since usually one Node object could be referenced in multiple places in the language, we use a shared_ptr to keep track of reference. We use NodeRef class to represent a reference to the Node. We can roughly view NodeRef class as shared_ptr to the Node container. We can also define subclass NodeRef to hold each subtypes of Node. Each Node class needs to define the VisitAttr function.
- public:
virtual void Visit(const char* key, double* value) = 0; virtual void Visit(const char* key, int64_t* value) = 0; virtual void Visit(const char* key, uint64_t* value) = 0; virtual void Visit(const char* key, int* value) = 0; virtual void Visit(const char* key, bool* value) = 0; virtual void Visit(const char* key, std::string* value) = 0; virtual void Visit(const char* key, void** value) = 0; virtual void Visit(const char* key, Type* value) = 0; virtual void Visit(const char* key, NodeRef* value) = 0; // …
};
- class Node {
- public:
virtual void VisitAttrs(AttrVisitor* visitor) {} // …
};¶
Each Node subclass will override this to visit its members. Here is an example implementation of TensorNode. ```c++ class TensorNode : public Node {
- public:
/! brief The shape of the tensor */ Array<Expr> shape; /! brief data type in the content of the tensor / Type dtype; /! brief the source operation, can be None / Operation op; /! brief the output index from source operation / int value_index{0}; /! brief constructor */ TensorNode() {}
- void VisitAttrs(AttrVisitor* v) final {
v->Visit(“shape”, &shape); v->Visit(“dtype”, &dtype); v->Visit(“op”, &op); v->Visit(“value_index”, &value_index);
}
};¶
In the above examples, both `Operation`
and `Array<Expr>`
are NodeRef.
The VisitAttrs gives us a reflection API to visit each member of the object.
We can use this function to visit the node and serialize any language object recursively.
It also allows us to get members of an object easily in front-end language.
For example, in the following code, we accessed the op field of the TensorNode.
x = tvm.placeholder((3,4), name=”x”) # access the op field of TensorNode print(x.op.name) ```
New Node can be added to C++ without changing the front-end runtime, making it easy to make extensions to the compiler stack. Note that this is not the fastest way to expose members to front-end language, but might be one of the simplest approaches possible. We also find that it fits our purposes as we mainly use python for testing and prototyping and still use c++ to do the heavy lifting job.
## Implementation Details
Each argument in PackedFunc contains a union value [TVMValue](https://github.com/dmlc/tvm/blob/master/include/tvm/runtime/c_runtime_api.h#L122) and a type code. This design allows the dynamically typed language to convert to the corresponding type directly, and statically typed language to do runtime type checking during conversion.
The relevant files are - [packed_func.h](https://github.com/dmlc/tvm/blob/master/include/tvm/runtime/packed_func.h) for C++ API - [c_runtime_api.cc](https://github.com/dmlc/tvm/blob/master/src/runtime/c_runtime_api.cc#L262) for C API and how to provide callback.
To support extension types, we used a registry system to register type related information, like support of any in C++, see [Extension types](https://github.com/dmlc/tvm/tree/master/apps/extension) for more details.


Next: Printing Pathnames, Previous: Examples of Printing Arrays, Up: Default Print-Object Methods
A specific syntax for printing objects of type random-state is not specified. However, every implementation must arrange to print a random state object in such a way that, within the same implementation, read can construct from the printed representation a copy of the random state object as if the copy had been made by make-random-state.
If the type random state is effectively implemented by using the machinery for defstruct, the usual structure syntax can then be used for printing random state objects; one might look something like
#S(RANDOM-STATE :DATA #(14 49 98436589<PHONE_NUMBER>658324 ... ))
where the components are implementation-dependent.


Class reference
Usage
Control the text color of an element using the .text-{color}
utilities.
<input class="text-purple-600 ...">
Changing opacity v1.4.0+
Control the opacity of an element's text color using the .text-opacity-{amount}
utilities.
The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.

The quick brown fox ...

The quick brown fox ...

The quick brown fox ...

The quick brown fox ...

The quick brown fox ...

Learn more in the text opacity documentation.
Responsive
To control the text color of an element at a specific breakpoint, add a {screen}:
prefix to any existing text color utility. For example, use md:text-green-600
to apply the text-green-600
utility at only medium screen sizes and above.
For more information about Tailwind's responsive design features, check out the Responsive Design documentation.
Hover
To control the text color of an element on hover, add the hover:
prefix to any existing text color utility. For example, use hover:text-blue-600
to apply the text-blue-600
utility on hover.
<button class="text-blue-600 hover:text-red-600 ...">
Button
</button>
Hover utilities can also be combined with responsive utilities by adding the responsive {screen}:
prefix before the hover:
prefix.
<button class="... md:text-blue-500 md:hover:text-blue-600 ...">Button</button>
Focus
To control the text color of an element on focus, add the focus:
prefix to any existing text color utility. For example, use focus:text-blue-600
to apply the text-blue-600
utility on focus.
<input class="text-gray-900 focus:text-red-600 ...">
Focus utilities can also be combined with responsive utilities by adding the responsive {screen}:
prefix before the focus:
prefix.
<input class="... md:text-gray-900 md:focus:text-red-600 ...">
Customizing
Text Colors
By default Tailwind makes the entire default color palette available as text colors.
You can customize your color palette by editing theme.colors
in your tailwind.config.js
file, or customize just your text colors in the theme.textColor
section.
Responsive and pseudo-class variants
By default, only responsive, hover and focus variants are generated for text color utilities.
You can control which variants are generated for the text color utilities by modifying the textColor
property in the variants
section of your tailwind.config.js
file.
For example, this config will also generate active and group-hover variants:
Disabling
If you don't plan to use the text color utilities in your project, you can disable them entirely by setting the textColor
property to false
in the corePlugins
section of your config file:


Middle (or Grand) Caicos, the largest island in the whole group, boasts three small settlements with a total of about 270 inhabitants and three small guest houses. Caves cut out of the limestone by the original Lucayan Indians are well worth investigating.
This Island has a dramatic coastline and is home to many birds, including frigate birds, flamingos, egrets and sandpipers.
There are no facilities here and the navigation is hazardous.


A Service is an arbitrarily define entity that can be associated with resource. Services sit below resources in the structure hierarchy.
See the Help on the Services screen for more details.
Cancel: Abort changes and return to the previous screen.
Save: Save changes and return to the previous screen.
Help: Opens this help screen.
Resource: The resource this service will apply to.
Name: Name of the service, this will appear in the drop down list on the Appointment Booking screen.
Description: For internal use only.
Order: This determines the order this service will appear in the service drop down list on the Appointment Booking screen.
Published: Only services with Published set to Yes will appear in the drop down list on the Appointment Booking screen.


London
10/07/2018
Prompt: Games
Winners
1st Place
Click to try it out!
The Ouija team was comprised of George Drury, Bella Schilling, and Mirco Monsees. The project was heavily inspired by Ouija Boards of course. The undeniable reference to the famous game as well as it's versatility is what made it stand out just enough to gain the top spot over the very strong competition. We hope they push this one further!
2nd Place
Display
Click to try it out!
The Clessidra Display team was comprised of Nil Thyrion, Tom Holloway, and Laura Bertinelli. The project was also inspired a bit by Ouija Boards and wood type. This endearing submission full of quirkiness clearly has a set of rules, but clearly breaks them. Yet, it works!
3rd Place
Display
Click to try it out!
The Restart Display team was comprised of Elena Peralta, Veronica McQuade, and Katıya Kimenets. The project was inspired by neon signs and console company titles like Sega. Restart Display is so cool and works so well for titles and posters. The fact that using a 'space' character adds some filler lines is super fun!


Your Daily Case Information
Today Case:
Total Case:
Today Deaths:
Total Deaths:
Active Case:
Total Recovered:
Critical Case:
Tests:


| DOSE: |
repeated |
insufflated |
AET |
(powder / crystals) |
| |
repeated |
oral |
AET |
(powder / crystals) |
| |
8.0 g |
oral |
Kratom |
|
| |
30 mg |
rectal |
Morphine |
|
Over the past week, I've had the chance to try out AET at 3 different dosage levels. Considering the rarity of the substance, I've decided that, even though I encountered nothing mindblowing, I should most definitely write up a summary of those experiences.
FIRST TRIAL
On the first trial, I took 100mg orally at about 10:00pm. I would have done it earlier but I checked my mail, totally not expecting to see it yet, but it had in fact arrived. I was going to start with 80mg but in reading the TIHKAL entries, it seemed that 80 would have been very weak indeed, so I started with 100. The taste, texture, and shape of the granules reminds me greatly of AMT, as does the smell. It's a less powerful whiff of the same shit-like stench that pervades the air when opening AMT up. I held it in my mouth with some spit and swished it around, attempting to force sublingual absorbtion. That skatole taste filled my mouth, weaker than with AMT but still offensive.
After about 5 minutes, my mucous mebranes started to burn, and although I had originally intended on holding it in my mouth for 15-20 minutes, at 10 minutes it burned too much and I swallowed. I rinsed my mouth out with cold distilled water for a while and ate a few bites of ice cream, and within minutes the burning faded to a memory.
The comeup was inconsequential. I began to feel a warm but subtle energy at about T+30 minutes, and by T+45 to 1 hour I was feeling nice and happy. I didn't feel much like moving, but I had a very pleasant but light body high. Mentally, I was unaffected other than a mood boost. There was less psychedelic buzz than with AMT, but overall the body highs felt quite similar. At about T+2 hours I ingested 8 grams of kratom and took a few vaporizer hits of extreme quality cannabis which boosted the body high. After about 4-5 hours the high had faded to a baseline buzz. I tried to sleep, but unfortunately I retained quite a bit of stimulation and slept very lightly with many interruptions throughout the next 6 hours. I got up and went on the computer for a short time twice. It was pretty frustrating, but the next day, I felt pretty good anyway.
SECOND TRIAL
A couple of days later, I decided to try again, this time with 120mg total, but with 60 oral and 60 insufflated. Yes, that may sound a bit nuts, but I've actually found that I enjoy boosting AMT by insufflating smaller amounts, and AET has begun to seem very similar. With most psychedelics I find the nasal route to be counterproducxtive, but with the alpha-x-tryptamines, or the two I've tried so far anyway, it seems to just increase the power and speed of onset. But be warned - insufflating AMT and/or AET is not pleasant! Observe:
T+0:00 - Snorted up a 30mg line in one nostril and then immediately another in the other nostril. No immediate pain...
T+0:03 seconds - Pain begins. It feels like a caustic chemical is burning the delicate mucous membranes in my nose. Slowly, the smell of indole byproducts fills my nasal cavity. By now AMT's burn would have been in full force.
T+0:10 - Pain is at full.
T+5:00 - The pain is still the same intensity. It comes and goes in waves. My nose is running a lot so I must repeatedly sniff the snot back into my nose, which renews the pain every time. The AMT sting is all but gone right now, it appears that AET's sting lasts for longer, although the pain is less intense.
T+10:00 - The pain has faded somewhat but it's really starting to bother me now.
T+15:00 - The pain is all gone now leaving just a tenderness inside my nostrils. By now, the effects have begun.
As you can see, it took about 15 minutes to start coming up well this time. Almost immediately, I noticed the intensity shoot to about double my first trial. The insufflation definitely worked well despite the pain.
At about T+0:45 I feel the comeup from the oral portion of my dosage. This acts to increase the intensity as well as smooth the edges out. The high was very non-edgy, but a faint restless energy crept in from the speed of the insufflation. The comeup stage reminds me of MDMA a little bit, occasionally slightly uncomfortable but nothing at all major, and AET is milder than MDMA in that respect.
At this point I laid down and evaluated the effects. Of course they were much like the first trial, but much stronger in the body and this time they carried a hint of a mental trip. My mind did not feel particularly sped up or lucid, but it definitely was affected. Interestingly, unlike with AMT where I feel very mentally adept and quick, AET almost made my mind a little lethargic, although it was nothing unpleasant. I felt perfectly capable socially, but a little lagging in the quick-thinking department.
The body high was so good that it was drawing me in. It reminded me a bit of MDMA but gentler and less pushy, and more natural. My overall impression of the high was that it was really not much like MDMA except for a few surface similarities. But the comparisons are hard not to make.
At about T+1:30, the effects seemed to peak, although it was a gentle and rather indistinct peak.  It was hard for me to stay focused on one thing visually for very long. Although I did not get any actual visuals (nor do I with AMT), everything around me seemed to sparkle and I noticed patterns in the subtle shading of objects. This effect was more sparkly than with AMT, but less psychedelic. Nevertheless, it was rather neat. There was also noticeable palm and foot sweating which grossed my girlfriend out. Oops!
As time went on, I didn't notice any lessening of effects for quite a while. Eventually I began to drift off into a reverie state not unlike sleep but different from it at the same time. In this state my body was buzzing very strongly and pleasurably, and my mind was traveling some free-association path of strange logic. When I'd re-enter the real world, I'd say something nonsensical as I do when I first waking up after nodding off. This was much to the amusement of myself and my girlfriend.
After about 6 hours, decidedly longer than with the first trial, I realized the effects had faded quite a bit. I took 30mg of morphine rectally and this boosted me back into the land of huge body buzzes, but with a much more opiated focus. I enjoyed it greatly for a couple of more hours, and then went to bed. I was able to sleep better than after my first trial, which is perhaps not so odd considering I used morphine during the second trial.
THIRD AND MOST RECENT TRIAL
Just two days after the past trial I decided to up the dosage a little bit more and see if I could discover anything else that AET had to offer. Most psychedelics I find I can use without feeling any compulsion, with the exception of empathogens, which I tend to use often while I have them. AET and AMT I find are the closest to full psychedelic chemicals that I have troubles keeping away from sometimes.
So, that being said, I decided this night to ingest the same dosage as last time, and then throw in a 50mg nasal booster at about T+1:00. The experience progressed just as previously, and then at T+1:00, shortly before the peak would start, I insufflated another 50mg. This time it burned even more fiercely, and for a few minutes I regretted taking more. However, by the time the burn faded, I was the highest I'd been thus far in my AET trials. Let me explain...
The effects from AET are not quite what I'd call a trip. It's more like a cross between a light mental high which is rather difficult to describe and an empathogen. At this dosage level, I found it quite difficult to stay focused on a single thing, and the eye wiggles were quite strong at times. I would not want to have to do anything in this state. It's also quite physically pleasurable, and at times ridiculously so. As the peak really sets in, at least in my pretty much sedentary setting, I found the urge to drift off into trance-land to be quite strong, and thus I spent a good two hours drifting in and out of consciousness, always with some link to reality. But that link grew thin sometimes.
After a few hours of this, it began to slowly trail off, and by T+6 or 7, there was just a little residual body high/stimulation, which I found it pretty easy to sleep on. I woke up the next day, as I did in the other two trials, feeling fine. In fact, I felt pretty great.
SUMMARY
I'm truly glad to have discovered a sample of AET. So far I've found that it would probably have very little value in reaching anyplace profound, but then again MDMA and its like have become useless to me over the years - perhaps had I tried AET 4 years or so ago, I would have had a very psychedelic and profound journey. I guess I'll never know.
What I do know for sure is that AET feels much more benign than MDMA, and was an all-around great time. I really enjoyed the relaxed stimulation and the nodding off - it reminded me of opiate nodding (even when I didn't combine it with opiates), but more sparkly and psychedelic. The trance-like states I achieved were really the only part of the experiences I would consider psychedelic. The rest was just a strong high/sedation which was still extremely pleasurable. I also really like the lack of aftereffects.
My initial three trials have made me happy to have discovered this rare gem, indeed. I still prefer AMT overall in this class of tryptamines, but AET definitely gives it a run for its money in some areas.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Enhance your GitHub experience with Bluemix DevOps Services
Deploy your application to Bluemix cloud platform
Engage with IBM Open Source developerWorks Open


Domain constraints
[Using finite integer sets]
Collaboration diagram for Domain constraints:
Functions | |
| void | Gecode::dom (Space *home, SetVar x, SetRelType r, int i) |
| Propagates . | |
| void | Gecode::dom (Space *home, SetVar x, SetRelType r, int i, int j) |
| Propagates . | |
| void | Gecode::dom (Space *home, SetVar x, SetRelType r, const IntSet &s) |
| Propagates . | |
| void | Gecode::dom (Space *home, SetVar x, SetRelType r, int i, BoolVar b) |
| Post propagator for . | |
| void | Gecode::dom (Space *home, SetVar x, SetRelType r, int i, int j, BoolVar b) |
| Post propagator for . | |
| void | Gecode::dom (Space *home, SetVar x, SetRelType r, const IntSet &s, BoolVar b) |
| Post propagator for . | |
| void | Gecode::cardinality (Space *home, SetVar x, unsigned int i, unsigned int j) |
| Propagates . |
Function Documentation
|
|
Propagates .
|
|
|
Propagates .
|
|
|
Propagates .
|
|
|
Post propagator for .
|
|
|
Post propagator for .
|
|
|
Post propagator for .
|
|
|
Propagates .
Definition at line 34 of file cardinality.cc. |


---
layout: post
title: Film Storyboards on Pinterest
date: '2018-05-14T11:22:35+02:00'
categories:
- Shoutout
picture_url: https://film-Storyboards.tumblr.com/post/173896848801/film-Storyboards-pinterest
---
Film Storyboards (@FilmStoryboards) on Pinterest
@FilmStoryboards on Pinterest


All too often in software projects, developers work on features for months or years, spanning multiple releases, without ever confirming whether the desired business outcomes are being met, such as whether a particular feature is achieving the desired results or even being used at all.
Worse, even when we discover that a given feature isn’t achieving the desired results, making corrections to the feature may be out-prioritized by other new features, ensuring that the under-performing feature will never achieve its intended business goal. In general, Jez Humble observes, “the most inefficient way to test a business model or product idea is to build the complete product to see whether the predicted demand actually exists.”
Before we build a feature, we should rigorously ask ourselves, “Should we build it, and why?” We should then perform the cheapest and fastest experiments possible to validate through user research whether the intended feature will actually achieve the desired outcomes. We can use techniques such as hypothesis-driven development, customer acquisition funnels, and A/B testing, concepts we explore throughout this chapter. Intuit, Inc. provides a dramatic example of how organizations use these techniques to create products that customers love, to promote organizational learning, and to win in the marketplace.
Intuit is focused on creating business and financial management solutions to simplify life for small businesses, consumers, and accounting professionals. In 2012, they had $4.5 billion in revenue and 8,500 employees, with flagship products that include QuickBooks, TurboTax, Mint, and, until recently, Quicken.†
Scott Cook, the founder of Intuit, has long advocated building a culture of innovation, encouraging teams to take an experimental approach to product development and exhorting leadership to support them. As he said, “Instead of focusing on the boss’s vote…the emphasis is on getting real people to really behave in real experiments, and basing your decisions on that.” This is the epitome of a scientific approach to product development.
Cook explained that what is needed is “a system where every employee can do rapid, high-velocity experiments….Dan Maurer runs our consumer division....[which] runs the TurboTax website. When he took over, we did about seven experiments a year.”
He continued, “By installing a rampant innovation culture [in 2010], they now do 165 experiments in the three months of the [US] tax season. Business result? [The] conversion rate of the website is up 50 percent…. The folks [team members] just love it, because now their ideas can make it to market.”
Aside from the effect on the website conversion rate, one of the most surprising elements of this story is that TurboTax performed production experiments during their peak traffic seasons. For decades, especially in retailing, the risk of revenue-impacting outages during the holiday season were so high that we would often put into place a change freeze from mid-October to mid-January.
However, by making software deployments and releases fast and safe, the TurboTax team made online user experimentation and any required production changes a low-risk activity that could be performed during the highest traffic and revenue generating periods.
This highlights the notion that the period when experimentation has the highest value is during peak traffic seasons. Had the TurboTax team waited until April 16th, the day after the US tax filing deadline, to implement these changes, the company could have lost many of its prospective customers, and even some of its existing customers, to the competition.
The faster we can experiment, iterate, and integrate feedback into our product or service, the faster we can learn and out-experiment the competition. And how quickly we can integrate our feedback depends on our ability to deploy and release software.
The Intuit example shows that the Intuit TurboTax team was able to make this situation work for them and won in the marketplace as a result.
As the Intuit TurboTax story highlights, an extremely powerful user research technique is defining the customer acquisition funnel and performing A/B testing. A/B testing techniques were pioneered in direct response marketing, which is one of the two major categories of marketing strategies. The other is called mass marketing or brand marketing and often relies on placing as many ad impressions in front of people as possible to influence buying decisions.
In previous eras, before email and social media, direct response marketing meant sending thousands of postcards or flyers via postal mail, and asking prospects to accept an offer by calling a telephone number, returning a postcard, or placing an order.
In these campaigns, experiments were performed to determine which offer had the highest conversion rates. They experimented with modifying and adapting the offer, re-wording the offer, varying the copywriting styles, design and typography, packaging, and so forth, to determine which was most effective in generating the desired action (e.g., calling a phone number, ordering a product).
Each experiment often required doing another design and print run, mailing out thousands of offers, and waiting weeks for responses to come back. Each experiment typically cost tens of thousands of dollars per trial and required weeks or months to complete. However, despite the expense, iterative testing easily paid off if it significantly increased conversion rates (e.g., the percentage of respondents ordering a product going from 3%–12%).
Well-documented cases of A/B testing include campaign fundraising, Internet marketing, and the Lean Startup methodology. Interestingly, it has also been used by the British government to determine which letters were most effective in collecting overdue tax revenue from delinquent citizens.‡
The most commonly used A/B technique in modern UX practice involves a website where visitors are randomly selected to be shown one of two versions of a page, either a control (the “A”) or a treatment (the “B”). Based on statistical analysis of the subsequent behavior of these two cohorts of users, we demonstrate whether there is a significant difference in the outcomes of the two, establishing a causal link between the treatment (e.g., a change in a feature, design element, background color) and the outcome (e.g., conversion rate, average order size).
For example, we may conduct an experiment to see whether modifying the text or color on a “buy” button increases revenue or whether slowing down the response time of a website (by introducing an artificial delay as the treatment) reduces revenue. This type of A/B testing allows us to establish a dollar value on performance improvements.
Sometimes, A/B tests are also known as online controlled experiments and split tests. It’s also possible to run experiments with more than one variable. This allows us to see how the variables interact, a technique known as multivariate testing.
The outcomes of A/B tests are often startling. Ronny Kohavi, Distinguished Engineer and General Manager of the Analysis and Experimentation group at Microsoft, observed that after “evaluating well-designed and executed experiments that were designed to improve a key metric, only about one-third were successful at improving the key metric!” In other words, two-thirds of features either have a negligible impact or actually make things worse. Kohavi goes on to note that all these features were originally thought to be reasonable, good ideas, further elevating the need for user testing over intuition and expert opinions.
The implications of the Kohavi data are staggering. If we are not performing user research, the odds are that two-thirds of the features we are building deliver zero or negative value to our organization, even as they make our codebase ever more complex, thus increasing our maintenance costs over time and making our software more difficult to change. Furthermore, the effort to build these features is often made at the expense of delivering features that would deliver value (i.e., opportunity cost). Jez Humble joked, “Taken to an extreme, the organization and customers would have been better off giving the entire team a vacation, instead of building one of these non–value-adding features.”
Our countermeasure is to integrate A/B testing into the way we design, implement, test, and deploy our features. Performing meaningful user research and experiments ensures that our efforts help achieve our customer and organizational goals, and help us win in the marketplace.
Fast and iterative A/B testing is made possible by being able to quickly and easily do production deployments on demand, using feature toggles and potentially delivering multiple versions of our code simultaneously to customer segments. Doing this requires useful production telemetry at all levels of the application stack.
By hooking into our feature toggles, we can control which percentage of users see the treatment version of an experiment. For example, we may have one-half of our customers be our treatment group and one-half get shown the following: “Similar items link on unavailable items in the cart.” As part of our experiment, we compare the behavior of the control group (no offer made) against the treatment group (offer made), perhaps measuring number of purchases made in that session.
Etsy open-sourced their experimentation framework Feature API (formerly known as the Etsy A/B API), which not only supports A/B testing but also online ramp-ups, enabling throttling exposure to experiments. Other A/B testing products include Optimizely, Google Analytics, etc.
In a 2014 interview with Kendrick Wang of Apptimize, Lacy Rhoades at Etsy described their journey: “Experimentation at Etsy comes from a desire to make informed decisions, and ensure that when we launch features for our millions of members, they work. Too often, we had features that took a lot of time and had to be maintained without any proof of their success or any popularity among users. A/B testing allows us to...say a feature is worth working on as soon as it’s underway.”
Once we have the infrastructure to support A/B feature release and testing, we must ensure that product owners think about each feature as a hypothesis and use our production releases as experiments with real users to prove or disprove that hypothesis. Constructing experiments should be designed in the context of the overall customer acquisition funnel. Barry O’Reilly, co-author of Lean Enterprise: How High Performance Organizations Innovate at Scale, described how we can frame hypotheses in feature development in the following form:
We Believe that increasing the size of hotel images on the booking page
Will Result in improved customer engagement and conversion
We Will Have Confidence To Proceed When we see a 5% increase in customers who review hotel images who then proceed to book in forty-eight hours.
Adopting an experimental approach to product development requires us to not only break down work into small units (stories or requirements), but also validate whether each unit of work is delivering the expected outcomes. If it does not, we modify our road map of work with alternative paths that will actually achieve those outcomes.
Case Study
Doubling Revenue Growth through Fast Release Cycle Experimentation at Yahoo! Answers (2010)
The faster we can iterate and integrate feedback into the product or service we are delivering to customers, the faster we can learn and the bigger the impact we can create. How dramatically outcomes can be affected by faster cycle times was evident at Yahoo! Answers as they went from one release every six weeks to multiple releases every week.
In 2009, Jim Stoneham was General Manager of the Yahoo! Communities group that included Flickr and Answers. Previously, he had been primarily responsible for Yahoo! Answers, competing against other Q&A companies such as Quora, Aardvark, and Stack Exchange.
At that time, Answers had approximately 140 million monthly visitors, with over twenty million active users answering questions in over twenty different languages. However, user growth and revenue had flattened, and user engagement scores were declining.
Stoneham observes that “Yahoo Answers was and continues to be one of the biggest social games on the Internet; tens of millions of people are actively trying to ‘level up’ by providing quality answers to questions faster than the next member of the community. There were many opportunities to tweak the game mechanic, viral loops, and other community interactions. When you’re dealing with these human behaviors, you’ve got to be able to do quick iterations and testing to see what clicks with people.”
He continues, “These [experiments] are the things that Twitter, Facebook, and Zynga did so well. Those organizations were doing experiments at least twice per week—they were even reviewing the changes they made before their deployments, to make sure they were still on track. So here I am, running [the] largest Q&A site in the market, wanting to do rapid iterative feature testing, but we can’t release any faster than once every 4 weeks. In contrast, the other people in the market had a feedback loop 10x faster than us.”
Stoneham observed that as much as product owners and developers talk about being metrics-driven, if experiments are not performed frequently (daily or weekly), the focus of daily work is merely on the feature they’re working on, as opposed to customer outcomes.
As the Yahoo! Answers team was able to move to weekly deployments, and later multiple deployments per week, their ability to experiment with new features increased dramatically. Their astounding achievements and learnings over the next twelve months of experimentation included increased monthly visits of 72%, increased user engagement of threefold, and the team doubled their revenue. To continue their success, the team focused on optimizing the following top metrics:
Stoneham concluded, “This was exactly the learning that we needed to win in the marketplace—and it changed more than our feature velocity. We transformed from a team of employees to a team of owners. When you move at that speed, and are looking at the numbers and the results daily, your investment level radically changes.”
Success requires us to not only deploy and release software quickly, but also to out-experiment our competition.  And, while succeeding is important, the organizational learning that comes from experimentation also gives employees ownership of business objectives and customer satisfaction. In the next chapter, we examine and create review and coordination processes as a way to increase the quality of our current work.


There are circumstances when your local machine is not suitable for heavy processing or its operating system is incompatible with your target environment. In this case, your need to process your source code in an environment that is different than your local machine. This article examines the use of remote development server using DigitalOcean.
There is nothing new in having data stored in one system and having it processed in another. While conceptually everything is very clear, the implementation details can greatly vary. This article focuses on the so-called conventional server where there is no abstract layer between the OS itself and the tools used to process source code.
The setup will consist of the following:
Sign-up on DigitalOcean and create a droplet. Choose a password-based authentication as we will configure SSH keys later in this article. If you choose to use the SSH key, you would need to manually set root password otherwise you would require a root password reset.
As mentioned in the beginning, choose Ubuntu distro version 20.04 LTS (why Docker was not chosen is explained below). Choose droplet specs according to your workload needs. Other settings can be left with their default value. Choose a data center close to your physical location otherwise you might encounter poor SSH performance.
By default, your Ubuntu droplet starts with a root user. You may use it to configure the OS initially. Alternatively, you can grant sudo
to your non-root user to complete the configuration.
Afterward, a non-root user should be used for development operations. It is a very bad practice to use a root user as an everyday user in your development server.
Update your Ubuntu installation after it is up by running:
apt-get update && apt-get -y upgrade
Initially, I was planning on using Docker for this project. However, I ran into one specific technical detail: Docker containers exit on non-zero error. In the scope of this project, this presented a difficulty in keeping Docker containers running as, for example, a linting tool would exit with a non-zero exit code if there was an issue. While it is very possible to find a solution and keep Docker containers running, I had no hard requirement to use docker. Hence I have decided to create a "conventional" or "traditional" development server.
We will create a non-root user which we will use to sync source code from our local machine to remote. We will also use the same user to execute any developer tools or scripts. As mentioned in the beginning, using root for everyday work is a very bad habit (example explanation).
To create a new user, simply run: adduser --home /home/developer --shell /bin/bash developer
This command will create a new user called developer whose home directory is at /home/developer
and default shell as Bash (/bin/bash
). Note that this is an interactive command so you will need to supply a password and some other (trivial) information.
Then we will set its primary user group as www-data. This is required for Nginx to be able to serve files. To do that, run: usermod -g www-data developer
To verify that you have successfully run these commands, do this: id developer
Example of successful outcome: uid=1001(developer) gid=33(www-data) groups=33(www-data). Bracket value of uid shows the username and the bracket value of gid shows the name of the primary group. The first value should be developer and the second value should www-data.
To run elevated commands, you need to add your non-root user to the sudo group to run elevated commands. DigitalOcean published an excellent article on how to do this but here is a quick summary. First, run the following code to add user developer to the sudo group: usermod -aG sudo developer
To verify that your non-root user was successfully added to the sudo group, run: su - developer
. This command "switches" into sudo mode of that user instead of running a specific command via sudo
. To exit, simply type exit
and you will be back to root user session. More information on this command is available here.
Troubleshooting tips for beginners
deluser --remove-home username
groupdel username
getent passwd username
getent group username
getent
will return nothingOnce your droplet is up and running, it is time to configure SSH keys to allow password-less authentication. Ubuntu droplet image comes pre-installed with OpenSSH so there is no need to install it.
Using SSH keys with a running ssh-agent allows you to cache passphrase so you need to enter it only once for each new Bash session. For security reasons, it is better to separate the account password from SSH key passphrase.
Now we will generate an SSH key pair (public and private) on your local machine and add it to your droplet to allow a password-less connection.
This tutorial from DigitalOcean contains step-by-step explanations of how to do it. When following the tutorial from DigitalOcean, bear in mind that you need to set up SSH access for the developer user, not the root user. In other words, when copying the public key to remote, replace destination ~
with /home/developer/.ssh
.
Note that command ssh-copy-id
is not suitable for setting up keys for other users. As the syntax of the command is ssh-copy-id … user@host
, the public key will be copied to the account user. Switch -i
is for specifying a non-default key, not a different user.
You will also need to create an SSH entry with a custom hostname in your config. This is required for rsync Bash script which we will use to copy modified source code from local to remote. SSH config is typically located at: ~/.ssh/config
.
See this tutorial from DigitalOcean and OpenSSH man page for more details. Bear in mind that the sample config below contains AddKeysToAgent
which is a Mac-specific setting.
Host dev
HostName <ip>
User <user>
PreferredAuthentications publickey
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/<user>
Before logging out, make sure your root account has been set with a password. Root access can be very valuable if your OOBM stops functioning. For example, DigitalOcean provides console access. To set a password, simply execute: passwd
when logged in as root. Alternatively, you may need to reset the root password.
Key points if you are a beginner
ssh-keygen
will generate keys in the current folder~/.ssh/
so navigate to that directory firstssh-agent
before attempting a connectioneval "$(ssh-agent -s)"
ssh-add private_key
Config information for beginners
sshd_config
with ssh_config
:sshd_config
is for connecting to this host (this droplet)ssh_config
is for connecting to other hosts from the dropletPermitRootLogin no
Initial root password
Accessing root over SSH is a dangerous security practice (details).
At the beginning of this article, I have mentioned choosing password-based authentication instead of SSH key when creating a new droplet. I have done so with the following two assumptions in mind:
Troubleshooting steps
ssh-add -l
ssh -v user@host
Node will be installed using Snap. First, determine which version of Node you need to run. You can do so by running: snap info node
. Then you can install Node by running: snap install node --classic --channel <node_version>
For example: snap install node --classic --channel 14/stable
You can confirm the installed Node version by running: node --version
. If you installed the wrong Node version, first uninstall it by running: snap remove node
. Then proceed to install the desired version following previous instructions.
Canonical published an excellent step-by-step tutorial on installing Nginx in Ubuntu.
Canonical article tells you to create your website config in sites-enabled/
directory. Alternatively, you can create your site config in sites-available/
and symlink it to sites-enabled/
. This way you can easily enable/disable site config. When you create a symlink, you must use an absolute path: ln -s /etc/nginx/sites-available/site_config /etc/nginx/sites-enabled/
Canonical article tells you to restart nginx whenever you make config modification via service nginx restart
. Alternatively, you may simply reload config instead which is considered a safer option (more details here): service nginx reload
server {
listen 80;
listen [::]:80;
root /home/developer/repo/dist;
location / {
index index.html;
}
#error_log /var/log/nginx/debug.log debug;
server_name my-domain.com www.my-domain.com;
}
If you do not have a registered domain, you can still use the domain name but with certain limitations. You need to modify your hosts file to point your domain name to your droplet's IP address. For example: <IP_ADDRESS> my-domain.com
<IP_ADDRESS> www.my-domain.com
The limit lies in the fact that others will not be able to use the same domain name unless they also modify their hosts file. For the exact location of the hosts file, please consult this document as its location varies per operating system.
Do Not Use .dev TLD
Quick information for beginners
Troubleshooting steps for beginners
error_log /var/log/nginx/debug.log debug
Any server, even a private one, should maintain a certain level of security. Having a firewall is one of those measurements. DigitalOcean image of Ubuntu has UFW disabled by default. Before enabling UFW, you need to permit SSH (and other) ports otherwise your SSH connection will drop. To allow SSH connections, run: ufw allow OpenSSH
If you use non-standard SSH port (i.e. not 22), follow this tutorial from DigitalOcean. Since we will also require Nginx connection, permit that as well by running: ufw allow "Nginx Full"
As you have noticed, if the app name has a space in it, you need to enclose it in quotes. To view a list of existing application profiles, run: ufw app list
Note that these are pre-configured profiles that assume default ports. If you use non-standard ports, refer to the previously linked DigitalOcean tutorial. To enable UFW, run: ufw enable
In case something goes wrong, you always have OOBM access via console in DigitalOcean.
Troubleshooting tips for beginners
ufw disable
ufw reset
ufw delete rule
ufw delete allow OpenSSH
To synchronize source code from local to remote, a custom Bash script is used which uses rsync and fswatch. To make this setup Windows-compatible, you would need to use Cygwin (or similar).
The idea behind this script is simple. Watch the source code folder (typically repository) for changes. When a local change is detected, send modified files to remote.
Download the script from this repository. The repository is intended to be used as a git sub-module. Given the long repository name, it is better to clone it into a folder such as dev-server.
To start watching for file(s) changes, run: ./dev-server/watch.sh
If you want to do one-off sync with the remote, run: ./sync.sh
If you want to copy compiled files from a folder such as dist/
, run: scp dev:repo/dist/index.html .
Or you can run the following to copy (recursively) the entire folder: scp -r dev:repo/dist/ .
This Bash script makes several assumptions which are listed here. Installation of development dependencies should be done directly on the droplet to avoid network overhead (use SSH). Make sure to set correct permissions for the web content folder as described in the Nginx section.
Troubleshooting tips for beginners
If you run into permission errors, remove directory /home/developer/repo
(droplet) using sudo
(or root account) and re-run sync script.
In this article, I have provided a pragmatic approach towards moving source code compilation from your local machine to a remote one. This should not be confused with a continuous integration server as it is an entirely different concept.
In part two I will be looking at automating the provisioning of the remote development server using DigitalOcean meta-data and cloud-config. This will allow the ephemeral treatment of the droplet instance.
This way you can spin droplets up and down as needed as they will be configured automatically. You would be able to use more expensive droplets daily without incurring a full month's expense.
As explained in the beginning, this is not an alternative suggestion to Docker but rather a way to replace your local development processing with remote. This article does not claim to be authoritative but rather aims to be explorative.


| < Day Day Up > |
10.4 Operating System SecurityEven the most well thought out and secure grant tables will do you little good if any random cracker can get root access to your server. With unlimited access, someone could simply copy all your data files to another machine running MySQL.[5] Doing so would effectively give the cracker an identical copy of your database.
Data theft isn't the only threat to guard against. A creative cracker may decide that it's more fun to make subtle changes to your data over the course of weeks or even months. Depending on how long you keep backups around and when the data corruption is noticed, such an attack could be quite devastating. 10.4.1 GuidelinesThe general guidelines discussed here aren't a comprehensive guide to system security. If you are serious about securityŚand you should beŚwe recommend a copy of O'Reilly's Practical Unix and Internet Security by Simson Garfinkel, Gene Spafford, and Alan Schwartz. That said, here are some ideas for maintaining good security on your database servers:
Backups are important here as well. If your server is broken into, you'll need to reinstall the operating system from an untainted source. Once that's done, you'll be faced with the task of having to restore all the data. If you have the luxury of time, you might compare the hacked server to a known good backup in an effort to determine how the hacker was able to get in. Chapter 9 is devoted to backup and recovery issues. |
| < Day Day Up > |


Chapter 6 Examining gene-level expression metrics
6.1 Inspecting the most highly expressed genes
We examine the identities of the most highly expressed genes (Figure 6.1). This should generally be dominated by constitutively expressed transcripts, such as those for ribosomal or mitochondrial proteins. The presence of other classes of features may be cause for concern if they are not consistent with expected biology. For example, a top set containing many spike-in transcripts suggests that too much spike-in RNA was added during library preparation, while the absence of ribosomal proteins and/or the presence of their pseudogenes are indicative of suboptimal alignment.
fontsize <- theme(axis.text=element_text(size=12), axis.title=element_text(size=16))
plotHighestExprs(sce, n=50) + fontsize
6.2 Filtering out low-abundance genes
Low-abundance genes are problematic as zero or near-zero counts do not contain much information for reliable statistical inference (Bourgon, Gentleman, and Huber 2010). These genes typically do not provide enough evidence to reject the null hypothesis during testing, yet they still increase the severity of the multiple testing correction. In addition, the discreteness of the counts may interfere with statistical procedures, e.g., by compromising the accuracy of continuous approximations. Thus, low-abundance genes are often removed in many RNA-seq analysis pipelines before the application of downstream methods.
The “optimal” choice of filtering strategy depends on the downstream application. A more aggressive filter is usually required to remove discreteness (e.g., for normalization) compared to that required for removing underpowered tests. For hypothesis testing, the filter statistic should also be independent of the test statistic under the null hypothesis. Thus, we (or the relevant function) will filter at each step as needed, rather than applying a single filter for the entire analysis.
Several metrics can be used to define low-abundance genes.
The most obvious is the average count for each gene, computed across all cells in the dataset.
We calculate this using the calcAverage()
function, which also performs some adjustment for library size differences between cells.

The example below demonstrates how we could remove genes with average counts less than 1.
The number of TRUE
values in demo.keep
corresponds to the number of retained rows/genes after filtering.
## Mode FALSE TRUE
## logical 33490 13206
We also examine the number of cells that express each gene. This is closely related to the average count for most genes, as expression in many cells will result in a higher average (Figure 6.3). Genes expressed in very few cells are often uninteresting as they are driven by amplification artifacts (though they may also also arise from rare populations). We could then remove genes that are expressed in fewer than n cells.
num.cells <- nexprs(sce, byrow=TRUE)
smoothScatter(log10(ave.counts), num.cells, ylab="Number of cells",
xlab=expression(Log[10]~"average count"))
As mentioned above, we will apply these filters at each step rather than applying them globally by subsetting sce
.
This ensures that the most appropriate filter is used in each application.
Nonetheless, we remove genes that are not expressed in any cell to reduce computational work in downstream steps.
Such genes provide no information and would be removed by any filtering strategy.
## Mode FALSE TRUE
## logical 22833 23863
References
Bourgon, R., R. Gentleman, and W. Huber. 2010. “Independent filtering increases detection power for high-throughput experiments.” Proc. Natl. Acad. Sci. U.S.A. 107 (21): 9546–51.


public class ApplicationSecurityEnforcer
extends java.lang.Object
SecurityManager
for an application
and resolves whether the application runs in a development
environment or from a jar file (in other words, it resolves code-base
issues for the application).
| Modifier and Type | Field and Description |
|---|---|
static java.lang.String |
APP_MAIN_CLASS_DIR
Directory where classes are expanded in the development
version
|
protected java.lang.Class |
appMainClass
The application's main entry point
|
protected java.lang.String |
appMainClassRelativeURL
The resource name for the application's main class
|
static java.lang.String |
EXCEPTION_ALIEN_SECURITY_MANAGER
Message for the SecurityException thrown when there is already
a SecurityManager installed at the time Squiggle tries
to install its own security settings.
|
static java.lang.String |
EXCEPTION_NO_POLICY_FILE
Message for the NullPointerException thrown when no policy
file can be found.
|
static java.lang.String |
JAR_PROTOCOL
Files in a jar file have a URL with the jar protocol
|
static java.lang.String |
JAR_URL_FILE_SEPARATOR
Used in jar file urls to separate the jar file name
from the referenced file
|
protected BatikSecurityManager |
lastSecurityManagerInstalled
Keeps track of the last SecurityManager installed
|
static java.lang.String |
PROPERTY_APP_DEV_BASE
System property for App's development base directory
|
static java.lang.String |
PROPERTY_APP_JAR_BASE
System property for App's jars base directory
|
static java.lang.String |
PROPERTY_JAVA_SECURITY_POLICY
System property for specifying an additional policy file.
|
protected java.lang.String |
securityPolicy
The application's security policy
|
| Constructor and Description |
|---|
ApplicationSecurityEnforcer(java.lang.Class appMainClass,
java.lang.String securityPolicy)
Creates a new ApplicationSecurityEnforcer.
|
ApplicationSecurityEnforcer(java.lang.Class appMainClass,
java.lang.String securityPolicy,
java.lang.String appJarFile)
Deprecated.
This constructor is now deprecated. Use the two
argument constructor instead as this version will
be removed after the 1.5beta4 release.
|
| Modifier and Type | Method and Description |
|---|---|
void |
enforceSecurity(boolean enforce)
Enforces security by installing a
SecurityManager . |
java.net.URL |
getPolicyURL()
Returns the url for the default policy.
|
void |
installSecurityManager()
Installs a SecurityManager on behalf of the application
|
public static final java.lang.String EXCEPTION_ALIEN_SECURITY_MANAGER
public static final java.lang.String EXCEPTION_NO_POLICY_FILE
public static final java.lang.String PROPERTY_JAVA_SECURITY_POLICY
public static final java.lang.String JAR_PROTOCOL
public static final java.lang.String JAR_URL_FILE_SEPARATOR
public static final java.lang.String PROPERTY_APP_DEV_BASE
public static final java.lang.String PROPERTY_APP_JAR_BASE
public static final java.lang.String APP_MAIN_CLASS_DIR
protected java.lang.Class appMainClass
protected java.lang.String securityPolicy
protected java.lang.String appMainClassRelativeURL
protected BatikSecurityManager lastSecurityManagerInstalled
public ApplicationSecurityEnforcer(java.lang.Class appMainClass, java.lang.String securityPolicy, java.lang.String appJarFile)
appMainClass
- class of the applications's main entry pointsecurityPolicy
- resource for the security policy which
should be enforced for the application.appJarFile
- the Jar file into which the application is
packaged.public ApplicationSecurityEnforcer(java.lang.Class appMainClass, java.lang.String securityPolicy)
appMainClass
- class of the applications's main entry pointsecurityPolicy
- resource for the security policy which
should be enforced for the application.public void enforceSecurity(boolean enforce)
SecurityManager
.
This will throw a SecurityException
if installing
a SecurityManager
requires overriding an existing
SecurityManager
. In other words, this method will
not install a new SecurityManager
if there is
already one it did not install in place.public java.net.URL getPolicyURL()
public void installSecurityManager()
Copyright © 2022 Apache Software Foundation. All Rights Reserved.


Run gflags.exe -i tested.exe +sls
Load app in windgb
Save data to a text file
Find attempts to load DLLs, search the output for:
LdrpFindOrMapDependency
LdrpFindOrMapDll
LdrpFindKnownDll


This is the template management class. It is responsible for reading and parsing template files and then piping an incoming Parser object through them.


| Figure 1 |
Forest distribution and eco-geographical regions in China. I ... |
| Figure 2 |
Temperature anomalies in forest areas of China during the 21 ... |
| Figure 3 |
Net primary productivity in China for 1981–2010 and its stan ... |
| Figure 4 |
Comparison between simulated and measured net primary produc ... |
| Figure 5 |
Change of forest area in China at risk during the 21 st cent ... |
| Figure 6 |
Distribution of forest area at risk in China from 2021 to 20 ... |
| Figure 7 |
Distribution of forest area at risk in China from 2071 to 20 ... |
| Figure 8 |
Percentage of forest area affected by risk and its rate of c ... |
| Figure 9 |
Percentage of forest area affected by risk and its rate of c ... |
| Figure 10 |
Anomalies of climatic factors during 2071–2099 relative to 1 ... |


Advanced Search
Name:
Rules Text:
Card Type(s):
You can use SHIFT and CTRL keys to select more than one card type.
Artist:


|
Thank You!
Please Download Your
Zip Files Below...
Right-click
on the link below, and choose "Save Target As...". A window will pop
up, asking you to choose your save destination. Choose the directory
in your hard drive where you want your product to be saved and
download will begin in seconds.
|
|
Highly Recommended
|
|


Google+
Facebook
Twitter
Local login
Login
Create Users
/api/users
POST
username
password
email
response
Verify Email
/api/users/:username/email/:uuid
GET
username
uuid
response
Verify Email again
/:username/email/reverify
PUT
username
email
uuid
response
Change Status
/api/users/
/status/
PUT
response
Update Password
/api/users/me/password
PUT
new password
response
Coins
/api/users/me/coins
GET
response
Packages
/api/users/me/packages
GET
response
Package
/api/users/me/packages/:packageId
GET
packageId
response
Bids
/api/users/me/auctions/:auctionId/bids
POST
auctionId
amount
response
Bids
/api/users/me/auctions/:auctionId/bids?start=1&end=11
GET
auctionId
start
end
response
Friends
/api/users/me/auctions/:auctionId/friends?start=1&end=11
GET
auctionId
start
end
response
Auctions
/api/auctions?start=1&end=11
GET
start
end
response
Auction
/api/auctions/:auctionId
GET
auctionId
response
Ranking
/api/auctions/:auctionId/graltable?start=1&end=11
GET
auctionId
start
end
response
Category
/api/auctions/category/:categoria
GET
categoria
response


Sriracha wolf hella williamsburg bespoke, beard bushwick dreamcatcher vinyl PBR umami fingerstache. Truffaut sustainable synth, fanny pack art party typewriter wayfarers tumblr swag williamsburg freegan bicycle rights wolf.
You probably haven't heard of them helvetica semiotics, iphone chillwave terry richardson chambray sustainable.


Consulting
The following independent companies and individuals provide paid plugin consulting and development services.
| Name | Contact | Notes |
|---|---|---|
| Joachim Ansorg | www.plugin-dev.com | -/- |
| Daniel Espendiller |<EMAIL_ADDRESS>| -/- |
| Robert Ekendahl | www.edaphic.studio | Custom Language support |
| Patrick Scheibe | www.halirutan.de | Plugins: Wolfram Language, Key Promoter X. Highly active in the #intellij-platform on JetBrains Platform Slack. |
| Alexey Stukalov |<EMAIL_ADDRESS>www.haulmont.com | Plugins: CUBA. |
Please submit a PR or file a YouTrack issue for changes or additions to this list.
Last modified: 19 February 2020


Homework for September 2nd #TomsProjects
Print the neat and customized multiplication table:
def print_one_line(line_num):
for i in range(1,line_num+1):
print("{0:^3}×{1:^3}={2:^4}".format(i, line_num,i*line_num),end = " ")
def print_multi_lines(lines):
for i in range(1,lines +1):
print_one_line(i)
print()
print_multi_lines(9)
Efficiency test of binary search algorithm:
import time
import random
def guess_number(lower,upper,truth):
count = 0
while 1:
count += 1
num = round((lower + upper) / 2)
if num > truth:
#print(num,"is too high")
upper = num
elif num < truth:
#print(num, "is too low")
lower = num
else:
#print("Correct! The number is {0}. {1} trials in total".format(num,count))
return
def main():
upperbound = 100000
while 1:
t0 = time.clock()
for i in range(0,100000):
guess_number(0,upperbound,random.randrange(0,upperbound))
t = time.clock()
print("The total time spent when guessing the number between {0} and {1} for 100000 times is =".format("0",str(upperbound)), (t-t0),"s")
upperbound *= 2
if upperbound > 9*10a**14:
break
main()


EduMark is a free web service for schools and universities that aims to grading assignments in a paperless way .The primary purpose of EduMark is to streamline the process of sharing mark and lecture between teacher and student .
A person managing the whole learning process.
A learner enrolled into one or several classes.
A person responsible for generate account’s.
If You Have Any Problem Please Contact Us.


Basic 2D texture. More...
#include <texture.h>
Public Member Functions | |
| texture () | |
| texture (ifdstream stream) | |
| virtual size | size () const |
| virtual void | draw_in_rect (rect box) const |
| virtual void | draw_at_point (point pos) const |
Protected Member Functions | |
| void | init_texture (const unsigned char *data, int sz) |
Friends | |
| class | sprite |
Basic 2D texture.
| x2d::base::texture::texture | ( | ) | [inline] |
Construction of null texture
| x2d::base::texture::texture | ( | ifdstream | stream | ) |
Construction of texture from FD stream
| void x2d::base::texture::init_texture | ( | const unsigned char * | data, | |
| int | sz | |||
| ) | [protected] |
Initialize texture from bytes and size


 If the target thread doesn't have a thread ID, the thread will be created automatically.
| string | $action | "move" or "copy" |
| array | $posts | |
| array | $sourceThreads | |
| array | $targetThread | |
| array | $options |
| XenForo_Exception |
| addInlineModOptionToPost | ( | array & | $post, |
| array | $thread, | ||
| array | $forum, | ||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Adds the canInlineMod value to the provided post and returns the specific list of inline mod actions that are allowed on this post.
| array | $post | Post info |
| array | $thread | Thread the post is in |
| array | $forum | Forum the thread/post is in |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| alertQuotedMembers | ( | array | $post, |
| array | $thread, | ||
| array | $forum | ||
| ) |
Sends an alert to members directly quoted in a post
| array | $post | |
| array | $thread | |
| array | $forum |
| batchUpdateLikeUser | ( | $oldUserId, | |
| $newUserId, | |||
| $oldUsername, | |||
| $newUsername | |||
| ) |
Attempts to update any instances of an old username in like_users with a new username
| integer | $oldUserId | |
| integer | $newUserId | |
| string | $oldUsername | |
| string | $newUsername |
| canApproveUnapprovePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be approved or unapproved with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canControlSilentEdit | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the silent edit-related options can be set with the given permissions. This does not check post editing/viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canCopyPost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be copied to a new thread with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canDeletePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
$deleteType = 'soft' , |
|||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be deleted with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $deleteType | The type of deletion requested (soft or hard) |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canEditPost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be edited with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canLikePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be liked with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canMergePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be merged with another with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canMovePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be moved to a new thread with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canReportPost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Checks that the viewing user may report the specified post
| array | $post | |
| array | $thread | |
| array | $forum | |
| string | ||
| boolean | $errorPhraseKey | |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canUndeletePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be undeleted with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canViewAttachmentOnPost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if an attachment on this post can be viewed. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canViewIps | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the specified user can view IP addresses
| array | $post | |
| array | $thread | |
| array | $forum | |
| string | $errorPhraseKey | |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canViewPost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be viewed with the given permissions. This does not check thread/forum viewing permissions fully.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canViewPostAndContainer | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be viewed with the given permissions. TThis will check that any parent container can be viewed as well.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canViewPostHistory | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post's edit history can be viewed with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| canWarnPost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| & | $errorPhraseKey = '' , |
||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Determines if the post can be warning with the given permissions. This does not check post viewing permissions.
| array | $post | Info about the post |
| array | $thread | Info about the thread this post is in |
| array | $forum | Info about the forum the thread is in |
| string | $errorPhraseKey | Returned phrase key for a specific error |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| copyPosts | ( | array | $posts, |
| array | $sourceThreads, | ||
| array | $targetThread, | ||
| array | $options = array() |
||
| ) |
Moves the specified posts (in the given threads) to a new thread. The new thread will be created in this function if necessary.
| array | $posts | |
| array | $sourceThreads | |
| array | $targetThread | Information about the new thread or target thread |
| array | $options | Options to control behavior |
| countVisiblePostsInThread | ( | $threadId | ) |
Counts the number of visible posts in the specified thread. This is the reply count + 1.
| integer | $threadId |
| deletePost | ( | $postId, | |
| $deleteType, | |||
| array | $options = array() , |
||
| array | $forum = null |
||
| ) |
Helper to delete the specified post, via a soft or hard delete.
| integer | $postId | ID of the post to delete |
| string | $deleteType | Type of deletion (soft or hard) |
| array | $options | Deletion options. |
| array | $forum | The forum containing this post |
| getAndMergeAttachmentsIntoPosts | ( | array | $posts | ) |
Gets the attachments that belong to the given posts, and merges them in with their parent post (in the attachments key). The attachments key will not be set if no attachments are found for the post.
| array | $posts |
| getLastPostInThread | ( | $threadId, | |
| array | $fetchOptions = array() |
||
| ) |
Gets the latest post in the specified thread.
| integer | $threadId | |
| array | $fetchOptions | Collection of options that relate to fetching |
| getNewestPostsInThreadAfterDate | ( | $threadId, | |
| $postDate, | |||
| array | $fetchOptions = array() |
||
| ) |
Returns the newest posts for a specified thread, after the specified date. Posts are returned newest first.
| integer | $threadId | |
| integer | $postDate | |
| array | $fetchOptions |
| getNextPostInThread | ( | $threadId, | |
| $postDate, | |||
| array | $fetchOptions = array() , |
||
| array | $ignoredUserIds = array() |
||
| ) |
Gets the next post in a thread, post after the specified date. This is useful for finding the first unread post in a thread, for example.
| integer | $threadId | |
| integer | $postDate | Finds first post posted after this |
| array | $fetchOptions | Collection of options that relate to fetching |
| getNextPostInThreadByPosition | ( | $threadId, | |
| $position, | |||
| array | $fetchOptions = array() |
||
| ) |
Returns the ID of the next post in the given thread after the specified position
| integer | $threadId | |
| integer | $position | |
| array | $fetchOptions |
| getPermissionBasedPostFetchOptions | ( | array | $thread, |
| array | $forum, | ||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Gets permission-based options that apply to post fetching functions.
| array | $thread | Thread the posts will belong to |
| array | $forum | Forum the thread belongs to |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| getPostById | ( | $postId, | |
| array | $fetchOptions = array() |
||
| ) |
Gets the named post.
| integer | $postId |
| getPostIdsInRange | ( | $start, | |
| $limit | |||
| ) |
Gets post IDs in the specified range. The IDs returned will be those immediately after the "start" value (not including the start), up to the specified limit.
| integer | $start | IDs greater than this will be returned |
| integer | $limit | Number of posts to return |
| getPostInsertMessageState | ( | array | $thread, |
| array | $forum, | ||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Gets the message state for a newly inserted post by the viewing user.
| array | $thread | Thread info, may be empty for a new thread |
| array | $forum | |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| getPostsAndParentData | ( | array | $postIds, |
$permissionCombinationId = null |
|||
| ) |
From a list of post IDs, gets info about the posts, their threads, and the forums the threads are in.
If a permission combination ID is passed, the forums will retrieve permission info.
| array | $postIds | List of post IDs |
| integer | $permissionCombinationId | Permission combination ID that will be retrieved with the forums. |
| getPostsByIds | ( | array | $postIds, |
| array | $fetchOptions = array() |
||
| ) |
Gets the specified posts.
| array | $postIds | |
| array | $fetchOptions | Collection of options that relate to fetching |
| getPostsByUserForSpamCleaner | ( | $userId | ) |
Fetches a list of posts made by $userId except those which are the first post of a thread.
| $userId |
| getPostsByUserInOthersThreads | ( | $userId | ) |
Fetches basic information about all posts made by $userId, except those in threads started by $userId
| integer | $userId |
| getPostsInThread | ( | $threadId, | |
| array | $fetchOptions = array() |
||
| ) |
Returns all posts for a specified thread. Fetch options may limit posts returned.
| integer | $threadId | |
| array | $fetchOptions | Collection of options that relate to fetching |
| getPostsInThreadSimple | ( | $threadId, | |
$includeMessage = false |
|||
| ) |
Gets simple information about all posts in a thread. This does not include the actual contents of a message unless specifically requested.
| integer | $threadId | |
| boolean | $includeMessage | If true, includes message contents |
| getQuoteTextForPost | ( | array | $post, |
$maxQuoteDepth = 0 |
|||
| ) |
Gets the quote text for the specified post.
| array | $post | |
| integer | $maxQuoteDepth | Max depth of quoted text (-1 for unlimited) |
| getQuoteTextForPostFromHtml | ( | array | $post, |
| $messageHtml, | |||
$maxQuoteDepth = 0 |
|||
| ) |
Converts some HTML into quotable BB code
| array | $post | |
| string | $messageHtml | |
| integer | $maxQuoteDepth | Max depth of quoted text (-1 for unlimited) |
| isDeleted | ( | array | $post | ) |
Checks whether a post is marked as deleted
| array | $post |
| isModerated | ( | array | $post | ) |
Checks whether a post is marked as moderated
| array | $post |
| mergePosts | ( | array | $posts, |
| array | $threads, | ||
| $targetPostId, | |||
| $newMessage, | |||
$options = array() |
|||
| ) |
Merges specified posts (from given threads) into a target post and updates the text. The target post must be in the list of given posts.
| array | $posts | |
| array | $threads | |
| integer | $targetPostId | |
| string | $newMessage | |
| array | $options |
| movePosts | ( | array | $posts, |
| array | $sourceThreads, | ||
| array | $newThread, | ||
| array | $options = array() |
||
| ) |
Moves the specified posts (in the given threads) to a new thread. The new thread will be created in this function if necessary.
| array | $posts | |
| array | $sourceThreads | |
| array | $newThread | Information about the new thread or target thread |
| array | $options | Options to control behavior |
| preparePost | ( | array | $post, |
| array | $thread, | ||
| array | $forum, | ||
| array | $nodePermissions = null , |
||
| array | $viewingUser = null |
||
| ) |
Prepares a post for display, generally within the context of a thread.
| array | $post | Post to prepare |
| array | $thread | Thread post is in |
| array | $forum | Forum thread/post is in |
| array | null | $nodePermissions | |
| array | null | $viewingUser |
| preparePostJoinOptions | ( | array | $fetchOptions | ) |
Checks the 'join' key of the incoming array for the presence of the FETCH_x bitfields in this class and returns SQL snippets to join the specified tables if required
| array | $fetchOptions | containing a 'join' integer key build from this class's FETCH_x bitfields |
| recalculatePostPositionsInThread | ( | $threadId | ) |
Recalculates the position of all posts in the thread, and returns info relating to the thread: firstPostId, firstPostDate, firstPostState, lastPostId, visibleCount.
| integer | $threadId |


--- layout: default layout_keyword: knowledge_base_page title: Show organization hierarchy tree tags: group_admin_pages left_col_section_nav: [basic_user_nav] user_help_videos: [basic_user_videos] ---
As you build the groups needed for your organization, you can view these groups in a hierarchal tree display on a group's page. Adding a Groups Below: Tree View box to your page allows you to see the Subgroups under the group you are viewing. You can also easily access actions from your Groups Below: Tree View box, such as editing a group, broadcasting a message to a group or managing members of a group. Using our sample organization, we'll display the Groups Below our main entity, Springfield Recreation Center.
Navigate to the group page where you want to display the Groups Below, and open your Dashboard.
In the Add menu, choose Subgroups.
Click and drag the Groups Below: Tree View box onto your page.
See Add boxes to your page for more information on adding elements to your page with your dashboard.
When you have placed your new box where you would like it on your page, click Save in your Dashboard.
When you are logged in as an administrator to your group, you will see links associated with each group to allow you to easily jump to another group or perform actions for each group. Group members who do not have administrator privileges will not see these additional links.


Grocer
Cart (
0
)
Sections
Produce
Deli
Frozen
Groceries
Produce
Onions
$1.11
Add to cart
Tomatoes
$1.56
Add to cart
Carrots
$2.88
Add to cart
Deli
Cold Cuts
$1.47
Add to cart
Frozen
Orange Juice
$2.52
Add to cart
Ice Cream
$14.08
Add to cart
Pizza
$16.61
Add to cart
Cart
╳
Clear
Total
$
0.00
Item name
$0.00


| t01 |
knowledge, %, study, attitude(s), questionnaire, practice(s), infection, participants |
86 |
7 |
| t02 |
risk, infectious, media, risk_perception, perception(s), information, infectious_diseases, communication, diseases |
56 |
4 |
| t03 |
interviews, health, qualitative, barriers, emergency, work, experiences, themes, lack, emergency_nurses |
45 |
1 |
| t04 |
influenza, preventive, H1N1, pandemic, perceived, worry, avian, 2009, high, preventive_measures |
36 |
1 |
| t05 |
SARS, hong, kong, hong_kong, severe, acute_respiratory_syndrome, acute, 2003, telephone, syndrome |
40 |
0 |
| t06 |
student(s), learning, medical, nursing_students, medical_students, intervention, teaching, science, nursing |
42 |
2 |
| t07 |
vaccination, vaccine(s), influenza, swine, uptake, influenza_vaccination, flu, seasonal, swine_flu |
33 |
0 |
| t08 |
COVID-19, 95, CI, %, confidence, pilgrims, 95%CI, odds, ratio, hajj |
23 |
11 |
| t09 |
model, benefits, non-pharmaceutical, social_distancing, distancing, theoretical, behavioral, structural, norms, suicide |
23 |
0 |
| t10 |
nurses, stress, job, satisfaction, nursing, turnover, intention, work, turnover_intention, engagement |
21 |
1 |
| t11 |
standard, nurses, precautions, adherence, compliance, standard_precautions, performance, sps, hospital(s) |
24 |
0 |
| t12 |
face, masks, handwashing, bats, gps, face_mask, 2013, H7N9, %, live |
19 |
2 |
| t13 |
MERS, middle, east, mers-cov, middle_east_respiratory_syndrome, literacy, korea, syndrome, respiratory, south_korea |
15 |
0 |
| t14 |
disaster, cholera, residents, preparedness, disaster_medicine, medicine, NH, HPV, antibiotics, scores |
19 |
0 |
| t15 |
TB, EVD, zoonotic, households, veterinary, biosecurity, animals, veterinarians, hev, cattle |
18 |
0 |


--- layout: page title: Lean Prover Zulip Chat Archive permalink: archive/113488general/04670obtain.html ---
I just realised there is obtain
:
https://github.com/leanprover/mathlib/search?q=obtain&unscoped_q=obtain
I have not yet figured out what it does.
I think I looked it up before and I concluded it was a lean 2 thing?
it is a lean 2 thing. obtain x h, from expr, expr'
is the lean 2 way of writing let <x, h> := expr in expr'
, at least when expr
has exists type. I forget how general it is
the style guide also uses take
, which is no longer a keyword and is the same as λ
Ok, thanks for explaining!
obtain
used to work on all inductive types with a single constructor. It was the way to do cases
in term mode.


draw dropmenu number xpos ypos width height text_list
Draws a drop menu with the following attributes:
number
menu number, 0 - 64xpos
x center of the menu base in page coordinates (inches)ypos
y center of the menu base in page coordinates (inches)width
width (x) of the menu base (inches)height
height (y) of the menu base (inches)text_list
the contents of the menu, seperated by vertical bars (|)
set dropmenu
command.
text_list
that will spawn a new
dropmenu should have ">num>"
appended, where
num
will be the number assigned to the spawned
dropmenu. This new dropmenu is then defined with the following syntax:
draw dropmenu num cascade new_text_list
There can be up to three levels of nested cascading dropmenus launched from the main dropmenu. The 2nd example below illustrates how to implement cascading dropmenus.
q pos
reference page have
more information on using dropmenus.
'clear' 'reset events' 'set rgb 90 100 100 100' 'set rgb 91 150 150 150' 'set rgb 92 200 200 200' 'set dropmenu 1 91 90 92 0 91 92 90 1 91 90 92 92 90 6' 'draw dropmenu 1 1 8 1.5 0.5 Select a Variable | Wind | Temperature | Height | SLP ' noselect = 1 while (noselect) 'q pos' menunum = subwrd(result,7) menuitem = subwrd(result,8) if (menunum = 1) if menuitem = 1 ; newbase = 'Variable = Wind' ; endif if menuitem = 2 ; newbase = 'Variable = Temp' ; endif if menuitem = 3 ; newbase = 'Variable = Height' ; endif if menuitem = 4 ; newbase = 'Variable = SLP' ; endif 'draw dropmenu 1 1 8 1.5 0.5 'newbase' | Wind | Temperature | Height | SLP ' noselect = 0 endif endwhile
'clear' 'reset events' 'set rgb 90 100 100 100' 'set rgb 91 150 150 150' 'set rgb 92 200 200 200' 'set button 1 91 -1 -1 1 91 90 92 12' 'draw button 1 1 8 1 0.5 quit' 'set dropmenu 1 91 -1 -1 1 91 90 92 1 91 90 92 90 92 6' 'draw dropmenu 1 1.5 7.5 2 0.5 Menu Base | Space | Earth >05> | Sun | Moon' 'draw dropmenu 5 cascade Ocean | Land | Atmosphere >11> | Biosphere' 'draw dropmenu 11 cascade Snow | Rain | Mist | Tornado ' while (1) 'q pos' say result ev = subwrd(result,6) if (ev!=3); break; endif; endwhile


The Bitcoin Cash Civil War just got a lot more heated. Roger Ver, the owner of Bitcoin.com and one of the largest figures in Bitcoin Cash has shown an email allegedly from Craig Wright. In the email, Wright threatens to break Bitcoin Cash, preventing all trading for two years...


Computes the Levenshtein distance between sequences.
tf.compat.v1.edit_distance
tf.compat.v2.edit_distance
tf.edit_distance( hypothesis, truth, normalize=True, name='edit_distance' )
This operation takes variable-length sequences (hypothesis
and truth
),
each provided as a SparseTensor
, and computes the Levenshtein distance.
You can normalize the edit distance by length of truth
by setting
normalize
to true.
For example, given the following input:
# 'hypothesis' is a tensor of shape `[2, 1]` with variable-length values: # (0,0) = ["a"] # (1,0) = ["b"] hypothesis = tf.SparseTensor( [[0, 0, 0], [1, 0, 0]], ["a", "b"], (2, 1, 1)) # 'truth' is a tensor of shape `[2, 2]` with variable-length values: # (0,0) = [] # (0,1) = ["a"] # (1,0) = ["b", "c"] # (1,1) = ["a"] truth = tf.SparseTensor( [[0, 1, 0], [1, 0, 0], [1, 0, 1], [1, 1, 0]], ["a", "b", "c", "a"], (2, 2, 2)) normalize = True
This operation would return the following:
# 'output' is a tensor of shape `[2, 2]` with edit distances normalized # by 'truth' lengths. output ==> [[inf, 1.0], # (0,0): no truth, (0,1): no hypothesis [0.5, 1.0]] # (1,0): addition, (1,1): no hypothesis
hypothesis
: A SparseTensor
containing hypothesis sequences.truth
: A SparseTensor
containing truth sequences.normalize
: A bool
. If True
, normalizes the Levenshtein distance by
length of truth.
name
: A name for the operation (optional).A dense Tensor
with rank R - 1
, where R is the rank of the
SparseTensor
inputs hypothesis
and truth
.
TypeError
: If either hypothesis
or truth
are not a SparseTensor
.


COUNTDOWN TIMER
Enter the values in the given blanks
YEAR:
MONTH:
DATE:
HOURS:
MINUTES:
SECONDS:
Start
Stop
Reset


Embed D3 visualizations into slides, and keep the original interactivity.
(click on the globe and drag it to explore the different paths!)
Visualization:
Eclipses path by Philippe Riviere and friends
(Press right arrow or space bar to navigate to next slide)
(press right/left arrows to trigger visualization transitions)
Visualization adapted from Collision detection by Mike Bostock
Gooey effect - Hexagon by Nadieh Bremer
Modular Multiplication Circle by Megan O'Leary
Rainbow worm by Mike Bostock
(transition on 1 and 3)
Simple bar graph
(transition on 2 and 3)
Stage transitions independently for each visualization using Reveal.js 'data-fragment-index' (press right arrow or space)
You can interact with the embedded visualization using elements from the slide.
Click on the button to change the color of the nodes to yellow
Note: the staged transitions are still active (press right arrow or space)
Those are embedded semiotic figures!
(press right arrow to trigger an animation on the bar)
This is an embedded vega-lite figure! (with tooltip enabled)
Full website.
Note: it's scrollable!