The SPMD programming model provided by ispc naturally delivers excellent performance for many workloads thanks to efficient use of CPU SIMD vector hardware. This guide provides more details about how to get the most out of ispc in practice.
- Key Concepts
- Tips and Techniques
- Understanding Gather and Scatter
- Avoid 64-bit Addressing Calculations When Possible
- Avoid Computation With 8 and 16-bit Integer Types
- Implementing Reductions Efficiently
- Using "foreach_active" Effectively
- Using Low-level Vector Tricks
- The "Fast math" Option
- "inline" Aggressively
- Avoid The System Math Library
- Declare Variables In The Scope Where They're Used
- Instrumenting Intel® ISPC Programs To Understand Runtime Behavior
- Choosing A Target Vector Width
- Notices & Disclaimers
Key Concepts
This section describes the four most important concepts to understand and keep in mind when writing high-performance ispc programs. It assumes good familiarity with the topics covered in the ispc Users Guide.
Efficient Iteration With "foreach"
The foreach parallel iteration construct is semantically equivalent to a regular for() loop, though it offers meaningful performance benefits. (See the documentation on "foreach" in the Users Guide for a review of its syntax and semantics.) As an example, consider this simple function that iterates over some number of elements in an array, doing computation on each one:
export void foo(uniform int a[], uniform int count) { for (int i = programIndex; i < count; i += programCount) { // do some computation on a[i] } }
Depending on the specifics of the computation being performed, the code generated for this function could likely be improved by modifying the code so that the loop only goes as far through the data as is possible to pack an entire gang of program instances with computation each time through the loop. Doing so enables the ispc compiler to generate more efficient code for cases where it knows that the execution mask is "all on". Then, an if statement at the end handles processing the ragged extra bits of data that didn't fully fill a gang.
export void foo(uniform int a[], uniform int count) { // First, just loop up to the point where all program instances // in the gang will be active at the loop iteration start uniform int countBase = count & ~(programCount-1); for (uniform int i = 0; i < countBase; i += programCount) { int index = i + programIndex; // do some computation on a[index] } // Now handle the ragged extra bits at the end int index = countBase + programIndex; if (index < count) { // do some computation on a[index] } }
While the performance of the above code will likely be better than the first version of the function, the loop body code has been duplicated (or has been forced to move into a separate utility function).
Using the foreach looping construct as below provides all of the performance benefits of the second version of this function, with the compactness of the first.
export void foo(uniform int a[], uniform int count) { foreach (i = 0 ... count) { // do some computation on a[i] } }
Improving Control Flow Coherence With "foreach_tiled"
Depending on the computation being performed, foreach_tiled may give better performance than foreach. (See the documentation in the Users Guide for the syntax and semantics of foreach_tiled.) Given a multi-dimensional iteration like:
foreach (i = 0 ... width, j = 0 ... height) { // do computation on element (i,j) }
if the foreach statement is used, elements in the gang of program instances will be mapped to values of i and j by taking spans of programCount elements across i with a single value of j. For example, the foreach statement above roughly corresponds to:
for (uniform int j = 0; j < height; ++j) for (int i = 0; i < width; i += programCount) { // do computation }
When a multi-dimensional domain is being iterated over, foreach_tiled statement maps program instances to data in a way that tries to select square n-dimensional segments of the domain. For example, on a compilation target with 8-wide gangs of program instances, it generates code that iterates over the domain the same way as the following code (though more efficiently):
for (int j = programIndex/4; j < height; j += 2) for (int i = programIndex%4; i < width; i += 4) { // do computation }
Thus, each gang of program instances operates on a 2x4 tile of the domain. With higher-dimensional iteration and different gang sizes, a similar mapping is performed--e.g. for 2D iteration with a 16-wide gang size, 4x4 tiles are iterated over; for 4D iteration with a 8-gang, 1x2x2x2 tiles are processed, and so forth.
Performance benefit can come from using foreach_tiled in that it essentially optimizes for the benefit of iterating over compact regions of the domain (while foreach iterates over the domain in a way that generally allows linear memory access.) There are two benefits from processing compact regions of the domain.
First, it's often the case that the control flow coherence of the program instances in the gang is improved; if data-dependent control flow decisions are related to the values of the data in the domain being processed, and if the data values have some coherence, iterating with compact regions will improve control flow coherence.
Second, processing compact regions may mean that the data accessed by program instances in the gang is more coherent, leading to performance benefits from better cache hit rates.
As a concrete example, for the ray tracer example in the ispc distribution (in the examples/rt directory), performance is 20% better when the pixels are iterated over using foreach_tiled than foreach, because more coherent regions of the scene are accessed by the set of rays in the gang of program instances.
Using Coherent Control Flow Constructs
Recall from the ispc Users Guide, in the SPMD-on-SIMD Execution Model section that if statements with a uniform test compile to more efficient code than if tests with varying tests. The coherent cif statement can provide many benefits of if with a uniform test in the case where the test is actually varying.
In this case, the code the compiler generates for the if test is along the lines of the following pseudo-code:
bool expr = /* evaluate cif condition */ if (all(expr)) { // run "true" case of if test only } else if (!any(expr)) { // run "false" case of if test only } else { // run both true and false cases, updating mask appropriately }
For if statements where the different running SPMD program instances don't have coherent values for the boolean if test, using cif introduces some additional overhead from the all and any tests as well as the corresponding branches. For cases where the program instances often do compute the same boolean value, this overhead is worthwhile. If the control flow is in fact usually incoherent, this overhead only costs performance.
In a similar fashion, ispc provides cfor, cwhile, and cdo statements. These statements are semantically the same as the corresponding non-"c"-prefixed functions.
Use "uniform" Whenever Appropriate
For any variable that will always have the same value across all of the program instances in a gang, declare the variable with the uniform qualifier. Doing so enables the ispc compiler to emit better code in many different ways.
As a simple example, consider a for loop that always does the same number of iterations:
for (int i = 0; i < 10; ++i) // do something ten times
If this is written with i as a varying variable, as above, there's additional overhead in the code generated for the loop as the compiler emits instructions to handle the possibility of not all program instances following the same control flow path (as might be the case if the loop limit, 10, was itself a varying value.)
If the above loop is instead written with i uniform, as:
for (uniform int i = 0; i < 10; ++i) // do something ten times
Then better code can be generated (and the loop possibly unrolled).
In some cases, the compiler may be able to detect simple cases like these, but it's always best to provide the compiler with as much help as possible to understand the actual form of your computation.
Use "Structure of Arrays" Layout When Possible
In general, memory access performance (for both reads and writes) is best when the running program instances access a contiguous region of memory; in this case efficient vector load and store instructions can often be used rather than gathers and scatters. As an example of this issue, consider an array of a simple point datatype laid out and accessed in conventional "array of structures" (AOS) layout:
struct Point { float x, y, z; }; uniform Point pts[...]; float v = pts[programIndex].x;
In the above code, the access to pts[programIndex].x accesses non-sequential memory locations, due to the y and z values between the desired x values in memory. A "gather" is required to get the value of v, with a corresponding decrease in performance.
If Point was defined as a "structure of arrays" (SOA) type, the access can be much more efficient:
struct Point8 { float x[8], y[8], z[8]; }; uniform Point8 pts8[...]; int majorIndex = programIndex / 8; int minorIndex = programIndex % 8; float v = pts8[majorIndex].x[minorIndex];
In this case, each Point8 has 8 x values contiguous in memory before 8 y values and then 8 z values. If the gang size is 8 or less, the access for v will have the same value of majorIndex for all program instances and will access consecutive elements of the x[8] array with a vector load. (For larger gang sizes, two 8-wide vector loads would be issues, which is also quite efficient.)
However, the syntax in the above code is messy; accessing SOA data in this fashion is much less elegant than the corresponding code for accessing the data with AOS layout. The soa qualifier in ispc can be used to cause the corresponding transformation to be made to the Point type, while preserving the clean syntax for data access that comes with AOS layout:
soa<8> Point pts[...]; float v = pts[programIndex].x;
Thanks to having SOA layout a first-class concept in the language's type system, it's easy to write functions that convert data between the layouts. For example, the aos_to_soa function below converts count elements of the given Point type from AOS to 8-wide SOA layout. (It assumes that the caller has pre-allocated sufficient space in the pts_soa output array.
void aos_to_soa(uniform Point pts_aos[], uniform int count, soa<8> pts_soa[]) { foreach (i = 0 ... count) pts_soa[i] = pts_aos[i]; }
Analogously, a function could be written to convert back from SOA to AOS if needed.
Tips and Techniques
This section introduces a number of additional techniques that are worth keeping in mind when writing ispc programs.
Understanding Gather and Scatter
Memory reads and writes from the program instances in a gang that access irregular memory locations (rather than a consecutive set of locations, or a single location) can be relatively inefficient. As an example, consider the "simple" array indexing calculation below:
int i = ....; uniform float x[10] = { ... }; float f = x[i];
Since the index i is a varying value, the program instances in the gang will in general be reading different locations in the array x. Because not all CPUs have a "gather" instruction, the ispc compiler has to serialize these memory reads, performing a separate memory load for each running program instance, packing the result into f. (The analogous case happens for a write into x[i].)
In many cases, gathers like these are unavoidable; the program instances just need to access incoherent memory locations. However, if the array index i actually has the same value for all of the program instances or if it represents an access to a consecutive set of array locations, much more efficient load and store instructions can be generated instead of gathers and scatters, respectively.
In many cases, the ispc compiler is able to deduce that the memory locations accessed by a varying index are either all the same or are uniform. For example, given:
uniform int x = ...; int y = x; return array[y];
The compiler is able to determine that all of the program instances are loading from the same location, even though y is not a uniform variable. In this case, the compiler will transform this load to a regular vector load, rather than a general gather.
Sometimes the running program instances will access a linear sequence of memory locations; this happens most frequently when array indexing is done based on the built-in programIndex variable. In many of these cases, the compiler is also able to detect this case and then do a vector load. For example, given:
for (int i = programIndex; i < count; i += programCount) // process array[i];
Regular vector loads and stores are issued for accesses to array[i].
Both of these cases have been ones where the compiler is able to determine statically that the index has the same value at compile-time. It's often the case that this determination can't be made at compile time, but this is often the case at run time. The reduce_equal() function from the standard library can be used in this case; it checks to see if the given value is the same across over all of the running program instances, returning true and its uniform value if so.
The following function shows the use of reduce_equal() to check for an equal index at execution time and then either do a scalar load and broadcast or a general gather.
uniform float array[..] = { ... }; float value; int i = ...; uniform int ui; if (reduce_equal(i, &ui) == true) value = array[ui]; // scalar load + broadcast else value = array[i]; // gather
For a simple case like the one above, the overhead of doing the reduce_equal() check is likely not worthwhile compared to just always doing a gather. In more complex cases, where a number of accesses are done based on the index, it can be worth doing. See the example examples/volume_rendering in the ispc distribution for the use of this technique in an instance where it is beneficial to performance.
Understanding Memory Read Coalescing
XXXX todo
Avoid 64-bit Addressing Calculations When Possible
Even when compiling to a 64-bit architecture target, ispc does many of the addressing calculations in 32-bit precision by default--this behavior can be overridden with the --addressing=64 command-line argument. This option should only be used if it's necessary to be able to address over 4GB of memory in the ispc code, as it essentially doubles the cost of memory addressing calculations in the generated code.
Avoid Computation With 8 and 16-bit Integer Types
The code generated for 8 and 16-bit integer types is generally not as efficient as the code generated for 32-bit integer types. It is generally worthwhile to use 32-bit integer types for intermediate computations, even if the final result will be stored in a smaller integer type.
Implementing Reductions Efficiently
It's often necessary to compute a reduction over a data set--for example, one might want to add all of the values in an array, compute their minimum, etc. ispc provides a few capabilities that make it easy to efficiently compute reductions like these. However, it's important to use these capabilities appropriately for best results.
As an example, consider the task of computing the sum of all of the values in an array. In C code, we might have:
/* C implementation of a sum reduction */ float sum(const float array[], int count) { float sum = 0; for (int i = 0; i < count; ++i) sum += array[i]; return sum; }
Exactly this computation could also be expressed as a purely uniform computation in ispc, though without any benefit from vectorization:
/* inefficient ispc implementation of a sum reduction */ uniform float sum(const uniform float array[], uniform int count) { uniform float sum = 0; for (uniform int i = 0; i < count; ++i) sum += array[i]; return sum; }
As a first try, one might try using the reduce_add() function from the ispc standard library; it takes a varying value and returns the sum of that value across all of the active program instances.
/* inefficient ispc implementation of a sum reduction */ uniform float sum(const uniform float array[], uniform int count) { uniform float sum = 0; foreach (i = 0 ... count) sum += reduce_add(array[i]); return sum; }
This implementation loads a gang's worth of values from the array, one for each of the program instances, and then uses reduce_add() to reduce across the program instances and then update the sum. Unfortunately this approach loses most benefit from vectorization, as it does more work on the cross-program instance reduce_add() call than it saves from the vector load of values.
The most efficient approach is to do the reduction in two phases: rather than using a uniform variable to store the sum, we maintain a varying value, such that each program instance is effectively computing a local partial sum on the subset of array values that it has loaded from the array. When the loop over array elements concludes, a single call to reduce_add() computes the final reduction across each of the program instances' elements of sum. This approach effectively compiles to a single vector load and a single vector add for each loop iteration's of values--very efficient code in the end.
/* good ispc implementation of a sum reduction */ uniform float sum(const uniform float array[], uniform int count) { float sum = 0; foreach (i = 0 ... count) sum += array[i]; return reduce_add(sum); }
Using "foreach_active" Effectively
For high-performance code,
For example, consider this segment of code, from the introduction of foreach_active in the ispc User's Guide:
uniform float array[...] = { ... }; int index = ...; foreach_active (i) { ++array[index]; }
Here, index was assumed to possibly have the same value for multiple program instances, so the updates to array[index] are serialized by the foreach_active statement in order to not have undefined results when index values do collide.
The code generated by the compiler can be improved in this case by making it clear that only a single element of the array is accessed by array[index] and that thus a general gather or scatter isn't required. Specifically, by using the extract() function from the standard library to extract the current program instance's value of index into a uniform variable and then using that to index into array, as below, more efficient code is generated.
foreach_active (instanceNum) { uniform int unifIndex = extract(index, instanceNum); ++array[unifIndex]; }
Using Low-level Vector Tricks
Many low-level Intel® SSE and AVX coding constructs can be implemented in ispc code. The ispc standard library functions intbits() and floatbits() are often useful in this context. Recall that intbits() takes a float value and returns it as an integer where the bits of the integer are the same as the bit representation in memory of the float. (In other words, it does not perform an integer to floating-point conversion.) floatbits(), then, performs the inverse computation.
As an example of the use of these functions, the following code efficiently reverses the sign of the given values.
float flipsign(float a) { unsigned int i = intbits(a); i ^= 0x80000000; return floatbits(i); }
This code compiles down to a single XOR instruction.
The "Fast math" Option
ispc has a --opt=fast-math command-line flag that enables a number of optimizations that may be undesirable in code where numerical precision is critically important. For many graphics applications, for example, the approximations introduced may be acceptable, however. The following two optimizations are performed when --opt=fast-math is used. By default, the --opt=fast-math flag is off.
- Expressions like x / y, where y is a compile-time constant, are transformed to x * (1./y), where the inverse value of y is precomputed at compile time.
- Expressions like x / y, where y is not a compile-time constant, are transformed to x * rcp(y), where rcp() maps to the approximate reciprocal instruction from the ispc standard library.
"inline" Aggressively
Inlining functions aggressively is generally beneficial for performance with ispc. Definitely use the inline qualifier for any short functions (a few lines long), and experiment with it for longer functions.
Avoid The System Math Library
The default math library for transcendentals and the like in ispc has higher error than the system's math library, though is much more efficient due to being vectorized across the program instances and due to the fact that the functions can be inlined in the final code. (It generally has errors in the range of 10ulps, while the system math library generally has no more than 1ulp of error for transcendentals.)
If the --math-lib=system command-line option is used when compiling an ispc program, then calls to the system math library will be generated instead. This option should only be used if the higher precision is absolutely required as the performance impact of using it can be significant.
Declare Variables In The Scope Where They're Used
Performance is slightly improved by declaring variables at the same block scope where they are first used. For example, in code like the following, if the lifetime of foo is only within the scope of the if clause, write the code like this:
float func() { .... if (x < y) { float foo; ... use foo ... } }
Try not to write code as:
float func() { float foo; .... if (x < y) { ... use foo ... } }
Doing so can reduce the amount of masked store instructions that the compiler needs to generate.
Instrumenting Intel® ISPC Programs To Understand Runtime Behavior
ispc has an optional instrumentation feature that can help you understand performance issues. If a program is compiled using the --instrument flag, the compiler emits calls to a function with the following signature at various points in the program (for example, at interesting points in the control flow, when scatters or gathers happen.)
extern "C" { void ISPCInstrument(const char *fn, const char *note, int line, uint64_t mask); }
This function is passed the file name of the ispc file running, a short note indicating what is happening, the line number in the source file, and the current mask of active program instances in the gang. You must provide an implementation of this function and link it in with your application.
For example, when the ispc program runs, this function might be called as follows:
ISPCInstrument("foo.ispc", "function entry", 55, 0xfull);
This call indicates that at the currently executing program has just entered the function defined at line 55 of the file foo.ispc, with a mask of all lanes currently executing (assuming a four-wide gang size target machine).
For a fuller example of the utility of this functionality, see examples/aobench_instrumented in the ispc distribution. This example includes an implementation of the ISPCInstrument() function that collects aggregate data about the program's execution behavior.
When running this example, you will want to direct to the ao executable to generate a low resolution image, because the instrumentation adds substantial execution overhead. For example:
% ./ao 1 32 32
After the ao program exits, a summary report along the following lines will be printed. In the first few lines, you can see how many times a few functions were called, and the average percentage of SIMD lanes that were active upon function entry.
ao.ispc(0067) - function entry: 342424 calls (0 / 0.00% all off!), 95.86% active lanes ao.ispc(0067) - return: uniform control flow: 342424 calls (0 / 0.00% all off!), 95.86% active lanes ao.ispc(0071) - function entry: 1122 calls (0 / 0.00% all off!), 97.33% active lanes ao.ispc(0075) - return: uniform control flow: 1122 calls (0 / 0.00% all off!), 97.33% active lanes ao.ispc(0079) - function entry: 10072 calls (0 / 0.00% all off!), 45.09% active lanes ao.ispc(0088) - function entry: 36928 calls (0 / 0.00% all off!), 97.40% active lanes ...
Choosing A Target Vector Width
By default, ispc compiles to the natural vector width of the target instruction set. For example, for SSE2 and SSE4, it compiles four-wide, and for AVX, it complies 8-wide. For some programs, higher performance may be seen if the program is compiled to a doubled vector width--8-wide for SSE and 16-wide for AVX.
For workloads that don't require many of registers, this method can lead to significantly more efficient execution thanks to greater instruction level parallelism and amortization of various overhead over more program instances. For other workloads, it may lead to a slowdown due to higher register pressure; trying both approaches for key kernels may be worthwhile.
This option is only available for each of the SSE2, SSE4 and AVX targets. It is selected with the --target=sse2-x2, --target=sse4-x2 and --target=avx-x2 options, respectively.
Notices & Disclaimers
Performance varies by use, configuration and other factors. Learn more at www.intel.com/PerformanceIndex.


The jQuery To Do List
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
drop here to delete an item


Based in Moringa school. Specialized in fullstack web development.
If you are business person seeking a web presence or an employer looking to hire,
you can get in touch with me.
A minimalist who believes in structuring websites that are ultimately
geared toward providing the user the best experience possible by having clean user interfaces
that align with the business's goals.
I am both a self taught web developer and senior majoring in Computer Science at Moringa school.
I am always looking for ways to grow as an individual whether being improving technical skills,
gaining work experience, or building experience using Github and Slack with a team.
People can become developers from almost any background,
whether they started programming at an early age and majored in computer science (CS),
or they taught themselves how to code later in life.
These stories focus on how the authors went
from being beginning coders to getting that first job.
These are projets that I have been doing since I began my career and
they are as follows with there discriptions.
Neom was my first project.
This was more entailed with youths life.
After find out that youths in Africa in general have a big challenge of unemployement
I really wanted to find out how I can solve this issue and that's why I came up with a website called Neom .
Neom is a website that creat a platform to youths specifically where they are able to be connected to available opportunities.
Click the Neom button below to learn more about Neom.
Talanta.ke
Talanta.ke all is youths website too .
Talanta.ke is Building a platform that supports youth talent and emerging new ideas.
click the button below to learn more about talanta.ke.


FormBuilder Demo
Drop a field here
Add field
Field settings
Text
Text Area
CheckBox
Button
Select Options
Radio Buttons
File Upload
Fieldset


Color Explanation :
Red : -, X, T
Orange : Ratio >= 10
Yellow : Ratio >= 7
Green : Ratio >= 5
Cyan : Ratio < 5
Purple : Ratio < 3 (Mission Impossibluuu)
For algorithm project.
Every score in subtask 1 - 4 must not colored with
Red , you will recieved 9/10 scores.
But in IOI competition. "Every" scores must colored with
Cyan or
Purple for perfect scores (100/100).


ArtWorks in Progress
March/April 2017
How can art challenge the dominant methodologies of the post-Fordist state? How does research play a role in questioning these pressures, and how are today's cutting-edge artists pushing against these boundaries?
ArtWorks In Progress seeks to drive open the space between start and finish, unfolding the seedy underbelly of artistic research and eviscerating the distinctions of procedures.
The works in ArtWorks in Progress will escape frmo the quotidian expectations of the gallery, the space, and the cube; what will remain is undeniably bold and counter-factually evident.


WITNESS LIST Transportation Committee March 4, 2003-8:00A HB 252 For: Cernosek, Larry (Self and Texas Towing & Storage Association) HB 630 For: Granade, Gary S (Self and Texas Chapter 173d Airborne Brigade Sgt.) Rolfe, John H. (Self and 173d Airborne Brigade) HB 678 For: Broadrick, Mark (Self) Lloyd, Margaret (Self and Scenic Texas Inc. & The Scenic Coalition) St. Pierre, Stan (Self) Against: Ford, Curtis (National Media Corp.) Poole, Mike (Benchmark, Poole, P&E, & Media Outdoor Displays) St. Romain, Nevin (Self) On: Campbell, John (TXDOT) Vela, Lee (Outdoor Advertising Assoc. of Texas and Clear Channel Outdoor) HB 901 For: Feagin, Jackie D. (City of Garland) Hiney, Bill (City of Plano) Hinton, Jr., Charles M. (City of Garland, Garland City Council) Nusser, Bob (Richardson City Council) Perkins, Bobby (City of Tyler Police Dept.) Ragsdale, Walter (City of Richardson, Texas Institute of Transportation Engineers) Shaw, Jonathan D. (Self) Southern, Joe (Self) Zacharias, Larry (City of Richardson - Police) Against: del Llano, Ann (A.C.L.U. of Texas) Kubosh, Paul (Self and Municipal Justice Bar Association of Texas) Monks, Gerald Patrick (Municipal Justice Bar Association of Texas) Stork, Terry E. (Self) On: Beck, N. John (Self and Clean Air Partners) Lopez, Carlos (Tx. Dept. of Transportation) HB 946 For: Hinkle, Ron (Texas Association of Campground Owners) McEwen, Clark (Texas Recreational Vehicle Association) Pennington, Amy (Self) HB 1208 For: Klausner, C.J. (City of Houston - Police Dept.)


RED SCORPION A film review by Burke Cox Copyright 1989 Burke Cox
RED SCORPION (R - violence, language)
Director: Joseph Zito Producer: Jack Abramoff
Dolph (ROCKY IV, MASTERS OF THE UNIVERSE) Lundgren stars as Nicolai, the most respected and dangerous member of a super-elite Soviet military special forces group. Nicolai is ordered to end a growing rebellion in Soviet and Cuban controlled Africa. His mission is to befriend a captured member of the African rebellion and use that friendship to gain entry into the rebels' main camp. As soon as Nicolai is trusted and in the camp, he is to assassinate their leader.
The movie centers around Nicolai's struggle with his orders. At first, he is an unwavering soldier acting not on what he feels but on what he is told. But he soon develops a growing resistance to the sanctity of his orders, and finally a disgust for the Soviet and Cuban oppression in Africa.
Lundgren gives a respectable performance as Nicolai, making much of the movie seem believable. It is this performance that makes the movie worthwhile. Removing Nicolai's personal struggle would reduce the quality and interest of this film significantly. But, Lundgren does portray a very human and interesting character. Of particular interest is his interaction with and old African bushmen. Without the benefits of a common language, these two develop a unique bond between each another that provides the most memorable sequence in the film.
But don't get too excited, this movie could have been better. It was unbelievable in a few parts, and technically poor in others. However, considering the budget and targeted audience, this movie reaches its goals. It is an entertaining and interesting film that, although somewhat predictable, manages to interject little pieces of human nature into the somewhat tired and worn subject of weak rebels led by a strong outsider against a common foe. If you like this type of movie, you will probably enjoy this film.
Using a -5 to +5 scale, RED SCORPION rates a +1.
Burke Cox uunet!ingr!b11!burke!burke<EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Gateway
BOT
11-Jul-19 01:51 PM
[dscrd-hush] <dukeleto> @AkiraX good question
[dscrd-hush] <dukeleto> SilentDragon will have an Upload/Download Memo feature, so you can upload a file, or save a memo as a local file
[dscrd-hush] <AkiraX> I don't see it yet though. Upcoming feature
[dscrd-hush] <dukeleto> Correct
[dscrd-hush] <dukeleto> had to get something out, in peoples hands, to find some bugs/etc
[dscrd-hush] <dukeleto> Once we allow uploaded files on Hush, the genie is out
[dscrd-hush] <dukeleto> there is no putting the cap back that bottle
[dscrd-hush] <ComputerGenie - MineHush.com> there is no putting the cap back that bottle
buy better scotch :troll:
[dscrd-hush] <dukeleto> We can support large files, but I am not sure what file size should be supported by default
[dscrd-hush] <AkiraX> Let me know when I can rub the lamp
[dscrd-hush] <dukeleto> hax0rs can always change things, but I need to set a default that helps prevent spamming the Hush chain with huge files
[dscrd-hush] <dukeleto> The Hush chain is not for storing all 37 seasons of Friends in HD, we need to protect against that. Hush is for very important, small-to-medium sized files
[dscrd-hush] <dukeleto> Since it takes many minutes of CPU time to upload megabytes, that is also a protection. It's usually going to be easier for people to upload to some other service
[dscrd-hush] <dukeleto> @ComputerGenie - MineHush.com 12yr, or older, if you are buying
[dscrd-hush] <ComputerGenie - MineHush.com> If I'm buying then I'm drinking
(edited)
[dscrd-hush] <dukeleto> I am genuinely worried about people abusing Hush, and what recourse we will have once these tools are out in the open
[dscrd-hush] <dukeleto> But tools are not good nor evil, that is my philosophy
[dscrd-hush] <dukeleto> People use tools for good or evil purposes
[dscrd-hush] <Takoy_Nahal> @thank you, we waiting for the POS) this thing will be good for BTCH)
[dscrd-hush] <ComputerGenie - MineHush.com> I do have a nice bottle of Macallan 12 year that was a gift
Other than that, JW Blue or Glenlivet 15 is what I usually have on hand
(edited)
[dscrd-hush] <dukeleto> @Takoy_Nahal at this point, i would pay you to launch PoS on BTCH, it's a good idea, but my time is very very restricted. Mostly I am focusing on Hush+HushList+SilentDragon. Hard to give time to BTCH, we need more people working on things. We have HUSH + BTCH funds to pay people, we just need people willing to work
[dscrd-hush] <ComputerGenie - MineHush.com> I am genuinely worried about people abusing Hush
Wouldn't fees cover most of the issues (outside of content "legality")?
[dscrd-hush] <Takoy_Nahal> @dukeleto Unfortunately, I do not have programming skills)
[dscrd-hush] <ComputerGenie - MineHush.com> we just need people willing to work
+ who also have the time do it
[dscrd-hush] <ComputerGenie - MineHush.com> has 19 projects in various states of completion all going on currently


How do you like Givology? For any general questions, concerns, technical issues, or anything else, please use the form below. Our team will be in touch shortly! Whether you want more information or would like to collaborate with us on a fundraiser or an event, we're excited to have you join our network.
If you are interested in becoming a field partner please visit our Apply to be a Partner page.
If you are interested in contributing your time to the Givology team, please visit our Get Involved Portal to find out next steps.
We aim to reply to your inquiry within 3-5 business days.
{% if messagesent %}
Message Sent!
{% endif %}


{{ partial "header-en-page" . }}
Chlorophyll is an essential pigment for plant life. It is a complex chemical compound which allows the absorption of light in the green spectrum wavelength. This light energy is used in the metabolic process known as photosynthesis, which is how plants are able to create sugar from carbon dioxide and water.
In order for plants to synthesize chlorophyll, an amino acid known as glutamic acid is required. By SAPUTRA Nutrient which contains glutamic acid, we are able to enhance chlorophyll production in the plants and thus, have greener, healthier plants.
Fatty acids are an essential ingredient in the formation of the cell membrane structure. They are present in the form of phospholipids which make up majority of the structure, and cholesterol which is necessary for membrane fluidity. However, the specific forms of fatty acids needed to form the membrane can only be synthesized by the cell in the presence of acetyl Co Enzyme A (acetyl CoA), which is also an intermediate product of cell respiration.
Since SAPUTRA Nutrient (SN) contains fatty acids, giving SN to the plants would be a beneficial way of providing them with the materials to increase metabolism efficiency and help the plant cells to be healthier and structurally sound.
Acetyl Co Enzyme A is an intermediate product between carbohydrates and fatty acids. It is also an essential component in respiration, being carboxylized and broken down to release CO2 from cells.
Acetyl CoA is present in SN in order to allow the formation of more carbohydrates and fatty acids, also to increase respiration efficiency.
All living things cannot fulfil their own an essential nutritional needs, therefore why living things have to eat.
The cycle is illustrates that the process of forming essential nutrient takes place in nature.
With technology SAPUTRA, the forming of essential nutrient is producing on an industrial scale by SGH.
Each package has 2 compartments separating brown (powder) and white powder (crystal). The essential nutrient contained in the package will be formed when the two substances are mixed and must be applied no later than 2 days.
| 6 Kg/Ha | Spray on the plants every week during Vegetative Phase. |
| 2 Bottle (400 gram)/Ha | Spray on the plants every week during Generative Phase. |


{{ partial "summary.html" . }}
{{ partial "experience.html" . }}
{{ partial "projects.html" . }}
{{ partial "projects_open_source.html" . }}
{{ partial "contributions.html" . }}
{{ partial "sidebar.html" . }}
{{ partial "social.html" . }}


 The longer you subcribe the more you save. canonical_url: 'https://www.icanread.io/en/pricing.html' pricing_table: - name: Month price: R199 period: month description: You pay monthly and can cancel your subscription at any time. - name: 6 months price: R990 period: 6 months description: You pay for 6 months and save R204 as compared to the monthly price - name: 1 year price: R1749 period: year description: You get IcanRead for a full year for just R1749. You save R639 compared with the monthly price. faq: - question: What types of payment do you accept? answer: Card payment including MasterCard, Visa or American Express. We also accept Google pay and Apple pay. Payments are done automatically at the beginning of a new subscription period. - question: Can I cancel my subscription? answer: Yes, you can cancel your subscription at any time. No questions asked. - question: Questions? answer: Contact us for any further questions at<EMAIL_ADDRESS>---
{{ item.question }}
{{ item.answer }}


{% extends 'base.html' %} {% block content %} {% load static %} {#
Your username and password didn't match.Please try again!
Username:
Password:


Welcome to the /r/Seattle reddit comment explorer!
Check out the Flask app to test a comment you're about to make or view word cloud visualizations above.
About this project:
Scores above/below +/- 10
6:1 ratio of upvoted:downvoted
Built by Ryan Murray
GitHub Repo


We are a fast-growing team with substantial experience in blockchain, trading, and engineering.
We commit to building a safe and instant trading experience for your digital assets.
Our Team
CEO & CoFounder
CTO & CoFounder
Lead Engineer & CoFounder
Lead Trading Platform
Trading Analyst / Developer
Head Of Business Development
Designer
Developer
Developer
Developer
Developer
Developer
Developer
Developer
Our Advisors
Executive Advisor
Advisor
Executive Advisor
Advisor
Advisor
Advisor
Advisor


Welcome! John Patrick Agduma
Male:        Female:
From:              To:
From:              To:
From:              To:


Publish zip files to Amazon Web Service Elastic Beanstalk Applications.
Plugin Information |
|---|
View AWS Elastic Beanstalk Publisher on the plugin site for more information. |
The current version of this plugin may not be safe to use. Please review the following warnings before use:
Amazon Web Services Elastic Beanstalk Publisher
Master status:
This plugin allows for publishing to an Elastic Beanstalk application as either a Build or Post Build step.
Amazon credentials are set in the global configuration.
IAM credentials need to be able to read and upload to S3, and to read and configure Elastic Beanstalk.
Example Credentials
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticbeanstalk:*", "s3:*" ], "Resource": "*" } ] }
After adding the Access Key ID and Secret Key in to the Jenkins master configuration, click Advanced and choose a region to see what applications your credentials actually see.
Screenshot:
Global Configuration
Job Configuration
Updates
-> 1.0
- Multithreading the update environment process, in case there are multiple environments to be updated.
- Added test buttons to see which applications your credentials can see, both in the global and job config.
- Added a test button to see currently available environment names for the given application.
- Verify that environment completed updating.
- Bug fixes regarding duplicate AWS credentials.
Attribution
This is a fork of Aldrin Leal's Elastic Beanstalk Deployment plugin


About
Neighborhoods
Concept Projection
Co-occurrences
word list selection
word list:
horizontal axis
embedding:
concept:
vertical axis
embedding:
concept:


2 Chronicles 34:18
Then Shaphan the scribe told the king, saying, Hilkiah the priest hath given me a book. And Shaphan read it before the king.


José Mourinho rules out signing Ibrahimovic at Tottenham Hotspur – video
'Not everyone has the privilege to be a Champions League winner,' said José Mourinho before Tottenham's game against Olympiakos on Tuesday. Mourinho will be taking charge of his side in the competition for the first time. During a press conference the 56-year-old was asked about his relationship with Zlatan Ibrahimovic, a player he deeply admires who is currently a free agent. Mourinho said 'you are right about the connection ... but I would say no chance'


Telecom Italia aims to sell stake in Vodafone Italian tower tie-up: CEO
BARCELONA (Reuters) - Telecom Italia (TIM) plans to sell a stake in the mobile mast business it is creating in Italy with rival Vodafone to infrastructure funds, the Italian group’s chief executive said on Thursday.
The two companies agreed in July to merge their Italian mobile assets under the INWIT business that is currently 60%-owned by TIM. The deal is awaiting European Union antitrust approval and is expected to wrap up in the first half of 2020, INWIT’s chief executive said last week.
After the deal, TIM and Vodafone will each have 37.5% stakes in the enlarged INWIT, but have agreed they can jointly reduce their respective holdings to a minimum of 25%.
“We would like to sell a stake to infrastructure funds,” TIM Chief Executive Luigi Gubitosi told the Morgan Stanley European Technology Media and Telecoms conference in Barcelona.
Due to currently low returns on bond markets, “there is a large pool of investment moving to alternative investment, so infrastructure funds have plenty of money to deploy,” he said.
Communications masts have long been popular among institutional investors because of their steady cash flows.
The deal between Telecom Italia and Vodafone highlights increasing appetite among operators to share or sell parts of their infrastructure to help cut debt and free up cash for investment in the roll-out of next generation 5G networks.


The Preview menu offers commands to show and manipulate the preview window:
|
Close the preview window | |
|
Show the preview in a split window | |
|
Show the preview in a tabbed window | |
|
Set zoom where one bitmap pixel = one display pixel | |
|
Zoom the bitmap to just fit horizontally and/or vertically | |
|
Increase magnification | |
|
Decrease magnification | |
|
Use a white background for transparent and semi-transparent pixels | |
|
Use a black background for transparent and semi-transparent pixels | |
|
Use a checkerboard background to best see partially transparent pixels | |
|
Use the default window background color (typically light gray) | |
|
|
|


Sign in
to continue to
Username
Sign in
No account ? Register
Sign in with fingerprint, device or security key


Seksyen 13, PJ
RM6,000 - RM7,000
-
Responsibilities:
-
Develop highly innovative and intuitive web & mobile applications for financial services industry
-
Participate in delivery lifecycle – analyze, design, build, deploy, test, release & support
-
Produce technical design and responsible for key / complex development tasks
-
Ensure all codes produced are fit for purpose and meet the expected quality
- Undertake critical tasks required by project execution as necessary
- Provide mentoring and leadership for junior team members
- Intensive collaboration with UX & UI Designers to realize design into functional application
- Ensure deliverables adhere to organization’s development guidelines & standards
- Ensure timely completion of tasks assigned
-
Requirements:
- Result-oriented team player that is passionate about self-improvement and quality of work
-
Have intense interest and proven track record in enterprise application development using current mobile / cross-platform / native technologies
-
Degree in Computer Science / Software Engineering or equivalent
-
At least 3 years of working experience in web / mobile application development
- Highly proficient in Bootstrap or other major responsive web design framework
- Extensive experience in web technologies (E.g. Angular, Vue.js, Node.js, XML, CSS Preprocessor (SAAS), HTML5, RESTful API, etc.)
- Broad understanding about SDLC processes and methodologies
- Cross-platform / native application development experience is a strong plus
- Server-side programming experience using Java and SQL is a strong plus
- Domain knowledge in financial industry is a strong plus
- Highly independent, strong self-initiative, keen learner with leadership qualities
- Proficient in English with good communication and interpersonal skills
- Willing to travel and accept overseas assignment


Module Editors can clear cached files from an album of the Gallery module. This synchronizes the gallery and updates any album or file changes which have been made outside of the normal gallery user interface, or if the physical location of the gallery is changed.
Option One:
Clearing the cache
Option Two:


-
On The Road | Yahoo Screen Live
screen.yahoo.com
Yahoo On the Road 2014 is the second annual cross country roadtrip inspiring and entraining music fans worldwide by providing access to some of ...
-
Fish and Wildlife Department Using 'Salmon Cannon' to Move Fish Upriver
news.yahoo.com
Say goodbye to the lazy river. Salmon now have a cannon! Sounds fishy, but it's true. Whooshh Innovations, a Bellevue, Wash.-based company, has ...
-
Prices at the pump head below $3 in much of US
news.yahoo.com
NEW YORK (AP) — The price of a gallon of gasoline may soon start with a "2'' across much the country.
-
Three 9/11 firefighters die of cancer in one day
news.yahoo.com
New York (AFP) - Three New York firefighters who worked at the World Trade Center ruins after the September 11 attacks died within hours of each ...
-
Philipp Hofmann had the most unfortunate miss you will see right now
sports.yahoo.com
This is how you miss from right in front of an open net.
-
88-year-old whose Olive Garden review went viral goes to Applebee's
news.yahoo.com
Marilyn Hagerty, the 88-year-old columnist who became an Internet sensation after her adorably earnest review of a local Olive Garden for the Grand ...
-
Nuremberg stenographer's mementos to be auctioned
news.yahoo.com
ANCHORAGE, Alaska (AP) — The old trunk was locked when it was found by auction house workers clearing a long-vacant home that was about to be listed ...
-
Derek Jeter's first autograph — a ball signed at age 8 —goes up for auction
sports.yahoo.com
Signature isn't verified, but Jeter implies it's probably legit
-
And then there were two. With Holder’s resignation, just two Obama ...
www.washingtonpost.com
Just two original Obama Cabinet members will remain after Holder is gone.
-
'Curved. Not bent’: Rivals mock Apple’s iPhone #bendgate
news.yahoo.com
Apple's smartphone rivals have taken to Twitter to mock the so-called "bendgate" surrounding the iPhone 6 Plus after customers complained that the ...
-
UAE's 1st female fighter pilot carried out strikes
news.yahoo.com
DUBAI, United Arab Emirates (AP) — The first female air force pilot in the United Arab Emirates led airstrikes against Islamic State militants in ...
-
CNNMoney - Business, financial and personal finance news
money.cnn.com
Get the latest news on global business and market trends from the international section of CNNMoney, the world's largest business website.
-
CBS analyst Simms stays away from 'Redskins'
sports.yahoo.com
NEW YORK (AP) — CBS lead analyst Phil Simms referred awkwardly to "the Washington team" early in the Redskins' nationally televised game against the ...
-
U.S. has no evidence of any Islamic State plot against subways: sources
news.yahoo.com
WASHINGTON (Reuters) - The United States has no evidence to back up an Iraqi claim that Islamic State forces were plotting to attack U.S. subway ...
-
Obama urges world to do more to tackle Ebola
news.yahoo.com
UNITED NATIONS (AP) — President Barack Obama, in a sober assessment of international efforts to stem a deadly Ebola outbreak, warned a high-level ...
-
ABC News LIVE Coverage
news.yahoo.com
Watch the video ABC News LIVE Coverage on Yahoo News . Live coverage from ABC News
-
Holder resigning: Attorney general backed rights
news.yahoo.com
WASHINGTON (AP) — Eric Holder, America's first black attorney general and an unflinching champion of civil rights in enforcing the nation's laws, ...
-
Thailand to install cameras after tourist murders
news.yahoo.com
BANGKOK (AP) — Thailand will install more surveillance cameras and better lighting in major tourist areas after two British tourists were killed last ...
-
Baby Gorilla Clings to Humans After Mother Rejects Her
gma.yahoo.com
Baby Ape Finds New Home at Cincinnati Zoo
-
Man who raised $55K is throwing potato salad party
news.yahoo.com
COLUMBUS, Ohio (AP) — A man who jokingly sought $10 from a crowdfunding website to pay for his first attempt at making potato salad and ended up ...
-
Key report in Michael Brown shooting doesn't exist, Ferguson police say
news.yahoo.com
Police in Ferguson, Mo., have violated their own standards since last month’s controversial fatal shooting of Michael Brown by Officer Darren Wilson.
-
Visit The World's Deepest Swimming Pool | Broken News Daily - Yahoo Screen
screen.yahoo.com
Y-40 The Deep Joy, located inside the Hotel Terme Millepini in Italy, is 130-feet deep, and holds over 1.1 million gallons of thermally heated spa ...
-
ESPN suspends Bill Simmons for podcast calling Roger Goodell a 'liar'
sports.yahoo.com
ESPN has muzzled Bill Simmons for three weeks for remarks made on Simmons' podcast.
-
Suspect captured, but UVa student still missing
news.yahoo.com
GALVESTON, Texas (AP) — A man charged with abducting a missing University of Virginia sophomore has been captured in Texas and is awaiting ...
-
Several Nobel peace winners boycott South Africa
news.yahoo.com
JOHANNESBURG (AP) — Several Nobel peace laureates will skip an annual meeting in Cape Town because the Dalai Lama has not received a visa to travel ...
-
Why didn’t the original 12 amendments make it into the Bill of Rights?
news.yahoo.com
It’s a big day in American history as September 25 marks the moment that Congress approved a Bill of Rights with 12 amendments to the Constitution. ...
-
Apple admits to ruining your new iPhone 6, says iOS 8.0.2 is coming soon
news.yahoo.com
Trying to fix some of the existing issues in iOS 8, Apple on Wednesday released a fast iOS 8.0.1 update that came with some unexpected surprises: ...
-
Hundreds rescued from stricken boat off Cyprus
news.yahoo.com
NICOSIA (Reuters) - Cypriot authorities on Thursday rescued hundreds of migrants, most of them women and children, after their boat hit rough seas ...
-
Sierra Leone quarantines one million ahead of UN Ebola talks
news.yahoo.com
Freetown (AFP) - Sierra Leone began a quarantine of more than one million people Thursday in the largest open-ended lockdown in the Ebola outbreak, ...


Migrating to Hugo
Using Sapper and Strapi
Currently I am in the process of converting my blog to a Sapper blog that will be statically exported to Netlify. The local headless CMS was built using Strapi. The tutorial I followed for this was pretty straight forward.
There are two small things I’d add though.
For one Strapi uses markdown and Sapper is going to render in html. I’d download the “marked” package and import it into in svelte file that will require markdown conversion.
npm install marked
For the [slug].svelte file in the articles folder of the tutorial, at the head of the document you’d add:
import marked from 'marked';
From there, you’d simply have the “marked” function take in the body of your posts as the parameter:
{#each post as post}

{post.Title}

{moment().to(post.Published)} by {post.author.username}

{@html marked(post.Body)}

{/each}
Besides this my main blog is now on Hugo. I decided to use the codex them for now. I’ll probably tweak it as time goes on.


|
SWING COPTERS 2 Flying is now a serious business. Join us at Copters Inc. Genre: Arcade Rate: Everyone Release Date: Dec 17, 2015 Developer: Gamlr Team |
|
|
|
|
|
|
|
|
|
Spinki Falling and Fabi Crasher have been friends since primary school.  But as adults, they need to do something for a living. And that's where our story began... |
|
Spinki Spinki is well known for his talent in Copters. He's the best pilot in the company. However, he is very shy and quiet. Full Name: Spinki Falling Title: Co-Founder and CEO of Copters Inc. Education: Graduated from R.A.A. (Royal Aeronautical Academy) Zodiac Sign: Scorpion Hobbies: Unknown Bloodtype: B Fabi Fabi helped Spinki a lot in running Copters Inc. Even so, people rarely see him fly. Talkativeness is what describes Fabi the best. Full Name: Fabi Crasher Title: Co-Founder and Company Secretary Education: Not graduated Zodiac Sign: Gemini Hobbies: Singing and dancing Bloodtype: A Pinki Pinki is the only female pilot in the company. She is independent and ambitious. Rumour says she joined Copters Inc. only to get along with the CEO. Full Name: Pinki Jolie Title: Pilots Manager of Copters Inc. Education: Graduated from Aviation Pilot Training Center Zodiac Sign: Unknown Hobbies: Clubbing and sweets Bloodtype: O |
|
|
|
Thank you for playing!
|
|
|
© 2015 Gamlr |


Issue 6439: Consider precision for Console API %f log pattern
Steps to reproduce
- Open Firebug
- Enable and switch to the Console panel
- Type
console.log("amount: %f", 4.3152)
into the Command Line and hit Enter
- Repeat step 3 for
%.2f
, %.1f
, %.0f
and %.5f
Expected result
-
The console output should look like this:
amount: 4.3152
amount: 4.32
amount: 4.3
amount: 4
amount: 4.31520


In Durango, the new mobile MMORPG, players need to either build or gather wild objects for their survival. For example, they can follow the rules below to acquire objects necessary for their survivals:
- They can get one woodstick from nature. (energy 10 needed)
- They can get one reed from nature. (energy 5 needed)
- They can get one rock from nature. (energy 5 needed)
- They can make one wooden stick from one woodstick. (energy 10 needed)
- With one rock, one wooden stick and two reeds, they can make one rock axe. (energy 50 needed)
The total energy needed to make one rock axe is 10 + 10 + 10 + 5 + 50 = 85.
Given all the rules, write a program that tells us in what order what actions should be taken to create a rock axe.
The first line of input has N, the number of rules (1 ≤ N ≤ 50).
Across the next N lines, rules for making tools are given in the form of k m1 c1 m2 c2 ... mk ck E M. This means that k (0 ≤ k ≤ 4) m1,m2, .. mk ingredients use up c1, c2 ... ck (1 ≤ c_i ≤ 10), and spend E energy (1 ≤ E ≤ 100), you can make one M. If k = 0, it means that this tool is possible to collect from nature. M is a 16-long lowercase alphabet sequence. There may be multiple rules for making the same object.
In the given M, there is always a "stoneaxe" and this represents the rock axe.
Output K, the number of steps needed on the first line. This should be less than or equal to 100 but greater than or equal to 1. Across the next K lines, output the process of which rule should be taken how many times.
5 0 10 branch 0 5 reed 0 5 stone 1 branch 1 10 woodstick 3 stone 1 woodstick 1 reed 2 50 stoneaxe
5 2 2 1 1 4 1 3 1 5 1
3 0 8 stone 1 stone 2 1 stone 1 stone 3 3 stoneaxe
2 1 3 3 1
The input cases have 2 types: To get points, you need to have correct outputs for all test cases for one type of input test cases.
- Type 1 (23 marks): There is only one rule for making one tool.
- Type 2 (77 marks): No other restrictions other than the ones listed in the problem.
If there is no error in your ouput, and based off your output you have successfully created one rock axe, then you get half the marks. If it is the minimum amount of energy used, you will get the full amount.


NavigationStack for SwiftUI
NavigationStack is a custom SwiftUI solution for navigating between views. It’s a more flexible alternative to SwiftUI’s own navigation.
Advantages
Advantages of this lib compared to SwiftUI’s NavigationView
/ NavigationLink
and the .sheet
-Modifier:
- Use different transition animations (not only a horizontal push/pop or a vertical present/dismiss)
- Use one of the various transition animations included
- Or create your own custom transition animations
- Navigate even without any transition animation at all if you want
- Define the back transition animation right before transitioning back, not in advance when transitioning forward
- Navigate back multiple screens at once, not only to the previous one
- Use a full-screen present transition also on iOS 13
- Get notified when the transition animation has finished
Transition Examples
Use SwiftUI’s default transitions:
Or use some default view animations for transitioning:
Or write your own custom transitions:
All of these are included in this lib!
Installation
CocoaPods
To include via CocoaPods add to the Podfile
:
pod 'NavStack'
Carthage
To include via Carthage add to the Cartfile
:
github "indieSoftware/NavigationStack"
SPM
To include via SwiftPackageManager add the repository:
https://github.com/indieSoftware/NavigationStack.git
Usage
- Import the lib to your view’s source file.
- Include the
NavigationModel
to your view as an environment object. - Use the
NavigationStackView
as a root stack view of your view and give it a unique name to reference it. Use the
NavigationModel
object to perform any transitions, i.e. a push or pop. Provide theNavigationStackView
‘s identifier to define whichNavigationStackView
in the hierachy should switch its content.import NavigationStack // 1 struct MyRootView: View { @EnvironmentObject var navigationModel: NavigationModel // 2 var body: some View { NavigationStackView("MyRootView") { // 3 Button(action: { navigationModel.pushContent("MyRootView") { // 4 MyDetailView() } }, label: { Text("Push MyDetailView") }) } } }
Because of the reference to the
NavigationModel
instance you need of couse to attach one as an environement object to the view hierachy, e.g. in theSceneDelegate
:func scene(_ scene: UIScene, willConnectTo _: UISceneSession, options _: UIScene.ConnectionOptions) { if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) let myRootView = MyRootView() .environmentObject(NavigationModel()) // 5 window.rootViewController = UIHostingController(rootView: myRootView) self.window = window window.makeKeyAndVisible() } }
That’s all what’s needed!
Additional Information
The NavigationStackView
’s Identifier
Every view which should provide a possibility to transition to a different view needs to contain a NavigationStackView
with a unique identifier.
When a view where you navigated to now wants to navigate back to a specific view, just tell the NavigationModel
to which one to navigate back:
import NavigationStack
struct MyDetailView: View {
@EnvironmentObject var navigationModel: NavigationModel
var body: some View {
Button(action: {
navigationModel.popContent("MyRootView")
}, label: {
Text("Pop to root")
})
}
}
With the NavigationStackView
’s reference identifier you can also navigate back multiple screens at once, just provide the ID of one screen further down the hierarchy.
To avoid hard-coded strings for the NavigationStackView
IDs, just define a static constant in each view which then can be referenced instead.
struct ContentView1: View {
static let id = String(describing: Self.self)
@EnvironmentObject var navigationModel: NavigationModel
var body: some View {
NavigationStackView(ContentView1.id) {
Button(action: {
navigationModel.pushContent(ContentView1.id) {
ContentView2()
}
}, label: {
Text("Push ContentView2")
})
}
}
}
Convenience Navigation Methods
You can also use one of the other model methods which might suit your current situation better, e.g. hideTopViewWithReverseAnimation()
to just transition back to the previous screen with the reverse-animation provided when transitioning to the screen.
There are some convenience methods to express specific transitions more appropriate, e.g. pushContent
, popContent
, presentContent
and dismissContent
. Just look at the documentation for the NavigationModel.
Transition Animations
The convenience navigation methods all rely on the showView(_ identifier:, animation:, alternativeView:)
and hideView(_ identifier:, animation:)
methods which take an animation as argument. The convenience methods use pre-defined navigation animations (e.g. NavigationAnimation
’s push
, pop
, present
and dismiss
). However, you can also create your own transition animations by providing different parameters for the animation curve and the transition types. Then you can use the show and hide methods to create transitions with your own animations:
let myAnimation = NavigationAnimation(
animation: .easeOut,
defaultViewTransition: .static,
alternativeViewTransition: .brightness()
)
navigationModel.hideView("MyRootView", animation: myAnimation)
With “defaultView” the source view is meant, which is the one from which to navigate while “alternativeView” means the destination view, the one where to navigate to. By providing different transitions for both views it’s possible to define one transition animation for the leaving view and a different one for the appearing view.
Important:
For views which shouldn’t animate during a transition, e.g. staying statically visible while the other view does its animation, you have to provide a .static
transition rather than SwiftUI’s .identity
.
A list of all provided transitions by the lib can be found in the lib’s documentation for AnyTransition Extensions.
Custom Transitions
To create own transition animations simply create a custom ViewModifier
and optionally extend AnyTransition
for creating a convenience method:
public struct BrightnessModifier: ViewModifier {
public let amount: Double
public func body(content: Content) -> some View {
content.brightness(amount)
}
}
public extension AnyTransition {
static func brightness(_ amount: Double = 1) -> AnyTransition {
.modifier(active: BrightnessModifier(amount: amount), identity: BrightnessModifier(amount: 0))
}
}
Important Please keep in mind that SwiftUI will only animate transitions if a value changes, e.g. when providing a brightness transition with a brighness value of 0 you won’t see any animation and the transition for that view gets skipped. That’s because the identity has also a brightness value of 0 and thus both states, the identity and the active state, are equal.
For further information, please look at the lib’s API documentation: https://indiesoftware.github.io/NavigationStack
OnDidAppear
To get informed when a transition animation for a view has completed use the onDidAppear
modifier. However, this only works when there is really an animation executed with the transition and when showing and hiding views via the NavigationModel
, not via SwiftUI’s NavigationView/Link
.
struct ContentView1: View {
static let id = String(describing: Self.self)
@EnvironmentObject var navigationModel: NavigationModel
var body: some View {
NavigationStackView(ContentView1.id) {
Button(action: {
navigationModel.pushContent(ContentView1.id) {
ContentView2()
.onDidAppear {
print("ContentView2 did appear")
}
}
}, label: {
Text("Push ContentView2")
})
.onDidAppear {
print("ContentView1 did appear")
}
}
}
}
Don’t use onAppear
because that won’t work anymore as expected. See the chapter “known limitations” at the bottom for more information.
To get generally informed when an animation has finished use the onAnimationCompleted
modifier. This works independently from the NavigationModel
and the lib’s transitions, but you have to execute withAnimation
by yourself and thus is not usable with the NavigationModel
’s transitions.
See View Extensions for more information.
Example Code
The project includes an example target (NavigationStackExample
) which shows how to use the library. Just clone the repo, open the workspace and switch to the same named scheme. The example app shows how to push multiple views, how to pop back even directly to the root, how to simulate a modal presentation and shows the different transition animations available out-of-the-box. The example views are well commented and provided in the Sources/NavigationStackExample/ExampleViews
group.
You can also run the example’s UI tests to run sepcific or all transitions automatically.
The example project includes some experiments where each describes a problem or the attempt to solve a problem. They are kind of a documentation how to solve some strange behaviors of SwiftUI. They are not important for users of the library, but maybe for those who want to understand and improve it. So, feel free to skip these. However, to run the experiments simply pass the experiment’s name in the scheme as launch agrument, i.e. “Experiment1” to run Experiment1.swift
.
Known limitations
Manual full-screen
NavigationStackView
is just another stack view. What you put into this stack view is up to you, however, you should make the content fill out the whole screen. Otherwise you might risk to trigger sub-view transitions, but even if not so it might look kind of awkward when the screen’s transition is not full-screen.
No sub-view transitions
Technically you are not forced to add the NavigationStackView
to the root level of your view’s body. Even when added to the root of your custom view you might also add this custom view as a sub-view to a bigger view. This is actually unproblematic as long as the views are full-screen.
However, when the views to navigate to are not full-screen the user might transition from one screen which already has transitioned to a different view. And that might lead to problems, because the lib uses a linear stack to keep the navigation transitions. When trying to branch off from the middle of the stack then this won’t work as expected.
There is a SubviewExample
in the examples and a SubviewExampleTests
to show this problem.
No real modal
SwiftUI’s sheet
modifier actually triggers a real modal transition. This lib doesn’t do this, instead the NavigationStackView
relies on a single-page architecture, meaning there is always only a single view visible, but its content will be replaced when transitioning. I’m not sure if this is really a limitation but it’s something to keep in mind.
OnAppear doesn’t work
For all views managed by the NavigationStackView
the SwiftUI’s view modifier onAppear
doesn’t work anymore as expected. onAppear
now will be triggered multiple times and even when the view is not appearing, but disappearing. This is because of how NavigationStackView
internally exchanges the subviews. Therefore, don’t use onAppear
anymore, however, this modifier shouldn’t be necessary anymore because you can call the code in onAppear
directly when you also call show
on the NavigationModel
.
Trouble shooting
ObservableObject not injected
Fatal error: No ObservableObject of type NavigationModel found. A View.environmentObject(_:) for NavigationModel may be missing as an ancestor of this view.
Add a navigation model to the view hierarchy, e.g. MyRootView().environmentObject(NavigationModel())
.
View replacement not supported
Replacing showing navigation view 'XXX’ not allowed
This error is thrown when trying to replace a current detail view with another detail view without first navigating back. Let’s say you have an overview A and you are navigating to a detail view B and from detail view B you now try to replace view B with view C by telling view A to navigate to view C while it still shows view B. That doesn’t work and leads to that exception.
Normally you want to navigate from view B to view C therefore you should tell view B rather than view A to show view C. That would then lead to a view hierarchy A-B-C.
If you really want to end with a view hierarchy like A-C then you have first to tell view A to dismiss view B before telling it to show view C.
Changelog
See Changelog.md


@(project: models.Project.Key, name: String)
The project @project does not contains a bundle named @name. Verify your url or use the the "New" link above to create it.


|
TeamSpeak Interface Client
1.0.4 Beta
|
Public Member Functions | |
| setInstanceID (int $instance_id) | |
| setServerID (int $server_id) | |
| setUID (string $unique_id) | |
| setServerName (string $name) | |
| setOnline ($status) | |
| setPlatform (string $platform) | |
| setVersion (string $version) | |
| setMaxClients (int $maxclients) | |
| setClientsOnline (int $clientsonline) | |
| setChannelOnline (int $channelsonline) | |
| setCreatedTime (int $createdtime) | |
| setUptime (int $uptime) | |
| setProperties (TSI_Properties $properties) | |
| getInstanceID () | |
| getServerID () | |
| getUID () | |
| getServerName () | |
| getOnline () | |
| getPlatform () | |
| getVersion () | |
| getMaxClients () | |
| getClientsOnline () | |
| getChannelOnline () | |
| getCreatedTime () | |
| getUptime () | |
| getProperties () | |
| isTeaSpeak () | |
| getChannelOnline | ( | ) |
Implemented in TSI_VServer.
| getClientsOnline | ( | ) |
Implemented in TSI_VServer.
| getCreatedTime | ( | ) |
Implemented in TSI_VServer.
| getInstanceID | ( | ) |
Implemented in TSI_VServer.
| getMaxClients | ( | ) |
Implemented in TSI_VServer.
| getOnline | ( | ) |
Implemented in TSI_VServer.
| getPlatform | ( | ) |
Implemented in TSI_VServer.
| getProperties | ( | ) |
Implemented in TSI_VServer.
| getServerID | ( | ) |
Implemented in TSI_VServer.
| getServerName | ( | ) |
Implemented in TSI_VServer.
| getUID | ( | ) |
Implemented in TSI_VServer.
| getUptime | ( | ) |
Implemented in TSI_VServer.
| getVersion | ( | ) |
Implemented in TSI_VServer.
| isTeaSpeak | ( | ) |
Implemented in TSI_VServer.
| setChannelOnline | ( | int | $channelsonline | ) |
Implemented in TSI_VServer.
| setClientsOnline | ( | int | $clientsonline | ) |
Implemented in TSI_VServer.
| setCreatedTime | ( | int | $createdtime | ) |
Implemented in TSI_VServer.
| setInstanceID | ( | int | $instance_id | ) |
Implemented in TSI_VServer.
| setMaxClients | ( | int | $maxclients | ) |
Implemented in TSI_VServer.
| setOnline | ( | $status | ) |
Implemented in TSI_VServer.
| setPlatform | ( | string | $platform | ) |
Implemented in TSI_VServer.
| setProperties | ( | TSI_Properties | $properties | ) |
Implemented in TSI_VServer.
| setServerID | ( | int | $server_id | ) |
Implemented in TSI_VServer.
| setServerName | ( | string | $name | ) |
Implemented in TSI_VServer.
| setUID | ( | string | $unique_id | ) |
Implemented in TSI_VServer.
| setUptime | ( | int | $uptime | ) |
Implemented in TSI_VServer.
| setVersion | ( | string | $version | ) |
Implemented in TSI_VServer.


|
Tuesdays with Morrie
Mitch Albom
Doubleday & Company, Incorporated |
This document is overwritten when you make changes in Play Books.
You should make a copy of this document before you edit it. |
1 note/highlight
Created by Tarang Shah – Last synced May 21, 2016
Tuesdays with Morrie: an old man, a young man, and life’s greatest lesson by Mitch Albom
|
The culture we have does not make people feel good about themselves. And you have to be strong enough to say if the culture doesn’t work, don’t buy it.
May 21, 2016 |
30 |
|


August 20, 2014 Sailing and cycling along the Greek islands is the way to experience Greece READ MORE »