| Elliott Sound Products | AN-001 |
Precision Rectifiers
Rod Elliott
(ESP)
To be able to understand much of the following, the basic rules of opamps need to be firmly embedded in the skull of the reader. I came up with these many years ago, and - ignoring small errors caused by finite gain, input and output impedances - all opamp circuits make sense once these rules are understood. They are also discussed in the article Designing With Opamps in somewhat greater detail. Highly recommended if you are in the least bit unsure.
The two rules are as follows ...
- An opamp will attempt to make both inputs exactly the same voltage (via the feedback path)
- If it cannot achieve #1, the output will assume the polarity of the most positive input
These two rules describe everything an opamp does in any circuit, with no exceptions ... provided that the opamp is operating within its normal parameters. This means power supply voltage(s) must be within specifications, signal voltage is within the allowable range, and load impedance is equal to or greater than the minimum specified. The signal frequency must also be low enough to ensure that the opamp can perform normally for the chosen gain. For most cheap opamps, a gain of 100 with a frequency of 1kHz should be considered the maximum allowable, since the opamp's open loop gain may not be high enough to accommodate higher gain or frequency.
Armed with these rules and a basic understanding of Ohm's Law and analogue circuitry, it is possible to figure out what any opamp circuit will do under all normal operating conditions. Needless to say, the rules no longer apply if the opamp itself is faulty, or is operating outside its normal parameters (as discussed briefly above).
There are many applications for precision rectifiers, and while most are suitable for use in audio circuits, I thought it best to make this the first ESP Application Note. While some of the existing projects in the audio section have a rather tenuous link to audio, this information is more likely to be used for instrumentation purposes than pure audio applications.
Typically, the precision rectifier is not commonly used to drive analogue meter movements, as there are usually much simpler methods to drive floating loads such as meters. Precision rectifiers are more common where there is some degree of post processing needed, feeding the side chain of compressors and limiters, or to drive digital meters.
There are several different types of precision rectifier, but before we look any further, it is necessary to explain what a precision rectifier actually is. In its simplest form, a half wave precision rectifier is implemented using an opamp, and includes the diode in the feedback loop. This effectively cancels the forward voltage drop of the diode, so very low level signals (well below the diode's forward voltage) can still be rectified with minimal error.
The most basic form is shown in Figure 1, and while it does work, it has some serious limitations. The main one is speed - it will not work well with high frequency signals. To understand the reason, we need to examine the circuit closely. This knowledge applies to all subsequent circuits, and explains the reason for the apparent complexity.
Figure 1 - Basic Precision Half Wave Rectifier
For a low frequency positive input signal, 100% negative feedback is applied when the diode conducts. The forward voltage is effectively removed by the feedback, and the inverting input follows the positive half of the input signal almost perfectly. When the input signal becomes negative, the opamp has no feedback at all, so the output pin of the opamp swings negative as far as it can. Assuming 15V supplies, that means perhaps -14V on the opamp output.
When the input signal becomes positive again, the opamp's output voltage will take a finite time to swing back to zero, then to forward bias the diode and produce an output. This time is determined by the opamp's slew rate, and even a very fast opamp will be limited to low frequencies - especially for low input levels. The test voltage for the waveforms shown was 20mV at 1kHz. Although the circuit does work very well, it is limited to relatively low frequencies (less than 10kHz) and only becomes acceptably linear above 10mV or so (opamp dependent).
Note the oscillation at the rectified output. This is (more or less) real, and was confirmed with an actual (as opposed to simulated) circuit. This is the result of the opamp becoming open-loop with negative inputs. In most cases it is not actually a problem.
Figure 2 - Rectified Output and Opamp Output
Figure 2 shows the output waveform (left) and the waveform at the opamp output (right). The recovery time is obvious on the rectified signal, but the real source of the problem is quite apparent from the huge voltage swing before the diode. While this is of little consequence for high level signals, it causes considerable nonlinearity for low levels, such as the 20mV signal used in these examples.
The circuit is improved by reconfiguration, as shown in Figure 3. The additional diode prevents the opamp's output from swinging to the negative supply rail, and low level linearity is improved dramatically. A 2mV (peak) signal is rectified with reasonably good linearity. Although the opamp still operates open-loop at the point where the input swings from positive to negative or vice versa, the range is limited by the diode and resistor. Recovery is therefore a great deal faster.
Figure 3 - Improved Precision Half Wave Rectifier
This circuit also has its limitations. The input impedance is now determined by the input resistor, and of course it is more complicated than the basic version. It must be driven from a low impedance source. Not quite as apparent, the Figure 3 circuit also has a defined output load resistance (equal to R2), so if this circuit were to be used for charging a capacitor, the cap will discharge through R2. Although it would seem that the same problem exists with the simple version as well, R2 (in Figure 1) can actually be omitted, thus preventing capacitor discharge. Likewise, the input resistor (R1) shown in Figure 1 is also optional, and is needed only if there is no DC path to ground.
Figure 4 shows the standard full wave version of the precision rectifier. This circuit is very common, and is pretty much the textbook version. It has been around for a very long time now, and I would include a reference to it if I knew where it originated. The tolerance of R1, 2, 3, 4 and 5 are critical for good performance, and all five resistors should be 1% or better. Note that the diodes are connected to obtain a positive rectified signal. The second stage inverts the signal polarity. To obtain improved high frequency response, the resistor values should be reduced.
Figure 4 - Precision Full Wave Rectifier
This circuit is sensitive to source impedance, so it is important to ensure that it is driven from a low impedance, such as an opamp buffer stage. Input impedance as shown is 6.66k, and any additional series resistance at the input will cause errors in the output signal. The input impedance is linear. As shown, and using TL072 opamps, the circuit of Figure 4 has good linearity down to a couple of mV at low frequencies, but has a limited high frequency response. Use of high speed diodes, lower resistance values and faster opamps is recommended if you need greater sensitivity and/ or higher frequencies.
A little known variation of the full wave rectifier was published by Analog Devices, in Application Brief AB-109 [ 1 ]. In the original, a JFET was used as the rectifier for D2, although this is not necessary if a small amount of low level non-linearity is acceptable. The resistors marked with an asterisk (*) should be matched, although for normal use 1% tolerance will be acceptable. C1 may be needed to prevent oscillation.
Figure 5 - Original Analog Devices Circuit
It was pointed out in the original application note that the forward voltage drop for D2 (the FET) must be less than that for D1, although no reason was given. As it turns out, this may make a difference for very low level signals, but appears to make little or no difference for sensible levels (above 20mV or so).
For most applications, the circuit shown in Figure 6 will be more than acceptable. Linearity is very good at 20mV, but speed is still limited by the opamp. To obtain the best high frequency performance use a very fast opamp and reduce the resistor values.
Figure 6 - Simplified Version of the AD Circuit
It is virtually impossible to make a full wave precision rectifier any simpler, and the circuit shown will satisfy the majority of low frequency applications. Where very low levels are to be rectified, it is recommended that the signal be amplified first. While the use of Schottky (or germanium) diodes will improve low level and/or high frequency performance, it is unreasonable to expect perfect linearity from any rectifier circuit at extremely low levels. Operation up to 100kHz or more is possible by using fast opamps and diodes. R1 is optional, and is only needed if the source is AC coupled, so extremely high input impedance (with no non-linearity) is possible. C1 may be needed to prevent oscillation.
The simplified version shown above (Figure 6) is also found in a Burr-Brown application note [ 3 ].
Purely by chance, I found the following variant in a phase meter circuit. This version is used in older SSL (Solid Stage Logic) mixers, as part of the phase correlation meter. This circuit exists on the Net in a few forum posts and what appears to be one unauthorised site where several SSL schematics are re-published. The original drawing I found is dated 1984. It's also referenced in a Burr-Brown paper from 1973 and an electronics engineering textbook [ 5, 6 ].
Figure 6A - Another Version of the AD Circuit
While it initially looks completely different, that's simply because of the way it's drawn (I copied the drawing layout of the original). This version is interesting, in that the input is not only inverting, but provides the opportunity for the rectifier to have gain. The inverting input is of no consequence (it is a full wave rectifier after all), but it does mean that the input impedance is lower than normal ... although you could make all resistor values higher of course. Input impedance is equal to the value of R1, and is linear as long as the opamp is working well within its limits.
If R1 is made lower than R2 and R3, the circuit has gain. If R1 is higher than R2 and R3, the circuit can accept higher input voltages because it acts as an attenuator. For example, if R1 is 1k, the circuit has a gain of 10, and if 100k, the gain is 0.1 (an attenuation of 10). All normal opamp restrictions apply, so if a high gain is used frequency response will be affected. C1 is optional - you may need to include it if the circuit oscillates. The value will normally be between 10pF and 100pF, depending on the speed you need and circuit layout.
One interesting result of using the inverting topology is that the input node is a 'virtual earth' and it enables the circuit to sum multiple inputs. R1 can be duplicated to give another input, and this can be extended. The original SSL circuit used two of these rectifiers with four inputs each. Remember that this is the same as operating the first opamp with a gain of four, so high frequency response may be affected.
A simple precision rectifier circuit was published by Intersil [ 2 ]. This is an interesting variation, because it uses a single supply opamp but still gives full-wave rectification, with both input and output earth (ground) referenced. Unfortunately, the specified opamp is not especially common, although other devices could be used. The CA3140 is a reasonably fast opamp, having a slew rate of 7V/us. I will leave it to the reader to determine suitable types (other than that suggested below). The essential features are that the two inputs must be able to operate at below zero volts (typically -0.5V), and the output must also include close to zero volts.
Figure 7 - Original Intersil Precision Rectifier Circuit
During the positive cycle of the input, the signal is directly fed through the feedback network to the output. R3 actually consists of R3 itself, plus the set value of VR2. The nominal value of the pair is 15k, and VR2 can be usually be dispensed with if precision resistors are used (R3 and VR2 are replaced by a single 15k resistor).
This gives a transfer function of ...
Gain = 1 / ( 1 + (( R1 + R2 ) / R3 )) ... 0.5 with the values shown above
1V input will therefore give an output voltage of 0.5V. During this positive half-cycle of the input, the diode disconnects the op-amp output, which is at (or near) zero volts. Note that the application note shows a different gain equation which is incorrect. The equation shown above works.
During a negative half-cycle of the input signal, the CA3140 functions as a normal inverting amplifier with a gain equal to -( R2 / R1 ) ... 0.5 as shown. Since the inverting input is a virtual earth point, during a negative input it remains at or very near to zero volts. When the two gain equations are equal, the full wave output is symmetrical. Note that the output is not buffered, so the output should be connected only to high impedance stage, with an impedance much higher than R3.
Figure 8 - Modified Intersil Circuit Using Common Opamp
Where a simple, low output impedance precision rectifier is needed for low frequency signals (up to perhaps 10kHz as an upper limit), the simplified version above will do the job nicely. It does require an input voltage of at least 100mV, because there is no DC offset compensation. Because the LM358 is a dual opamp, the second half can be used as a buffer, providing a low output impedance. Minimum suggested input voltage is around 1V peak (710mV), which will give an average output voltage of 320mV. Higher input voltages will provide greater accuracy, but the maximum is a little under 10V RMS with a 15V DC supply as shown. The LM358 is not especially fast, but is readily available at low cost.
Limitations: Note that the input impedance of this rectifier topology is non-linear. The impedance presented to the driving circuit is 30k for positive half cycles, but only 10k for negative half-cycles. This means that it must be driven from a low impedance source - typically another opamp. This increases the overall complexity of the final circuit.
An interesting variation was shown in a Burr-Brown application note [ 3 ]. This rectifier operates from a single supply, but accepts a normal earth (ground) referenced AC input. The only restriction is that the incoming peak AC signal must be below the supply voltage (typically +5V for the OPA2337 or OPA2340). The opamps used must be rail-to-rail, and the inputs must also accept a zero volt signal without causing the opamp to lose control.
The circuit is interesting for a number of reasons, not the least being that it uses a completely different approach from most of the others shown. The rectifier is not in the main feedback loop like all the others shown, but uses an ideal diode (created by U1B and D1) at the non-inverting input, and this is outside the feedback loop.
Figure 9 - Burr-Brown Circuit Using Suggested Opamp
For a positive-going input signal, the opamp (U1A) can only function as a unity gain buffer, since both inputs are driven positive. Both the non-inverting and inverting inputs have an identical signal, a condition that can only be achieved if the output is also identical. If the output signal attempted to differ, that would cause an offset at the inverting input which the opamp will correct. It is worth remembering my opamp rules described at the beginning of this app. note.
For a negative-going input signal, The ideal diode (D1 and U2B) prevents the non-inverting input from being pulled below zero volts. Should this happen, the opamp can no longer function normally, because input voltages are outside normal operating conditions. The opamp (U1A) now functions as a unity gain inverting buffer, with the inverting input maintained at zero volts by the feedback loop. If -10uA flows in R1, the opamp will ensure that +10uA flows through R2, thereby maintaining the inverting input at 0V as required.
Limitations: Input impedance is non-linear, having an almost infinite impedance for positive half-cycles, and a 5k input impedance for negative half-cycles. The input must be driven from an earth (ground) referenced low impedance source. Capacitor coupled sources are especially problematical, because of the widely differing impedances for positive and negative going signals. The maximum source resistance for a capacitor-coupled signal input is 100 ohms for the circuit as shown (one hundredth of the resistor values used for the circuit), and preferably less. The capacitance is selected for the lowest frequency of interest.
This rectifier is something of an oddity, in that it is not really a precision rectifier, but it is full wave. It is an interesting circuit - sufficiently so that it warranted inclusion even if no-one ever uses it. This rectifier was used as part of an oscillator [ 4 ] and is interesting because of its apparent simplicity and wide bandwidth even with rather pedestrian opamps.
A simulation using TL072 opamps indicates that even with a tiny 5mV peak input signal (3.5mV RMS) the frequency response extends well past 10kHz but for low level signals serious amplitude non-linearity can be seen. The original article didn't even mention the rectifier, and no details were given at all. However, I have been able to determine the strengths and weaknesses by simulation. Additional weaknesses may show up in use of course.
Figure 10 - Simple Precision Full Wave Rectifier
One thing that is absolutely critical to the sensible operation of the circuit at low signal levels is that all diodes must be matched, and in excellent thermal contact with each other. The actual forward voltage of the diodes doesn't matter, but all must be identical. The lower signal level limit is determined by how well you match the diodes and how well they track each other with temperature changes.
The first stage allows the rectifier to have a high input impedance (R1 is 10k as an example only). Nominal gain as shown is 2 (short R3 for unity gain), but actual gain is reduced slightly by an amount that changes with level. 1V peak input gives 1.96V peak output, and 100mV gives 172mV out. The difference in each case is small and diminishes with reducing input level, but it's enough to mean that the circuit can't really be called a precision rectifier.
Limitations: Linearity is not very good. The circuit requires closely matched diodes for low level use because the diode voltage drops in the first stage (D1 & D2) are used to offset the voltage drops of D3 & D4. At input voltages of more than a volt or so, the non-linearities are unlikely to cause a problem, but diode matching is still essential (IMO).
Simple capacitor smoothing cannot be used at the output because the output is direct from an opamp, so a separate integrator is needed to get a smooth DC output. This applies to most of the other circuits shown here as well and isn't a serious limitation.
The final circuit is a precision full-wave rectifier, but unlike the others shown it is specifically designed to drive a moving coil meter movement. There is no output voltage as such, but the circuit rectifies the incoming signal and converts it to a current to drive the meter. This general arrangement is (or was) extremely common, and could be found in audio millivoltmeters, distortion analysers, VU meters, and anywhere else where an AC voltage needed to be displayed on a moving coil meter. Digital meters have replaced it in most cases, but it's still useful, and there are some places where a moving coil meter is the best display for the purpose. This type of rectifier circuit is discussed in greater detail in AN002.
Figure 11 - Moving Coil Meter Amplifier
The circuit is a voltage to current converter, and with R2 as 1k as shown, the current is 1mA/V. If a 1V RMS sinewave is applied to the input, the meter will read the average, which is 900µA. Adjusting R2 varies the sensitivity, and changing R2 to 900 ohms means the meter will show 1mA for each volt (RMS) at the input. This assumes a meter with a reasonably low resistance coil, although in theory the circuit will compensate for any series resistance.
This type of circuit almost always has R2 made up from a fixed value and a trimpot, so the meter can be calibrated. Although shown with an opamp IC, the amplifying circuit will often be discrete so that it can drive as much current as needed, as well as having a wide enough bandwidth for the purpose. Millivoltmeters and distortion analysers in particular often need an extended response (100kHz or more is common), and few opamp ICs are able to provide a wide enough bandwidth to work well with anything much over 15kHz. The problem is worse at low levels because the opamp output has to swing very quickly to overcome the diode forward voltage drop. It's common to use a capacitor in parallel with the movement to provide damping, but that also changes the calibration.
Limitations: The output is very high impedance, so the meter movement is not damped unless a capacitor is used in parallel. The meter will then show the peak value which might not be desirable, depending on the application.
As already noted, the opamp needs to be very fast. Linearity is good provided the amplifier used has high bandwidth. The circuit works better with low-threshold diodes (Schottky or germanium for example). It also only works as intended with a moving coil meter and is not suited to driving digital panel meters or other electronic circuits. It can be done, but there's no point as the circuit would be far more complex than others shown here.
Although the waveforms and tests described above were simulated, the Figure 6 circuit was built on my opamp test board. This board uses LM1458s - very slow and extremely ordinary opamps, but the circuit operated with very good linearity from below 20mV up to 2V RMS, and at all levels worked flawlessly up to 35kHz using 1k resistors throughout.
One thing that became very apparent is that the circuit is very intolerant of stray capacitance, including capacitive loading at the output. Construction is therefore fairly critical, although adding a small cap (as shown in Figure 5) will help to some extent. I don't know why this circuit has not overtaken the 'standard' version in Figure 4, but that standard implementation still seems to be the default, despite its many limitations. Chief among these are the number of parts and the requirement for a low impedance source, which typically means another opamp. The impedance limitation does not exist in the alternative version, and it is far simpler.
The Intersil and Burr-Brown alternatives are useful, but both have low (and non-linear) input impedance. They do have the advantage of using a single supply, making both more suitable for battery operated equipment or along with logic circuitry. Remember that all versions (Figures 7, 8 & 9) must be driven from a low impedance source, and the Figure 7 circuit must also be followed by a buffer because it has a high output impedance.
In all, the Figure 6 circuit is the most useful. It is simple, has a very high (and linear) input impedance, low output impedance, and good linearity within the frequency limits of the opamps. The Figure 6A version is also useful, but has a lower input impedance and requires 2 additional resistors (R1 in Figure 6 is not needed if the signal is earth referenced).
The above circuits show just how many different circuits can be applied to perform (essentially) the same task. Each has advantages and limitations, and it is the responsibility of the designer to choose the topology that best suits the application. Not shown here, but just as real and important, is a software version. Digital signal processors (DSPs) are capable of rectification, conversion to RMS and almost anything else you may want to achieve, but are only applicable in a predominantly digital system.


Corporation team to monitor public toilets
For regular checks in schools, colleges, and other institutions
by Staff ReporterThe city Corporation is all set to form a separate team to ensure the upkeep of all the public toilets within the city.
A monitoring system will also be put in place to ensure that the toilets in various institutions including schools and colleges are kept well-maintained and clear.
Out of the 93 public toilets in the city, including those in petrol pumps and similar outlets, around 35 are run directly by the civic body.
Training
According to an official of the city Corporation, two teams of around five members, drawn from the civic body’s team of sanitation workers, will be formed for the purpose.
“The team will be trained in some basic repair work, like repairing broken taps, which is common in many public toilets. They will also be provided with cleaning equipment. The number of members required for the team has not yet been fixed,” said the official.
The team will also carry out regular checks in toilets of schools, colleges and other institutions.
The Corporation will fix standards for cleanliness and maintenance of such toilets.
Upkeep
The owners can do the upkeep with their own workers or get the services of the Corporation’s team at a nominal cost.
The cost of service also has not been fixed. The civic body is currently preparing a by-law for the special team.
Corporation officials have also taken note of the rampant practise of keeping the doors of toilets locked in some petrol pumps and shopping complexes.
The monitoring team will discourage such practices too.
Six toilets
Under the Smart City project, the city Corporation has also taken up the renovation of six public toilets, located at Thampanoor, Putharikkandam, Vanchiyoor, and at the city Corporation office.


;
Ethan introduces you to browser developer tools in Chrome, teaching the basics of the Developer Tools Window, the Elements Panel, and JavaScript debugging.
While browsers’ dev tools are incredibly useful, they can be intimidating. Especially the first time you open them up. There’s a lot going on in those panels. Do you need to learn all of this stuff?
Well, no, you don’t need to learn it all. This video is meant to give you the foundation you need to start being productive in dev tools today. I start with the very basics: showing you how to open dev tools and work with the window they live in. Then I go over working with HTML and CSS. And then I finish with some light JavaScript debugging.
Highlights
Here are the highlights of what I talk about in the video. These are written for Chrome, though all of the features I talk about are present in other browsers, just in different locations.
- You can open dev tools with a keyboard shortcut: Command + Option + I (Ctrl + Shift + I for Windows)
- You can also open dev tools through the View > Developer > Developer Tools (Menu > More tools > Developer Tools for Windows)
- You can also right-click any element on a web page and select Inspect to open the Elements panel with that element highlighted.
- Next to the Close button, there’s a icon. Clicking this will reveal a menu that lets you pop the dev tools out into their own window or change the edge of the browser they are docked to.
- You can resize the Developer Tools window as well as many panels inside of it. Experiment until you’re comfortable.
Elements Panel (Styles)
- With an element selected, you’ll see the styles that are applied to that element.
- These styles can be edited by typing new values. Numerical values can be adjusted with your arrow keys. Modifier keys adjust the jumps in values the arrow keys make.
- Some value types, such as colors and transitions, offer graphical interfaces to edit those values more easily. If you see a little icon next to a value, click it to open this editor.
Elements Panel (Markup)
- You can change text, elements, and attributes by double-clicking and making changes. Experiment to get a feel for what can be changed this way.
- For more freedom, you can right-click an element in this panel and select Edit as HTML. This lets you edit the markup as plain text.
- You can delete highlighted elements with the Delete key.
- You can reorder elements by dragging them around.
- You can undo changes with Command + Z (Ctrl + Z for Windows)
JavaScript Debugging
While there’s a lot more to dev tools, this introduction should be plenty to get you warmed up. Now you’re equipped to debug HTML, CSS, and JavaScript. Now it’s up to you to learn more as you need it. Best of luck!
Source


Uses web components circuit-call-button
and circuit-call-stage
to start a video conference, or join is already started. See `videoCall` example for additional capabilities such as local video overlay or toggle local video.
source | documentation | github | npm


Remember when Robin Williams only wanted to make us laugh? If you're not already nostalgic for those long-gone days, you will be after sitting through "Bicentennial Man," Williams' latest foray into saccharine cinema. Those who weep over phone commercials or get a catch in the throat just thinking about Valentines Day might not mind slogging through this epic tale of a robot's quest to become human. Everyone else will emerge from "Bicentennial" feeling about 200 years older than they were when they went in.
Thanks to vehicles such as "Toys," "Jack," "Jakob the Liar" and last Christmas' "Patch Adams," Williams has now officially become the Emmett Kelly Jr. of 1990s cinema, a clown who won't stop until your chuckles are tinged with tears. The actor who once did such a fine job of straddling the worlds of comedy and drama in "Good Morning Vietnam," "Dead Poets Society" and "The World According to Garp" has almost disappeared completely, and in his place is a hollow, perpetually misty-eyed impostor who's only interested in playing misunderstood saints victimized and persecuted by the cruel, cruel world. At the rate he's going, Williams will soon be starring in "The Michael Jackson Story."
In "Bicentennial," inspired by Isaac Asimov's "The Positronic Man," Williams plays Andrew, an unusually sensitive and sentimental android who starts his life as a servant in the household of Richard Martin (Sam Neill) and his family and eventually embarks on a journey of self-discovery that spans from 2005 to 2205. Director Chris Columbus starts the film off as a corny but watchable sitcom and swings into "Forrest Gump" territory for the slightly more serious middle stretch.
Andrew's fascination with humanity, his talent for woodworking and his appreciation of opera mark him as something more than just a run-of-the-mill robot, but the small-minded folk of the future refuse to accept him as a real man because of his "positronic brain." Can Andrew ever transcend his factory origins and become a real live love machine in time to win the heart of his mortal girlfriend (Embeth Davidtz)? Since Columbus pulls all the stops out in the last 45 minutes, getting to the answer requires swallowing more syrup than you'd find in the best-stocked International House of Pancakes.
"Bicentennial Man" has some sharp special effects, a handful of imaginative fashions of the future and a handful of genuinely funny jokes that are vintage Williams. Unfortunately, Columbus and Williams are so resolutely determined to melt your heart, they finally resort to using the cinematic equivalent of a flame-thrower. The largely undramatic story drags on and on to a foregone conclusion, and the movie's worthwhile moments are quickly forgotten as Williams turns on the waterworks, Davidtz struggles to look longingly into his oozing eyes and Celine Dion (sounding more than a little robotic herself) wails another of her sterile love themes over the closing credits. James Sanford
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


Advanced Topics
The thing about convetion based api's is that the conventions both hide the complexity but also the flexiblity of the underlying mechanisms. Conventions favor simplicity over expressiveness; making the common things easy, but they must also make the less common possible.
Escape Mechanisms
The following escape mechanisms exist to expose the full flexibility of http/Rest and also work around places where a it may conflict with the rules and syntax of C#.
Path names
There are times when a Uri path segment is not a valid C# identifier. In those cases, the path segment can be specified as a string chained to rest of the path specification as a string. String escaped segments can appear anywhere in the path chain.
google.storage.v1.b("uspto-pair").get();
google.storage.("v1").b("uspto-pair").get();
This is also useful when part of the path is a data point not known at compile time.
string name = "John Smith";
dynamic example = new DynamicRestClient("https://www.example.com/");
dynamic person = example.restapi.people(name).get();
Reserved word parameter names
In cases where a parameter name is a C# reserved word it can be escaped using @
.
dynamic openstates = new DynamicRestClient("http://openstates.org/api/v1/");
var result = await openstates.legislators.geo.get(lat: 44.926868, @long: -93.214049);
Illegal identifier parameter names
Rest parameters can also contain characters that make them illegal identifiers altogether in C#. In this case named parameter syntax won't work but paramters can be passed as a Dictionary.
dynamic sunlight = new DynamicRestClient("http://congress.api.sunlightfoundation.com");
var parameters = new Dictionary<string, object>()
{
{ "chamber", "senate" },
{ "history.house_passage_result", "pass" }
};
dynamic result = await sunlight.bills.get(paramList: parameters);
Since only named arguments are parsed as parameters, the dictionary must be passed as a named argument event though the name is irrelevent. Named and dictionary based parameters can be mixed in the same invocation.
The HttpMessageHandler and HttpClient instances
By default the dynamic client will use the HttpClientHandler when creating the internal HttpClient. If you need to use a different HttpMessageHandler derived type, an instance can be passed to the dynamic client construcutor.
If fine grained configuraiton of the HttpClient
is needed, there is also a constructor overload that accepts an 'HttpClient' instance.
The unit tests use this extensively in order to use fake http responses rather than tightly coupling the tests to the endpoints.
public async Task CoordinateFromPostalCode()
{
using (var client = new HttpClient(MockInitialization.Handler))
{
client.BaseAddress = new Uri("http://dev.virtualearth.net/REST/v1/");
string key = CredentialStore.RetrieveObject("bing.key.json").Key;
dynamic virtualearth = new DynamicRestClient(client);
var result = await virtualearth.Locations.get(postalCode: "55116", countryRegion: "US", key: key);
Assert.IsTrue(result.resourceSets.Count > 0);
Assert.IsTrue(result.resourceSets[0].resources.Count > 0);
var r = result.resourceSets[0].resources[0].point.coordinates;
Assert.IsTrue((44.9108238220215).AboutEqual((double)r[0]));
Assert.IsTrue((-93.1702041625977).AboutEqual((double)r[1]));
}
}
Request configuration callback
For fine grained control of the HttpRequestMessage
a callback can be provided in the constructor of the dynamic client.
This function will be called just prior to every REST invocation.
The callback must have the signature of Func<HttpRequestMessage, CancellationToken, Task>
. It will be await
ed by the dyanmic client
before the request message is sent.
dynamic client = new DynamicRestClient("http://dev.virtualearth.net/REST/v1/",
configureRequest: (request, token) =>
{
Debug.WriteLine(request.RequestUri);
return Task.CompletedTask;
});
dynamic result = await client.Locations.get(postalCode: "55116", countryRegion: "US", key: "key");
Other uses of the callback are checking or refreshing auth tokens etc, signaling the UI that communication is happening, logging and debugging.
Calling a POST endpoint with url parameters
By default, Uri parameters on a POST request are url form encoded and sent in the request body. There are cases where a POST request has other data in the request body but also has parameters in the Uri. In this case the parameter can be based in a PostUrlParam.
Setting Content Headers
It is common that the MIME type or other headers needs to be set when uploading content to a REST endpoint. To do so, content can be passed as ContentInfo or SteamInfo objects. These types allow MIME type and other headers to be specified with the content.
using (var stream = new StreamInfo(File.OpenRead(@"D:\temp\test.png"), "image/png"))
{
dynamic google = new DynamicRestClient("https://www.googleapis.com/");
dynamic result = await google.upload.storage.v1.b.unit_tests.o.post(stream, name: new PostUrlParam("test_object"), uploadType: new PostUrlParam("media"));
}
Bypassing Content Conventions
If you require fine grained control over the request content, any instance of an HttpContent derived class passed to the verb invocation will be added to the reuqest as-is, overriding any content creation conventions.
If, for instance, an endpoint does not accept Json, an object could be serialized as Xml and POSTed using this mechansim.
Returning Types Other Than Dynamic
Pass a single Type instance to a verb invocation in order to control how response conent is deserialized or overriden.
Strongly typed response
If you have a POCO type that you would like the response deserialied to, pass the type of that class to the rest invocation. The response body, assuming it is Json, will be deserialized into that type using JSON.NET.
public class Bucket
{
public string kind { get; set; }
public string id { get; set; }
public string selfLink { get; set; }
public string name { get; set; }
public DateTime timeCreated { get; set; }
public int metageneration { get; set; }
public string location { get; set; }
public string storageClass { get; set; }
public string etag { get; set; }
}
dynamic google = new DynamicRestClient("https://www.googleapis.com/");
Bucket bucket = await google.storage.v1.b("uspto-pair").get(typeof(Bucket));
Console.WriteLine(bucket.location);
Specifying other return types
- Passing
typeof
Stream
,byte[]
orstring
will deserialize the request content to those respective types - Passing
typeof
HttpResponseMessage allows you to receive the complete response message - Any other Type instance is assumed to be intended for a strongly typed response as discussed above
Special Unamed Argument Types
The following types, when passed as unnamed arguments will be used during the creation and invocation of the request.
JsonSerializerSettings
Serialization is done with Json.Net. An instance of this type can be passed to control serialization- CancellationToken Because verb invocations are always
async
, aCancellationToken
can be passed in order for client code to cancel the operation


Reports unnecessary creation of temporary objects when converting from
String
to primitive types.
Example:
new Integer("3").intValue()
After the quick-fix is applied:
Integer.valueOf("3")


CHAPTER 224
STATE POPULATION AND PLANNING
REPEALED. L 1983, c 126, §1.
Cross References
State planning, see chapter 225M.


Global settings can be changed in the Site Settings of your websiteSizeShow/HidePlaceholdersForm OptionsRedirectURLMini Templates (optional)AlertsBackground
SUBSCRIBE FORM
Subscribe to our Newsletter
This form uses Google's reCAPTCHA. By continuing you agree to the Privacy and Terms.


Sylvanian Families Music & the Arts
Ballet Lesson
Ballroom Set
Banjo
Dream Project Performers
Drums
Maypole and Dancers
Kitty Katie Ballerina (Calico Critters)
Music Lesson
School Music Set
School Play
Home


Created by Marko Jurisic / @jurisicmarko
long deployment times
complicated lifecycle
bundled components (jquery w richfaces)
outdated look & feel
angular - superheroic web framework
is becoming the standard for enterprise single-page apps
controllers / services/ directives allow for separation of concerns which facilitates modularity and testing
typescript gives compile-time type safety and brings familiar concepts to javascript world
npm is used for installing and running all other tools
can also serve our application (usually using express)
project dependencies with versions listed in package.json
//package.json
{
"name": "my-project-name",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.5",
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-nodeunit": "~0.4.1",
"grunt-contrib-uglify": "~0.5.0"
}
dependencies will be downloaded to node_modules
client side package manager
no system-wide dependencies
no sharing of dependencies between apps
uses git - possibility to use own repos
npm install -g bower
bower install angular
bower init #creates bower.json
dependencies will be downloaded to bower_components
javascript task runner
automation of repetitive tasks such as compiling, concatenating and minifying files, watching for changes, running unit and e2e tests, packaging etc.
npm install -g grunt-cli
npm install grunt --save-dev
//Gruntfile.js is used for configuration
module.exports = function(grunt) {
// A very basic default task.
grunt.registerTask('default', 'Log some stuff.', function() {
grunt.log.write('Logging some stuff...').ok();
});
};
pl.allegro
grunt-maven-plugin
1.5.0
path_to_js_project
--verbose
http://cnpmjs.org/downloads
maven-properties.json
create-resources
npm
bower
grunt
a superset of javascript, compiles to plain js
has modules, classes, interfaces, inheritance
provides compile time type safety
npm install -g typescript
tsc test.ts #produces test.js
excellent IDE support (IntelliJ, WebStorm, VisualStudio, Eclipse)
needs a bit of getting used to but pays of quickly
css pre-processor, compiles to css
runs in browser, Node and Rhino
excellent support in IntelliJ
variables, mixins, nesting, functions ...
variables
@nice-blue: #5B83AD;
@light-blue: @nice-blue + #111;
#header {
color: @light-blue;
}
nesting / mixins
.blueText {
color:blue;
}
.title {
font-weight:bold;
.blueText;
.subTitle {
color:blue;
}
}
operations
@base: 5%;
@filler: @base * 2;
@other: @base + @filler;
color: #888 / 4;
background-color: @base-color + #111;
height: 100% / 2 + @filler;
functions
@base: #f04615;
@width: 0.5;
.class {
width: percentage(@width); // returns `50%`
color: saturate(@base, 5%);
background-color: spin(lighten(@base, 25%), 8);
}
test on multiple browsers
testing framework agnostic
easy debugging
// karma.conf.js
module.exports = function(config) {
config.set({
files: [
'src/**/*.js',
'test/**/*.js'
],
// coverage reporter generates the coverage
reporters: ['progress', 'coverage'],
preprocessors: {
// source files, that you wanna generate coverage for
// do not include tests or libraries
// (these files will be instrumented by Istanbul)
'src/**/*.js': ['coverage']
},
// optionally, configure the reporter
coverageReporter: {
type : 'html',
dir : 'coverage/'
}
});
};
initial effort pays off quickly
short cycles -> fast deployent (watch/livereload)
typescript + angular + less
=
slides and examples available on github under: https://github.com/mjurisic/spa-stack-devcafe


{% extends 'marketplace/base.html' %} {% block pagecontents %}
You may log in to {{ SITE_NAME }} via any of the following accounts you've connected.
To disconnect an account, select it and click Remove below.
{% else %}You haven't connected any accounts.
{% endif %}Click to connect your {{ SITE_NAME }} account – you may then log in via these providers.
{% include "marketplace/components/login_provider_list.html" with process="connect" %}


Elizabeth's Week 1 Blog Post
On GitHub and Version Control
02/15/16
What are the benefits of version control?
Version helps developers isolate errors or bugs within certain sets of changes. It gives you confidence to iterate on code that works, but could be more efficient or more feature rich. When you have a complete record of your code previously, you don’t have to be scared that you won’t be able to get back to it.
Imagine having 5 teams of developers working on advancing 5 different feature sets of a single live product or site. If you were all saving on top of the original version, bugs could be introduced and you would have to track down which team introduced it and take steps back to get to the previously working version.
How does git help you keep track of changes?
Git enables you to create a time-stamped library of your a project, product, website, etc at all different stages of development.
Why use GitHub to store your code?
In addition to being a powerful collaboration tool and debugging asset as mentioned in my first paragraph, GitHub also acts as a massive back up for you and your team.


Please wait while loading. Scroll down to see teams 191-215.
Click the 'back' button on your browser to return to the Texas Independence Relay tracking map.


Notes:
- Requires
docker
, make
, and bash
(Not dash
or mksh
, bash
), as well as an I2P router. UDP services require either i2pd or a freestanding proxy capable of supporting UDP traffic.
- SAM is expected to be enabled on the I2P Router for some services, including hosting this site with eephttpd.
Usage:
functions: help pages clean install uninstall
help: show this message
pages: generate the pages
clean: clean up the pages
install: setup the cron jobs and shell scripts
uninstall: remove the cron jobs and shell scripts
Notes:
- Hosting this site(The one in this repository) requires a checkout of this repository. It can be anywhere, the script finds the correct directory to use.

Public URLs:
- glue.idk.i2p
- [paste.idk.i2p](http://paste.idk.i2p) Will Replace this service week of 20 September, 2021
#! /usr/bin/env sh
docker pull schollz/cowyo
docker rm -f pastebin
docker run --restart=always --name=pastebin -d -v $HOME/cowyo-data:/data -p <IP_ADDRESS>:8050:8050 schollz/cowyo
Notes:
- This script expects your i2p.newsxml checkout to exist in
$HOME/i2p.newsxml
so that it can build the hosting container in that directory.
- This is the script that relaunches backup news server for I2P I run. Nobody else can really use it without the keys, unless they want to set up another news server on a different URL.
- This doesn’t handle generating or signing the news feeds, just hosting them. Generate and sign them on one machine, copy them to the host machine, and run the update script.
See Also:
#! /usr/bin/env sh
cd $HOME/i2p.newsxml
docker build -t i2p.newsxml .
docker rm -f newsxml
docker run -d --restart=always --name newsxml -p <IP_ADDRESS>:3000:3000 i2p.newsxml
Notes:
- This sets up an update server for the I2P Jpackages. It will check out the site at
$HOME/i2p-jpackage
and jpackage.sh
will run the internal update-site.sh
script as a cron job.
- If you’re me, you need to copy
eephttpd-jpackage.i2pkeys
to $HOME/eephttpd-jpackage-data/
before running. If you’re not me, I’m just tickled that you’re setting up an update server for your own fork. Maybe ping me on IRC.
See Also:
#! /usr/bin/env sh
if [ ! -d "$HOME/i2p-jpackage" ]; then
git clone https://github.com/eyedeekay/i2p "$HOME/i2p-jpackage"
fi
"$HOME/i2p-jpackage/update-site.sh"
Notes:
- No Special Configuration Required.
See Also:
#! /usr/bin/env sh
if [ ! -d "$HOME/i2p.www" ]; then
git clone https://i2pgit.org/i2p-hackers/i2p.www "$HOME/i2p.www"
fi
"$HOME/i2p.www/site-updater-docker.sh"


Saudi-led coalition says Yemen Houthis claim of shooting down warplane is incorrect
(Reuters) - Spokesman Turki al-Malki for the Saudi-led coalition in Yemen said on Wednesday that “Yemen Houthis claim of shooting down a coalition F-15 warplane is incorrect”, according to the Saudi state news agency.
Yemen Houthis said on Wednesday that they had intercepted a coalition warplane near the border with Saudi Arabia.


A library for HbbTV-application developers
hbbtv-lib is a collection of modules for common HbbTV functionality
- Application manager to handle the requested keyset, show/hide and app launch
- Companion screen manager
- Sync manager wrapping the HbbTV MediaSynchroniser object
The individual modules are implemented in CommonJS style. This is same way as JavaScript modules are handled in Node.js runtime. Modules are intended to be used with webpack, which prepares the code for execution in HbbTV browser environments.
A version of hbbtv-lib that can be used without specific build tools is on the roadmap.
This project was originally developed as part of the 2-IMMERSE project, co-funded by the European Commission’s Horizon 2020 Research Programme
Install
Install via npm:
npm install --save hbbtv-lib
Usage
var AppMan = require('hbbtv-lib/main/appman');
var CSMan = require('hbbtv-lib/cs/cs_manager');
var SyncManager = require('hbbtv-lib/cs/sync_manager');
var UserAgentParser = require('hbbtv-lib/tools/useragent');
Use the application manager to set application visible and request keys from terminal.
AppMan.show();
AppMan.addKey(AppMan.COLOR);
AppMan.addKey(AppMan.NAVIGATION);
Discover launcher applications. The maximum timeout (1sec defined by the spec) can be increased for testing purposes.
CSMan.once(CSMan.CS_DISCOVERED, on_discovery_finished);
CSMan.discover_launchers(10000);
function on_discovery_finished (devices) {
for (x in devices) {
log(devices[x].friendly_name);
}
}
Launch a webpage with the remote app2app service endpoint added to the URL.
CSMan.once(CSMan.CS_LAUNCH_RESPONSE, on_launch_response);
CSMan.launch_html(enum_id, url + "?a2a=" + CSMan.getA2A_remote() + app_endpoint);
function on_launch_response (enum_id, val) {
log("Launch response from enum_id = " + enum_id + ": " + val);
}
Enable inter-device synchronisation with video/broadcast
mediaObj = document.getElementById("vbObject");
mediaObj.bindToCurrentChannel();
// wait for presenting state on mediaObj
syncMan = new SyncManager();
syncMan.on(SyncManager.EVT_MS_ERROR, on_ms_error);
syncMan.once(SyncManager.EVT_CII_ENABLED, on_cii_enabled);
syncMan.once(SyncManager.EVT_CII_DISABLED, on_cii_disabled);
syncMan.setMasterMedia(mediaObj, "urn:dvb:css:timeline:temi:1:1");
syncMan.enableCII();
function on_cii_enabled() {
log("synchronisation with companion can be started.");
}
Documentation
The documentation can be read here.
Build from source and run tests
NOTE: The following requires Grunt-CLI to be installed globally on your machine.
Build library from source:
grunt build
Run unit tests (this will build the libraries before running the unit tests):
grunt test
Build the documentation from JsDoc annotations in source code:
grunt doc
License and authors
All code and documentation is licensed by the original author and contributors under the Apache License v2.0:
See AUTHORS file for a full list of individuals and organisations that have contributed to this code.
Contributing
If you wish to contribute to this project, please get in touch with the authors.


The bronze seat provides you with email support from a QuantConnect engineer. Your submitted support tickets will have a response time of around 72 hours. This tier is best for quants that develop algorithms with basic compute needs, and can write algorithms independently with the help of available documentation.
The silver seat includes the services provided by the bronze tier with faster response times, and up to 8 tickets per month. The silver seat also includes design suggestions for your project. A QuantConnect engineer will help you find the best way to implement your project. This tier is best for quants or a team of quants that develop algorithms with more complex needs such as large algorithms.
The gold seat includes all the services provided by the silver tier with even response times for email support. Phone support can be provided up to 1 hour per month, and up to 16 ticket per month. The gold support tier is recommended for trading firms who need quick reponses and design suggestions to keep your team operating efficiently.


?HERBARIUM
58650
T.
G.
YUNCK.ER
FLORA
OF
JAMAICA
Botanical
Name:
Ju8s“eua
peruviana
L.
JfJ.
JO
c
Vernacular
Name:
HERBARIUM
Bot.
Dept.
Locality:
^acks
Hill
track
U.
C.
W.
L
Parish:
St
.Andrew
Altitude:
1,500'
Date:
February
1957
Habitat:
Jn
river
bed
Notes:
Flowers
yellow
TRUMAN
G.
YUNCKER
HERBARIUM
OF
DEPAUVV
UNIVERSITY
(DPU)
PURCHASED
BY
NY
IN
1987
t£W
YO/^
botanical
GARDEN,
No-3070
dup.
Collector:
M.Allwood
Iden,:M.Allwood
Presented
to
DPU
Herbsriunj
by
T.
G.
YunckiC
01447680
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


--- layout: default title: IRC Specifications ---
Lots of behaviour in the IRC protocol as implemented in clients and servers today is not formally specified. If you are looking to implement IRC software, the best thing to do is look at specifications, information, and how other software behaves as a guide.
The Modern IRC documents describe the IRC client protocol, formatting, and other related tech. The primary document on this site is an updated replacement to RFCs 1459 and 2812.
These docs don't specify new stuff, just existing behaviour and what I consider best-practices for new software. I intend for them to help improve interoperability with the wider IRC ecosystem, and provide a good starting-point on the base protocol for new implementations.
Full disclosure: I'm an author and/or editor on most of the Modern specs.
The earlier and the later 'canonical' IRC specifications, respectively.
Some software holds RFC1459 in higher regard than RFC2812, and some hold the opposite in higher regard. Honestly, the truth tends to lie somewhere in the middle.
There are many parts of the newer RFC2812 that software authors (reasonably) consider insane. And there are many parts that have updated RFC1459 in useful ways and have been widely-implemented by clients and servers today.
In the same way, RFC1459 has many useful parts, and there are also many places where due to its age or simply deviating implementations, it also has information that's totally incorrect.
Honestly, use these as a rough reference, say for a basic implementation. And then compare everything with multiple real-world servers and clients to find out how broken and incompatible your to-the-spec implementation is with the actual ones out there today.
If you're looking at these, it's worth taking a look at the Modern IRC docs which I'm writing up. The main doc there acts essentially as a replacement to these two, but is still very, very much a work in progress.
Do not take RFC 1459 or 2812 of these original specifications as gospel. They are both very old, and have lots of places where either due to age or decision, modern software specifically does not follow them.
Welcome to IRC, where the base specs we work off are all old and broken and regarded more as suggestions than anything binding. Strap in and "Thanks for flying IRC!"
6697 is IRC's TLS port. It's now in an RFC. Hooray.
This also specifies some details about certificates that are useful to keep in mind, and some bits about certificates that isn't really true these days.
Every server implements this. This is mandatory for any client implementing any sort of intelligence. The RPL_ISUPPORT numeric is implemented by literally everything.
The original RPL_ISUPPORT specs are old and describe keys which are no longer used today. This one describes the widely-used parameters that clients and servers SHOULD implement. There is also the RPL_ISUPPORT Token list I maintain over on my irc-defs page
Full disclosure: I wrote on the spec I'm linking here. The original spec people tend to refer to is the RPL_ISUPPORT Hardy Internet-Draft.
This is a working group made up of a whole bunch of IRC software authors. IRCv3 specifications are written by various software authors, submitted, and accepted if the majority of the group agrees on them. These are recommended and tend to introduce new and useful features to the IRC protocol.
Regarding specific IRCv3 specifications, here are rough support matrixes for clients and servers.
CTCP is the Client-to-Client Protocol. Supported by a large amount of software, it allows for special messages to be exchanged between clients. Very useful, and clients need to implement certain parts of it.
The original CTCP specifications required insanely extensive quoting mechanisms which didn't end up getting supported and/or got explicitly rejected by the clients out there today. As such, I've linked a newer, lean CTCP specification which describes just the parts that are generally useful to clients today.
Full disclosure: I'm the editor of the spec I'm linking here.
Like the canonical RFCs, this is an old document. Like the RPL_ISUPPORT draft, not everything in here is parsed by clients.
However, it is the best document describing the irc and related URL schemes around today. Clients should largely implement this document when implementing parsing for the IRC URL schemes (within reason, for instance use 6697 as the default for ircs URLs these days).
The WEBIRC command is widely used in the implementation of web-based IRC clients in connecting to IRCds. Only privileged hosts can use this command, since WEBIRC lets the client sending it to set the hostname/IP address of the current connection.
This specification is one done up with the IRCv3 WG that basically describes how it works today. It's WiP but should be pretty accurate.
DCC stands for Direct Client-to-Client. XDCC is an extension which stands for Xabi's DCC (widely referred to as Extended DCC these days). These protocols allow for traffic to be exchanged directly between clients (again, with a number of caveats). Proposed uses for this have also included 'whiteboards' and direct chatting. However, these days DCC/XDCC is primarily used for file exchange between clients. DCC file transfers don't use any sort of encryption, and as such… I'd recommend building something better these days.
 It's difficult to point to one as authoritative without combing through all of them to see how closely they're followed these days. However, I've been writing up this very work-in-progress one that may be useful (but doesn't describe everything or all the extensions yet).


Our goal is to provide exellent quality low cost E-learning resouces to
student and techers.
Our mission is to make good well educated student through good
e-learning resorces
We are undergradute students on SLIIT. This is a project by 1 year students.
Project Members,
Project 1996,
SLIIT Institute,
Kandy


Overview
SQEE RPG is a complete game engine using LibSQEE. It's formost aim is to allow the creation of a high quality 3D Action Role Playing Game. Development has stalled, as I am now focusing on SuperTuxSmash.
Features include:
- fast deferred high dynamic range rendering
- volumetric lighting for directional, orthographic, point and spot lights
- scenes defined completely within chaiscript
- adjustable cascading shadow maps with stable projection
- soft shadows with high quality filtering
- Screen Space Ambient Occlusion and Bloom effects
- frustum culling and depth pre-pass for all objects
- fast data-oriented entity design with decoupled rendering
- much more!


--- title: Israel shot 147 date: 2004-05-27T00:00:00.000Z filepathOriginal: photos/IMG0218.jpg filepathThumbnail: photos/IMG0218.thumbnail.jpg filepathPreview: photos/IMG0218.preview.jpg ---
Donkeys hanging out around the date palms, at Ketura


The Scheduler allows developers to schedule tasks at different priorities. This sample shows how to schedule tasks and how their priority impacts when they'll run.


If the colors of a component's theme do not match your wishes or
requirements, you can modify them in order to customize the component. The
ThemeModule, ThemeService and the directive
theme
are all provided by the CDK and they need to be inserted
in your app module and HTML component, as in the example below.
ThemeService is the service that will be registering your custom theme in your app and ThemeModule is the module that allows this service to work.
Please follow the next steps to add your own theme:
register(theme: Theme)
function.
theme
in your HTML component.Check out the example:


Jena2 Database Interface - Open Issues
Known Bugs
- Plain Literals vs. XSD String-typed Literals
- The RDF recommendation states that if an XSD string-typed literal and a
plain literal (no language tag) have the same value (see Literal.getValue()),
then they are considered semantically equivalent, i.e., Literal.sameValueAs()
returns true. Unfortunately,
the database layer does not treat them as equivalent. For example, if a
statement with an xsd string-typed literal for an object is added to a database
model, then in a subsequent attempt to list all statements with that value as
a plain literal, the original
statement (with the typed literal) will not be included in the result set.
- Database Lock
- The Jena2 storage subsystem uses a lock (or mutex) internally to implement a
critical section for operations that modify the database structure
(create/delete tables). The lock is implemented as a database table, i.e., if
the table exists in the database, the lock is held. Normally, this lock
should be transparent to applications. But if an application has an exception
while in a critical section, the database may remain locked for subsequent
applications. In this case, a user must manually unlock the database either by
calling DriverRDB.unlockDB() or by deleting the table (Jena_Mutex) from the database.


Watch Korn deliver blistering live version of Cold
by https://www.facebook.com/metalhammer/Korn share live footage of Cold - filmed at the launch event for their latest studio album The Nothing
Korn have released a live video showcasing their track Cold.
The Sebastien Paquet-directed promo was captured at Korn’s launch event for latest studio album The Nothing, which arrived in September and was filmed by Paquet, Dayne Malan, Edwin Daboub, Melissa Castro and Luke Schlink.
In Metal Hammer’s track-by-track guide to The Nothing, we described Cold as “undeniably old school from the get-go," adding: "The track showcases each member's talents, digging into the band's earlier sound yet still managing to stay vital and fresh.
“Jonathan Davis really goes for it on the vocals with this one displaying some of the most diverse singing in his career thus far – his classic melodies and distinctive scatting juxtaposed against some seriously seething growls and wailing that's so spot on it could be mistaken for a synth.
“It's the perfect balance of Korn-shaped funky chugs, crushing, frenzied breakdowns and powerful, stadium-ready choruses.”
In October, Korn announced a joint North American tour with Breaking Benjamin which will kick off at Allentown’s PPL Center on January 23 and wrap up at Fresno’s Save Mart Center on March 1.
- Explore EMP's range of Korn merch
- Black Friday 2019 music deals 2019: All the latest info for music fans
- Black Friday 2019 headphones deals: All the latest deals
Korn: The Nothing
Korn return with The Nothing – their first album since 2016's The Serenity Of Suffering. The record features the lead tracks You'll Never Find Me, Cold and Can You Hear Me. View Deal


--- title: "Dallas BizTalk User Group" layout: post ---
The Dallas BizTalk User Group meets tonight at the Microsoft campus in Las Colinas. The topic is BizTalk and WMI and will be presented by my fellow Sogeti consultant Ed Kisinger of EdSquared. Free Pizza, Free Admittance, come check it out!


Anna Kukleva
Anna Kukleva
Home
Publications
Experience
Talks
Academic Activities
Contact
Publications
Type
Conference paper
Book section
Date
2022
2021
2020
2019
Leveraging Self-Supervised Training for Unintentional Action Recognition
ECCVW 2022
Enea Duka*
,
Anna Kukleva
*
,
Bernt Schiele
PDF
Cite
Code
Project
CycDA: Unsupervised Cycle Domain Adaptation from Image to Video
ECCV 2022
Wei Lin
,
Anna Kukleva
,
Kunyang Sun
,
Horst Possegger
,
Hilde Kuehne
,
Horst Bischof
PDF
Cite
CoSSL: Co-Learning of Representation and Classifier for Imbalanced Semi-Supervised Learning
CVPR 2022
Yue Fan
,
Dengxin Dai
,
Anna Kukleva
,
Bernt Schiele
PDF
Cite
Code
Generalized and Incremental Few-Shot Learning by Explicit Learning and Calibration Without Forgetting
ICCV 2021
Anna Kukleva
,
Hilde Kuehne
,
Bernt Schiele
PDF
Cite
Code
Revisiting Consistency Regularization for Semi-Supervised Learning
GCPR 2021
Yue Fan
,
Anna Kukleva
,
Bernt Schiele
PDF
Cite
Joint Visual-Temporal Embedding for Unsupervised Learning of Actions in Untrimmed Sequences
WACV 2021
Rosaura G. VidalMata
,
Walter J. Scheirer
,
Anna Kukleva
,
David Cox
,
Hilde Kuehne
PDF
Cite
Learning Interactions and Relationships between Movie Characters
CVPR 2020 (Oral)
Anna Kukleva
,
Makarand Tapaswi
,
Ivan Laptev
PDF
Cite
Code
Project
Utilizing Temporal Information in Deep Convolutional Network for Efficient Soccer Ball Detection and Tracking
RoboCup 2019, Springer (Oral)
Anna Kukleva
*
,
Mohammad Asif Khan*
,
Hafez Farazi
,
Sven Behnke
PDF
Cite
Code
DOI
Unsupervised learning of action classes with continuous temporal embedding
CVPR 2019
Anna Kukleva
*
,
Hilde Kuehne*
,
Fadime Sener
,
Jürgen Gall
PDF
Cite
Code
Cite
×


--- title: Sanity From the 1st Post-Bilski Decision from BPAI layout: post ---
Look at this, will you? The first decision from the Board of Patents Appeals and Interferences post-Bilski to reference that US Supreme Court decision, in In Re Proudler [PDF], a ruling rejecting HP's application for a software patent, setting forth a rule stating, as I read it, as saying software is not patentable because it's an abstraction:
Hell yes!


Extremely efficient Mobile and Web Programmer with strong ambition to take on new and exciting projects with team members to achieve some high quality applications. My professional aim is to work with other passionate people to develop groundbreaking interactive apps. Patient and creative problem-solver who is known for organizational skills, commitments to excellence and track record of delivering work ahead of schedule. A Techie who adept at developing exciting and feature-rich sofwares for varied platforms, intends to work as a Mobile or Web developer for an esteemed organization..
This application let the students to search and register various courses and let the course provider to upload new courses.
CGPA: 7.94
Percentage: 94%
Percentage: 94%
Apart from web and mobile developement, I enjoy most of my time being outdoors. When forced indoors, I follow a number of sci-fi and fantasy genre movies and also listening to music. I love competative programming and also I spend a large amount of my free time exploring the latest technology advancements in the web and mobile development world.


Here are some tools for working with base64 values that I use often.
All of them are purely client-side Javascript and work from your computer. No data is sent anywhere else or to any other servers.
Encode string
Decode string
Encode file
View image from base64
Encode a string to base64
Input
Output


Privacy Policy
This privacy policy discloses the privacy practices for www.pdfonline.com. This privacy policy applies solely to the services and all sites of the pdfonline.com domain.
Information Collection, Use, and Sharing
We are the sole owners of the information collected on this site. We only have access to/collect
information that you voluntarily give us via email or other direct contact from you. We will not sell or
rent this information to anyone.
We will use your information to respond to you, regarding the reason you contacted us. We will not
share your information with any third party outside of our organization, other than as necessary to fulfill
your request, e.g. to deliver an order.
Unless you ask us not to, we may contact you via email in the future to tell you about specials, new
products or services, or changes to this privacy policy.
Security
We take precautions to protect your information. When you submit sensitive information via the
website, your information is protected both online and off-line.
Wherever we collect sensitive information, that information is encrypted and transmitted to us in a
secure way. You can verify this by looking for a closed lock icon at the bottom of your web browser, or
looking for "https" at the beginning of the address of the web page.
While we use encryption to protect sensitive information transmitted online, we also protect your
information offline. Only employees who need the information to perform a specific job (for example,
billing or customer service) are granted access to personally identifiable information. The
computers/servers in which we store personally identifiable information are kept in a secure
environment.
Updates
Our Privacy Policy may change from time to time and all updates will be posted on this page.
If you feel that we are not abiding by this privacy policy, you should contact us immediately Contact Us.
|


18 November 1999
Disease Outbreak Reported
Following a trade fair in Kapellen, Belgium, an outbreak of Legionnaires' disease has been reported. So far, out of 80 persons who developed clinical symptoms, 13 had positive urinary tests including 4 who died.
Over 60.000 visitors attended the fair, and initial investigation suggests that whirlpool baths exhibited at the show are the most likely origin of the infection. The trade fair took place between 29 October and 7 November, 1999. The investigation by the health authorities is in progress.


For those who love to “prove their point”, get into this technical discourse.
We await your point form the treasure of your technical knowledge. Be assertive, be quick. Don’t meander; it’s time to ‘prove your point.
Round 1: Elimination Round
This round will select 5 teams based on the activity given to teams. The activity would involve testing of technical thinking and presentation skill.
Time Duration: 45 Minutes
Round 2: Technical Group Discussion
In this round the teams would be allocated a technical topic or technical challenge. They would be allocated 10 minutes to think and make points on the same. After 10 minutes the discussion on that topic shall began.
Time Duration: 30 Minutes for actual discussion
Rules:
1.Use of only English language is allowed during technical discussion.
2.While presenting ideas or doing discussion, the team members must use polite, formal, non-offensive, and non-abusive language/tone/gestures.
3.The organizing committee reserves right for any change/addition in rules.
Exactly two members
9 March 2017
Round 1 : 11:00 to 12:00 PM
Round 2 : 1:30 to 2:30 PM
Round 1 : IT LAB1 IT LAB2
Round 2 : IT Lab 1
Rs. 50
Vivek Patel:
Mob No :<PHONE_NUMBER>
E-mail<EMAIL_ADDRESS>Srujan Shah
Mob No :<PHONE_NUMBER> E-mail:shahsrujan@gmail.com


Bio Achievements Experience Training
Anakin Skywalker >
Analytical, goal oriented leader with proven track record in management and enforcement Space Fleet Operations or Frontend Development. Wide range of hands-on experience, including:
- Large scale construction projects oversight
- Advanced forms of mind control
- Planetary scale demolitions operations
- Fugitive recovery services
”
Together we can rule the galaxy
Notable achievements
Designed, built and piloted a custom pod racer. 32 BBY Boonta Eve Classic Race Champion
Oversight of DS1 and DS2 Orbital Battle Stations construction projects
During my tenure as a Supreme Imperial Fleet Commander I was in charge of large capital construction projects for the Deep Space Fleet. Performed acceptance testing of the DS1 SuperLaser in 0 BBY by annihilating Alderaan - a terrestrial class planet in the Core Worlds region. Successfully tripled the deep space fire power of the imperial fleet in accordance with the Tarkin Doctrine before losing both projects to run-away photon torpedoes.
”
I find your lack of faith disturbing.
Experience
Sith Empire Headquarters, Dromund Kaas
Supreme Commander of Imperial Forces, Emperor’s Enforcer
- As the right-hand man to Emperor Sidious, hunted down jedi survivors and enforced the will of the empire;
- Oversaw construction of the first generation Death Star;
- First ever Imperial Supreme Commander;
Wally’s Parts / Toyarian Watto junk shop, Mos Espa, Tatooine
Enslaved Volunteer
- General help and front-desk retail operations at the junk shop, second hand droid parts, mechanical / droid repair services;
- Designed and piloted custom-built Podracer, ran track-side operations for the podracing team;
”
When I left you, I was but the learner; now I am the master.
Formal training
Green Fox Academy, Earth
Full stack developer
- Padawan to Knight Tojas;
- Learned programming with a specialisation in JavaScript and Front-end technologies
Sith Empire, Coruscant
Master of the Dark Side of the Force
- Apprentice to Sith Lord Darth Sidious;
Jedi Order Academy, Coruscant
Master of Jedi Force
- Padawan to Knight Obi Wan Kenobi. Bodyguard to Senator Padme Amidala during the Clone Wars of 22 BBY;
- Graduated with donors;
Personal interests
- Midi-Chlorian research as a hobby;
- Recreational mind-control techniques;
- Amateur and local club podracing.


Before a topic is published to the curated section, it should be reviewed by a lesson creation admin.
Click the button below to send an email to the lesson creation admins to start the final review and publication process.


To expedite the check-in process, we will begin on-site registration on
Tuesday, June 24th. Make sure to bring your photo ID, as we’ll need to
verify it prior to assigning you your Google I/O badge. We’re OK with
government issued licenses, passports, and other forms of identification.
If you do not have proper identification, you won’t be able to receive a
badge and will not be admitted into the conference. If you’re an Academic
attendee, please remember to bring proof of eligibility.
Check-in for Google I/O will be located on Level 1 of Moscone West and open during the following times:
Tuesday, June 24: 2pm PDT to 8pm PDT
Wednesday, June 25: 7am PDT to 6pm PDT
Thursday, June 26: 7am PDT to 6 pm PDT
Stay informed
To stay up to date on the latest information on sessions, speakers, and activities, be sure to visit the Google I/O 2014 website, as well as follow our Google+ page and Google Developers Blog. In addition, we'll be emailing all registered attendees the latest information and check-in instructions prior to the conference.
Live stream and recordings
Even if you're not coming to Google I/O, you can be part of the magic. You can watch live streams of the keynotes and many other sessions via I/O Live on our website. Even better, be part of Google I/O by attending an I/O Extended event in your area. If you can't watch live, you can see YouTube recordings of all sessions after the conference.
Live Blogging Gadget
If you're interested in embedding the Live Blogging Widget on your Website, access the configuration tool and FAQs here.
Registration
General Admission Ticket: $900
Academic Admission Ticket: $300
Registration
We're making some changes to this year's registration process. The window to submit a registration application will open at 4:00pm PDT on April 15th and stay open until 2:00pm PDT on April 18th, so you’ll have plenty of time to apply. We'll randomly select applicants after the window closes on the 18th and notify those selected with their ticket purchase confirmations via email. Qualified registration applicants will be selected at random for ticket assignments. The order in which registration applications are received has no bearing on the final outcome.
Here's what to expect during the registration application window:
You will need to sign into Google+ to begin the registration application.
You will then complete the required registration fields and continue on to authorize the purchase of your ticket via Google Wallet. At this time, Google Wallet will not complete the charge, but a pre-authorization will be placed to ensure the funds are available.
Your credit card will only be charged if you are assigned a ticket. By completing the registration application, you are authorizing Google Wallet to complete the charge at the conclusion of the application window, should you be randomly selected to receive a ticket.
Tickets can only be used by the original registrant and cannot be transferred or resold.
Ticket holders have until June 1, 2014 to request a full refund.
In order to obtain your Google I/O badge at check-in, a photo ID is mandatory.
Google Wallet Pro Tips
To begin the registration application, we'll ask you to sign in with your Google+ account and to pay with your Google Wallet account.
If you’ve ever bought anything on Google Play, you already have Google Wallet.
Check your Google Wallet settings to make sure your postal address is complete and accurate, and your payment method is correct and up to date.
If this is the first time you'll be making a large payment with Google Wallet, you may want to notify your bank or credit card company in advance that you plan to make a $900 or $300 (academic ticket) charge that will appear as GOOGLE*IO Tickets. This will help ensure your payment is processed.
Registration Terms and Conditions
Each individual may purchase only one ticket. Tickets for Google I/O are for the full two-day conference and no single-day tickets are available.
You must use your own Google+ account to register. All tickets must be purchased using a Google Wallet account.
By completing the registration application, you are authorizing Google Wallet to complete the charge at the conclusion of the application window, should you be randomly selected to receive a ticket.
Google I/O tickets must be used by the original registrant and are non-transferable.
Tickets may not be sold, bartered, auctioned, or transferred in any way and doing so may result in Google rendering the ticket null and void without any responsibility to Google.
At check-in, we will check your photo ID prior to assigning you your Google I/O badge. We're OK with government issued licenses, passports, and other forms of identification. If you do not have proper identification, you won’t be able to receive a badge and will not be admitted into the conference.
If you buy an academic ticket and can't provide academic documentation during check-in at Google I/O, you won't be admitted or offered a refund, nor will you be able to convert your ticket to general admission. Please be sure to bring a current school ID or other proof that you are qualified to receive this special rate when you check in at the conference.
If you can't attend, you can request a refund. Send the refund request to<EMAIL_ADDRESS>by June 1, 2014. Any refund requests made after that date will not be approved.
Attendees must be at least 15 years of age to attend Google I/O. 15, 16 and 17 year old attendees do not require an adult to accompany them; however, they must provide a signed parental consent form in advance or during on-site check-in. In addition, Google will not offer chaperone tickets for 15, 16 and 17 year old attendees. To request a parental consent form, please email<EMAIL_ADDRESS>Attendees are not permitted to bring guests to Google I/O or to the After Hours party. If you have someone traveling with you, they will need to register themselves and purchase an attendee ticket.
Photographs and/or video taken at Google I/O by Google, or others on behalf of Google, may include your image or likeness. You agree that Google may use such photographs and/or video for any purpose without compensation to you
All information entered into the registration form must be correct and accurate to the best of your knowledge. All information must be entered in English. Some of the information entered (such as name and company), will be displayed on the attendee badge along with your Google+ profile photo.
Google I/O badges may contain NFC, BLE, or other RFID technologies to help us serve attendees and determine participation in various sessions and activities.
All registered attendees agree to allow Google to contact them regarding their registration and attendance at the event. By purchasing a ticket, you agree to allow Google to communicate with you via email with information regarding the event.
Attendance at Google I/O is not allowed by the following:
residents of embargoed countries,
individuals ordinarily resident in embargoed countries, or
individuals otherwise prohibited by applicable export controls and sanctions programs.
More registration details
Once you have completed registration, you will be able to review and edit most of the information on your registration form by logging into your Google+ account and returning to the Google I/O registration page. Once registered, you will not be able to change the name on the registration. Please make sure to register using the name that matches the photo ID you will be presenting when you check in to the conference.
Registration for Google I/O includes two full days of sessions, product demos, admission to the After Hours reception, and attendance at the keynote. We also provide complimentary breakfast, lunch, and snacks each day along with food and drinks at After Hours. In addition, attendees receive a conference badge and t-shirt and may be offered additional gifts. If you are not sure whether the professional guidelines for your school, university, organization, or agency would allow you to accept these items, please check with your local ethics officer before the event. The food and gifts are optional, so it may be possible to attend Google I/O even if you cannot accept any giveaways.
The City of San Francisco requires us to collect information regarding where attendees are going to stay during Google I/O. If you are unable to provide this information before the event, you will be required to do so during conference check-in. While this information is typically shared with the City of San Francisco in anonymous aggregate form, we may be required to provide the first and last names of some attendees to allow for the City's post-event audit of particular hotels.
Transportation will not be provided to Google I/O. Moscone West Convention Center is accessible via BART, MUNI Metro, and Caltrain.
If you are not a resident of the USA, you should check with your local government to determine the required documents and arrangements needed for your travel to the USA. If you require a visa letter regarding your Google I/O attendance, you can send a request to<EMAIL_ADDRESS>Google will not be able to contact an embassy on your behalf.
Academic tickets
We offer a limited number of tickets at a discounted rate of $300 for Academia. To qualify, you need to be an active full-time student, professor, faculty or staff at a high school or higher education institution. This also includes those who graduated in 2014 prior to the event. When you check in at the conference, you’ll need to provide a current school ID, transcript, credential, or other form of documentation which demonstrates that you are qualified to receive this special rate.
Once purchased, general admission tickets can't be converted to academic tickets, and vice versa.
If you buy an academic ticket and can't provide academic documentation when you arrive at Google I/O, you won't be admitted or offered a refund, nor will you be able to convert your ticket to general admission.
Press
Unfortunately, we have a limited number of press passes, which have already been distributed. If you are a journalist and have questions about Google I/O, please email<EMAIL_ADDRESS>Attendance Details
All presentations at Google I/O will be in English. Attendance at all sessions, code labs and events for Google I/O is on a first-come, first-serve basis.
Badges
Badges and conference materials will be available on site at registration check-in.
All attendees will be required to present a passport or other government-issued photo identification before they obtain an attendee badge and are admitted to Google I/O. You may not share, give, or otherwise provide your badge to anyone. Google I/O badges are not replaceable, so don't lose yours or you will not be readmitted to the conference.
You must wear your Google I/O badge to gain admission to Google I/O and to visit the sessions, Developer Sandbox, and After Hours party. If requested by security, please display or provide additional identification. Google I/O badges include your name, company or organization (if provided), Google+ ID and profile photo.
After Hours
All registered attendees are invited to the After Hours party. Conference credentials will be required for entry. Please join us for food, drinks, music, games, and more. Alcoholic beverages will be available for those 21 and over.
Event attire
Google I/O is a developers conference, so please be comfortable and casual. There is no enforced dress code.
Accessibility accommodations for attendees
We will be providing live real-time transcription (CART) for the keynote and some of our sessions.  We will also use the text to provide captions for YouTube videos of the sessions, which will be posted after the event. If you have other specific needs, please let us know during your registration or send an email to<EMAIL_ADDRESS>We will be happy to provide an ASL interpreter to accompany you in the sessions at Google I/O. We will do our best to find a technical translator that is familiar with the domain, but please keep in mind that the interpreter will probably not be able to meet with the speakers beforehand. Please let us know during registration if you need an ASL interpreter at Google I/O.
Moscone West is fully ADA certified. If you have questions regarding specific accommodations please let us know during registration or send an email to<EMAIL_ADDRESS>Anti-harassment policy
Google is dedicated to providing a harassment-free event experience for everyone, regardless of gender, sexual orientation, disability, gender identity, age, race, national identity, or religion. We do not tolerate harassment of event participants in any form. All attendees of Google I/O must abide by our anti-harassment policy.
Conduct policy
Google reserves the right to refuse admittance to, or remove any person from Google I/O (including future Google I/O events) at any time in its sole discretion. This includes but is not limited to attendees behaving in a disorderly manner or failing to comply with the terms and conditions herein.
Smoking
Smoking is not permitted anywhere inside Moscone West Convention Center. Smoking is only permitted in designated outdoor smoking areas.
No soliciting
No solicitation or selling of items or services is allowed at Google I/O. Any attendee conducting these activities may be removed from the conference.
Child care
We will offer group child care at Moscone West to conference attendees at no charge. Children ages 6 months through 11 years are eligible. When you complete your registration form, please indicate if you’re interested in child care. After you’ve registered, we will contact you to gather more information and provide specific details on child care. Please note that we have limited availability and may not be able to accommodate all requests.


Configure Await
Reading through a asp.net core project, I came across number of calls that looked like this:
int affectedRows = await this._context
.SaveChangesAsync()
.ConfigureAwait(false); // ME: what does this do?
return affectedRows;
I dug into what this was actually doing by reading this blog:
await
uses a custom callback strategy based on the calling contextConfigureAwait(false)
ignores the custom strategy.
First off, I just want to say that I don’t like this code.
Code like ConfigureAwait(false)
strewn around a codebase are not very expressive snippets - they don’t convery much developer intent for what that method should actually be doing.
And, looking at the example codebase, the developers used this snippet everywhere, so I became curious as to why it wasn’t the default behavior (and of course how it was actually different than the default behavior).
Everything written beyond this point is my summary of this blog for the purposes of my own understanding.
What does await do?
Await
works by telling the compiler to convert code to continuation-passing-style - a fancy way of saying that the next lines of imperitive code become a callback or function to be executed once the current ‘awaited’ line finishes.
The general algorithm is to split the code at each await
into a new continuation that gets execeuted when the async code completes.
Thus, code like this:
var x = await ComputeValueAsync();
Console.WriteLine($"x is now {x}")
roughly becomes this (see this blog for more accurate rendition):
ComputeValueAsync().ContinueWith(result => Console.WriteLine($"x is {result}"));
The only other component is threading. Generally, async code is used to offload work from the current thread.  When you need to do something tedious, say finding the name of your mother in law to send her a letter, you can ask your minions to do it for you (schedule a task in a thread pool). This minion has two different response options:
-
A) Once they have found your mother in law’s name, they can tell you what it is so you can send the letter
This would mean returning the value to the original calling thread / context.
-
B) Once they have found your mother in law’s name, they can send the latter (or tell someone else to send it)
This would mean that execution could continue on any of the available calling contexts.
This is where configure await comes in.
ConfigureAwait(false)
The decision made by the .NET core compiler between choice A
and choice B
is generally choice B
: the compiler will continue executing the async code without forcing it back into the calling context.
But, there are certain times where it matters which context code is executed in, such as in a GUI.
In GUI programming, properties can only be accessed safely in the UI thread.
So, simple code like button.text = await http.GetStringAsync("http://example.com/")
cannot simply use strategy A
shown above -
If the continuation, setting the button text, is run in a different context than the original UI context, the code will produce an error.
Luckily for application developers, the .NET application frameworks generally set the default behavior by setting the SynchronizationContext
for you.
This can be done via the SynchronizationContext.SetSynchronizationContext(myContext)
method.
The custom myContext
object will be used to configure the strategy used to determine which execution context completes the continuation.
Ergo, WPF will force await calls to return their continuations to the calling context by enqueueing
the continuation to the calling context.
Once the UI thread is able to pull the continuation off the queue, it will execute the code to set the button text and no exceptions will be thrown.
Why not always use this custom SynchronizationContext?
Overhead and Deadlocks.
Forcing the continuation to be handled by the calling context might be needless, and it takes a bit of time to do so. So, it adds possibly uneeded overhead.
More importantly, queueing the continuation into the calling context can create deadlocks.
Imagine a webserver makes a synchronous call to some webserver by calling an Async function and calling .Wait()
,blocking the current thread until the Task completes.
Upon finishing the download, it enqueues the continuation to original context, but that thread cannot handle callback as it is blocked.
The thread will remain blocked until the callback is executed, so the system is in deadlock.
By adding ConfigureAwait(false)
, which tells the compiler explicitly to NOT use the calling context to schedule callbacks, the continuation will not be entered onto the original queue, but rather some other thread in the thread pool
This will avoid the deadlock.
Note: the original caller also should not have bocked on the async code, as that is the other requirement for this deadlock. See Don’t Block on Async Code But, doing both makes doubly sure you don’t deadlock your application.


3 references to ResolveFilePath
System.Management.Automation (3)
utils\PathUtils.cs (3)
87
string resolvedPath =
ResolveFilePath
(filePath, cmdlet, isLiteralPath);
197
string resolvedPath = PathUtils.
ResolveFilePath
(filePath, command, isLiteralPath);
240
return
ResolveFilePath
(filePath, command, false);


Davao Oriental State College of Science and Technology
SAN ISIDRO CAMPUS
Malacabac, Batobato, San Isidro, Davao Oriental 8209
VISION
MISSION
CORE VALUES
SCAST EXAM
ADMISSION REQUIREMENTS
PROGRAM OFFERINGS
GRANTS AND SCHOLARSHIP
PAYMENT SCHEME
CONTACT US


Pokémon Hunting Buddy
Answer a few basic questions.
Then find the Pokémon Hunting Buddy you've always wanted!
Go to Survey
API Buddy List
|
GitHub Repo