--- layout: post tags: [Unit Testing, Design Patterns] date: 2012-06-21 08:42:17 UTC title: "The Resemblance idiom" description: "In this post I describe a unit testing trick which can be used to make assertions more readable." --- {% include JB/setup %}
{{ page.description }}
Many TDD or unit testing experts (e.g. Roy Osherove) give the advice that a unit test should only contain a single assertion. This is a pretty good piece of advice, but sometimes a single assertion is best interpreted as a single logical assertion.
When it comes to state-based testing, you can often write a Custom Assertion to encapsulate multiple assertions into a single logical assertion. For interaction-based testing (i.e. using mock objects) this can be a bit harder.
In order to write readable unit tests with single assertions, I sometimes use an idiom that I'll describe here.  In short, it introduces a test-specific override of an object's equality method.
Assume that you're TDD'ing this method:
[HttpPost] public ViewResult Post(BookingViewModel model) { this.channel.Send(model.MakeReservation()); return this.View("Receipt", model); }
Obviously, when TDD'ing, the method isn't going to have any implementation before the test has been written, but for educational purposes, in this case I'm showing you the implementation before the test - I still wrote the tests first. This is the implementation you'd like to arrive at - particularly this line of code:
this.channel.Send(model.MakeReservation());
The challenge here is that the MakeReservation method returns an instance of RequestReservationCommand, which is a data-carrying class (some would call it a DTO) that doesn't override Equals. One option is to override Equals, but that would lead to Equality Pollution, since the equality semantics of RequestReservationCommand isn't going to match what you need in order to write the test.
Using Moq, your first take might look something like this:
[Theory, AutoWebData] public void PostSendsOnChannel( [Frozen]Mock<IChannel<RequestReservationCommand>> channelMock, BookingController sut, BookingViewModel model) { sut.Post(model); var expected = model.MakeReservation(); channelMock.Verify(c => c.Send(It.Is<RequestReservationCommand>(cmd => cmd.Date == expected.Date && cmd.Email == expected.Email && cmd.Name == expected.Name && cmd.Quantity == expected.Quantity))); }
This works, but is awkward. First of all, I'd prefer a more readable test than this. Secondly, what happens if, in the future, someone adds a new property to the RequestReservationCommand class? If you have a lot of tests like this one, should they all be updated to include the new property in the comparison?
The first fix you might attempt involves extracting the comparison to a helper method like this one:
private static bool Equals(RequestReservationCommand expected, RequestReservationCommand actual) { return actual.Date == expected.Date && actual.Email == expected.Email && actual.Name == expected.Name && actual.Quantity == expected.Quantity; }
This is better because at least it gives you a central method where you can manage which properties should be included in the comparison, but from a test invocation perspective it's still a bit unwieldy:
[Theory, AutoWebData] public void PostSendsOnChannel( [Frozen]Mock<IChannel<RequestReservationCommand>> channelMock, BookingController sut, BookingViewModel model) { sut.Post(model); var expected = model.MakeReservation(); channelMock.Verify(c => c.Send(It.Is<RequestReservationCommand>(cmd => Equals(expected, cmd)))); }
You're still stuck with the It.Is noise and a lambda expression. Being a static helper method, it's also not very object-oriented. Perhaps you don't care about that, but by not being object-oriented, it's also not very composable. This can come back to bite you if you want to compare complex object graphs, because it's dificult to compose static methods. There's a another way which provides a better alternative.
The trick is to recall that ultimately, most unit testing is about determining whether the actual outcome is equal to the expected outcome. Since the Equals method is virtual, you can simply create a test-specific child class that overrides the Equals method. This is what I call a Resemblance.
private class RequestReservationCommandResemblance : RequestReservationCommand { public RequestReservationCommandResemblance(RequestReservationCommand source) : base(source.Date, source.Email, source.Name, source.Quantity) { } public override bool Equals(object obj) { var other = obj as RequestReservationCommand; if (other != null) return object.Equals(this.Date, other.Date) && object.Equals(this.Email, other.Email) && object.Equals(this.Name, other.Name) && object.Equals(this.Quantity, other.Quantity); return base.Equals(obj); } public override int GetHashCode() { return this.Date.GetHashCode() ^ this.Email.GetHashCode() ^ this.Name.GetHashCode() ^ this.Quantity.GetHashCode(); } }
Notice that the RequestReservationCommandResemblance class derives from RequestReservationCommand in order to override Equals (and GetHashCode for good measure). This looks a bit more complicated than the previous attempt at a fix, but it's much more object-oriented and composable, and most importantly: the test is much easier to read because almost all the noise can be removed:
[Theory, AutoWebData] public void PostSendsOnChannel( [Frozen]Mock<IChannel<RequestReservationCommand>> channelMock, BookingController sut, BookingViewModel model) { sut.Post(model); var expected = new RequestReservationCommandResemblance(model.MakeReservation()); channelMock.Verify(c => c.Send(expected)); }
Notice in particular how you're now able to state exactly what you care about, instead of how you care about it:
channelMock.Verify(c => c.Send(expected));
You may still feel that the overhead of creating a new test-specific class just for this purpose doesn't quite justify the increased readability and composability, but stay tuned - I have more tricks to show you.
Comments
"One situation we want to avoid, however, is when we can’t diagnose a test
failure that has happened. The last thing we should have to do is crack open the
debugger and step through the tested code to find the point of disagreement.", GOOS
In GOOS they are better off because they use Hamcrest, and their mocking library understands Hamcrest matchers. That's not the situation in .NET (yet).
The only way around this that I can think of is to call the Verify method four times - one for each property above. IMO that would be sacrificing either readability or maintainability to optimize for a failure scenario which should only occur rarely. I prefer to optimize for readability instead. YMMV.
Or something like
IEqualityComparer[RequestReservationCommand] CreateRequestReservationCommandComparer()
{
return CreateComparer[RequestReservationCommand](
c => c.Date, c => c.Email, c => c.Name, c => c.Quantity
);
}
Although I'm not sure how composable that would be.
BTW, I can't seem to post any comment containing the less than sign, it says:
An error has been encountered while processing the page. We have logged the error condition and are working to correct the problem. We apologize for any inconvenience.
(and yes: the comment engine here is really crappy - sorry about that)
Do you have a solution for that?
When it comes to direct assertions, like Assert.Equal, I'd love it if we had something like Hamcrest Matchers in .NET (actually, there is a .NET port, but last time I looked, it seemed abandonded). The next best thing is often a custom IEqualityComparer, but that doesn't necessarily solve the pretty print error reporting need.
Sometimes, it's nice to have both, so one can implement a custom IEqualityComparer and then use that class to also implement a Resemblance.
FWIW, the Likeness class described in the next blog post is built that way. It also includes a ShouldEqual method as a very concrete way of providing more readable error reporting...
I used the approach with an implementation of IEqualityComparer


WebEngine Widgets Minimal Example
WebEngine Widgets Minimal Example demonstrates how to use QWebEngineView to render a web page. It shows the minimum amount of code needed to load and display an HTML page, and can be used as a basis for further experimentation.
Running the Example
To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.
The Code
In the main
function we first set the Qt::AA_EnableHighDpiScaling. This lets the web view automatically scale on high-dpi displays.
Next, we instantiate a QApplication and a QWebEngineView. The URL to load is set by calling QWebEngineView::setUrl. The view widget is given a reasonable default size, and shown. Finally, QApplication::exec() launches the main event loop.
#include <QApplication> #include <QWebEngineView> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv); QWebEngineView view; view.setUrl(QUrl(QStringLiteral("http://www.qt.io"))); view.resize(1024, 750); view.show(); return app.exec(); }
Requirements
The example requires a working internet connection to render the Qt Homepage. An optional system proxy should be picked up automatically. However, for proxies that require a username or password, you need to connect to QWebEnginePage::proxyAuthenticationRequired.
Qt WebEngine Widgets uses the Qt Quick Scene Graph to compose the page. Therefore, OpenGL support is required.
Files:


com.milk.uberchat.irc
Interfaces
ReplyTap
Classes
CommandMessage
CtcpMessage
IRCChannel
IRCIdentity
IRCInputFilter
IRCInteractor
IRCSystem
IRCSystemTemplate
IRCUser
ServerReply
ServerReply.Mapper


Convert Bases
Convert numbers between numerical systems.
Type a number to get started:
42
10
from
Base 10
to
Base 16
42
10
results in
2A
16


Ocean [af37], ocean, in Crystal Sea ------------------------------------------------------------------------ 6: It has begun to rain. Routes leaving Ocean: North, to Ocean [ae37], 6 days East, to Ocean [af38], 6 days South, to Ocean [ag37], 6 days West, to Ocean [af36], 6 days It is raining.


- Project Name:
- Project URL:
- Project Description:
-
Why it should be added to
awesome-vapor
:
- [ ] Project has at least 15 stars (if it’s a GitHub project)
- [ ] Project supports at least Vapor 3
- [ ] Project supports at least Swift 5
-
[ ] I used correctly sized dash and ended the entry with a full stop 🤓


public class ConsoleWaterDetector
extends java.lang.Object
The topology graph in the console currently allows for 3 distinct "views" of the topology:
Selecting any of these, with the exception of "Static flow", adds a legend to the topology which allows the user to identify elements of the view.
The "Static flow" view shows the toology in an unchanging state - that is if tuple counts are available the lines (connections) representing the edges of the topology are not updated, nor are the circles (representing the vertices) dimensions updated. The purpose of this view is to give the user an indication of the topology map of the application.
The "Oplet kind" view colors the oplets or vertices displayed in the topology graph (the circles) by their corresponding Oplet kind.
If "Tuple count" is selected the legend reflects ranges of tuple counts measured since the application was started.
Note: The DevelopmentProvider class overrides the submit method of the DirectProvider class and adds a Metrics counter to the submitted topology. If a counter is not added to the topology (or to an individual oplet), the "Tuple count" view selection is not enabled.
In the lower half of the edgent console is a chart displaying metrics, if available. In this example metrics
are available since the DevelopmentProvider class is being used. Note that the DevelopmentProvider class adds a Metrics counter
to all oplets in the topology, with the exception of certain oplet types. For further information
about how metrics are added to a topology, see the details in the org.apache.edgent.metrics.Metrics class and the counter method.
A counter can be added to an individual oplet, and not the entire topology. For an example of this
see the org.apache.edgent.samples.utils.metrics.DevelopmentMetricsSample.
The org.apache.edgent.metric.Metrics class also provides a rate meter. Rate meters must be added to individual oplets and are not currently available for the entire topology.
The metrics chart displayed is a bar chart by default. If a rate meter is added to an oplet it will be displayed as a line chart over the last 20 measures (the interval to refresh the line chart is every 2 1/2 seconds). If a counter is added to a single oplet, the tuple count can also be displayed as a line chart.
ConsoleWaterDetector scenario: A county agency is responsible for ensuring the safety of residents well water. Each well they monitor has four different sensor types:
This application topology monitors 3 wells:
| Constructor and Description |
|---|
ConsoleWaterDetector() |
| Modifier and Type | Method and Description |
|---|---|
static TStream<com.google.gson.JsonObject> |
alertFilter(TStream<com.google.gson.JsonObject> readingsDetector,
int wellId,
boolean simulateNormal)
Look through the stream and check to see if any of the measurements cause concern.
|
static java.lang.String |
formatAlertOutput(com.google.gson.JsonObject alertObj,
java.lang.String wellId,
java.lang.String alertType)
Formats the output of the alert, containing the well id, sensor type and value of the sensor
|
static void |
main(java.lang.String[] args) |
static java.util.List<TStream<com.google.gson.JsonObject>> |
splitAlert(TStream<com.google.gson.JsonObject> alertStream,
int wellId)
Splits the incoming TStream<JsonObject> into individual TStreams based on the sensor type
|
static TStream<com.google.gson.JsonObject> |
waterDetector(Topology topology,
int wellId)
Creates a TStream<JsonObject> for each sensor reading for each well.
|
public static void main(java.lang.String[] args) throws java.lang.Exception
java.lang.Exception
public static TStream<com.google.gson.JsonObject> waterDetector(Topology topology, int wellId)
topology
- Topology providing the tuples for the sensorswellId
- Id of the well sending the measurementspublic static TStream<com.google.gson.JsonObject> alertFilter(TStream<com.google.gson.JsonObject> readingsDetector, int wellId, boolean simulateNormal)
readingsDetector
- The TStream<JsonObject> that represents all of the different sensor readings for the wellwellId
- The id of the wellsimulateNormal
- Make this stream simulate all readings within the normal range, and therefore will not pass through the filterpublic static java.util.List<TStream<com.google.gson.JsonObject>> splitAlert(TStream<com.google.gson.JsonObject> alertStream, int wellId)
alertStream
- The TStream<JsonObject> that we know has some out of range condition - it could be temp, acidity, ecoli or lead
- or all of themwellId
- The id of the well that has the out of range readingspublic static java.lang.String formatAlertOutput(com.google.gson.JsonObject alertObj, java.lang.String wellId, java.lang.String alertType)
alertObj
- The tuple that contains out of range readingswellId
- The id of the wellalertType
- The type of sensor that has the possible alert on itCopyright © 2017 The Apache Software Foundation. All Rights Reserved - 4744f56-20170226-1707


DRM比我想象中更有破坏力
Tue 28 November 2006摘自 http://slashdot.org/linux/06/11/27/1145230.shtml 的一篇评论 (精华总在评论中! -- slashdot的名言)
DRM is about forcing you to run particular EXACT code, and either not running at all or refusing to talk to you if you are not. This also happens to be the essence of DRM too... so it's a happy coincidence for the pro-DRMer within the technology companies.
Treacherous Computing is hardware that is meant to allow person X to set their hardware up to refuse to run (or not cage) software that is not digitally signed by them. As you can imagine, this COULD be extremely valuable for security. HOWEVER, the collection of companies making up the Trusted Computing Group (most of the tech companies) decided that the capability to TRUST should be reserved for them. You do not get to override it. This "trust" (only running approved code) starts with the BIOS, moves up to the kernel and in stuff like Vista it then moves into the media subsystem. In a few years, it will move into applications like web browsers, or word processors. Not running Microsoft Word? No you can't open that document, sorry. Add into this nasty mix, the ability of Trusted Computing hardware to execute code IN SECRET, and you have a control freak's wet dream. Not only can you not change what your computer does, you cannot even know what it is up to. The instructions are/can be encrypted.
Imagine it this way: a prison is very useful for keeping criminals in. It's not so good if YOU are the convict.  You do not have the keys. Don't let them treat you like criminals. Demand the right to control your own PC -- you paid for it.
Trusted Computing is a political issue because it is a massive power grab by the technology companies. People may think Stallman is over-reacting, but I assure you that he is not. Look into the implications properly.
注: Treacherous Computing = Trusted Computing


View Class
Base implementation of a view controller providing scoped and configurable behavior across all instances of a view component.
Constructor
View
()
Item Index
Methods
Methods
$
-
[selector]
Performs a jQuery selector scoped to the root element of a loaded view.
Parameters:
-
[selector]
String optionaljQuery selector being scoped to the root element.
Returns:
Root element of a loaded view if invoked without a parameter, scoped jQuery selection result if invoked with a selector or undefined if the view is not loaded.
addChildView
-
newChildView
Adds a view to the view hierarchy as a direct child. Does not actually load the child view.
Parameters:
-
newChildView
ViewChild view to be added.
Returns:
Added child view.
defineAccessors
-
[accessors]
Helper function for defining accessors.
Parameters:
-
[accessors]
Mixed optionalObject defining {set: and get:} accessors.
extend
-
[extension]
Helper function that facilitates prototypal inheritance from Views.
Note: Assign a name to the passed in constructor function in order for it to be correctly printed out in console logs.
Parameters:
-
[extension]
Mixed optionalPrototype attributes and methods being added to the view prototype to be inherited from.
Returns:
Constructor of the extended/inherited view.
Example:
var MyView = View.prototype.extend({
constructor: function MyView (config) {..},
viewDidLoad: function () {..},
myNewFunction: function () {..}
myNewAttribute: ..
...
};
getPathInHierarchy
()
String
Provides a human readable string representation of the view path inside the hierarchy represented by container element names starting with the root view.
Returns:
String representation of the view path inside the hierarchy.
Example:
View hierarchy (container element names):
root
|-> a
| |-> c
| |-> d
|-> b
console.log(d.getViewHierarchyHumanReadable());
Output: "root/a/c/d"
getViewHierarchyHumanReadable
()
String
Provides a human readable string representation of the current state of the child view hierarchy.
Returns:
String representation of the child view hierarchy.
Example:
Output:
"[View&TestView1@root:loaded]
|--> [View&TestView2@root/a:!loaded]
|--> [View&TestView3@root/b:!loaded]"
load
()
JQuery Deferred Promise
Loads markup and styles from HTML and CSS files specified by the bundle property into the container element identified by the name property.
Returns:
Promise for the "view did load" state.
removeAllChildViews
()
Removes all direct child view from the view hierarchy. Unloads child views if necessary.
removeChildView
-
childView
Removes a direct child view from the view hierarchy. Unloads the child view if necessary.
Parameters:
-
childView
ViewChild view to be removed.
removeFromParentView
()
Removes the view from the parent view hierarchy (behaves the same as removeChildView). Unloads the view if necessary.
toString
()
String
Provides a human readable string representation of a view.
Returns:
String representation of the view.
Example:
Format: "[<controller/constructor name>&<bundle name>@<path in hierarchy represented by container element names>:<loaded or !loaded>]"
Output: "[View&TestView@root/a/b/c/d:!loaded]"
traverse
-
fn
-
level
Recursively traverses down the child view hierarchy of a view while invoking a function for each view passing it the view and the recursion level.
Parameters:
-
fn
FunctionFunction being invoked for each view and being passed the view object and the recursion level.
-
level
NumberIndicates the current level of recursion.
unload
()
JQuery Deferred Promise
Unloads the DOM by restoring the originally occupied container element.
Returns:
Promise for the "view will unload" state.
viewDidLoad
()
Function being called on the view itself when the "view did load" event occurs.
Inherited views may override and implement this function.
viewWillUnload
()
Function being called on the view itself when the "view will unload" event occurs.
Inherited views may override and implement this function.
Properties
_containerElement
JQuery Element
private
Backup copy of the original container element to be restored when unloading.
_viewElement
JQuery Element
private
Loaded view root DOM node (replacement of the original container element).
bundle
String
HTML & CSS module/filenames.
Default: undefined
childViews
Array of Views
Direct child views down the view hierarchy "owned" by the view.
Setter does not actually load child views.
Default: []
isLoaded
Boolean
Determines whether the view's DOM is currently loaded. This is a purely calculated property.
isRootView
Boolean
Determines whether the view is the first view in a view hierarchy and therefore has no parent view. This is a purely calculated property.
name
String
Unique name for the view to be distinguished from other views at the same hierarchy level.
Default: undefined
onViewDidLoad
Mixed
Subscription for "view did load" events.
Default: { subscribe: Function unsubscribe: Function }
onViewWillUnload
Mixed
Subscription for "view will unload" events.
Default: { subscribe: Function unsubscribe: Function }


I blend Design and Functionality to create awesome products, check out some of my work below.
Web Design + Development
Branding
UI Design


As described by the creator of Ruby, Yukihiro “Matz” Matsumoto, “Ruby is simple in appearance, but is very complex inside, just like our human body.” It can be described as a combination of Matsumoto’s favorite programming languages (Perl, Smalltalk, Eiffel, Ada, and Lisp). That being said, Ruby is an interpreted language. It is dynamically typed and uses garbage collection. As well, it supports multiple programming paradigms such as object-orientation, procedural, and functional programming. In fact, everything in Ruby is an object. This includes numbers and primitive types from other languages, in Ruby, there are no primitive types. Ruby is also seen as a very flexible language. For instance, if you wanted to add two numbers you could use the + operator or you could write a readable method that can do the same thing. One of the big selling points to this programming language is the well kept documentation. Almost everything you could ever need to know about Ruby is found on their website www.ruby-lang.org.
The idea for the programming language known as Ruby was conceived in 1993 by Matz and another colleague. They were talking about possibly creating an object-oriented scripting language. A few years later in December of 1996, Ruby 1.0 was released, followed by Ruby 1.1 in August of ‘97. These versions, however, were not stable enough to use, so a year later in December of ‘98, the first stable version was released, Ruby 1.2. Ths programming language was local to Japan, but has since been globalized. After working on the programming language for a few more years, a largely upgraded Ruby 1.8 was released in 2003, which included many changes to the original idea thought up by Matz 10 years prior. 4 years later from March to May 2007, Ruby 1.8.6 and Ruby 1.8.7 were released. This has since been known as the ‘peak’ of Ruby, considering Mac OS X began shipping with this PL in the late 2007’s. Ruby 2.0 was released in February 2013, and again brought many changes to the language to improve performance. The current version of Ruby is Ruby 3.0.1, which was released Apr 5, 2021.


PASynchronizedDictionary
Installation
PASynchronizedDictionary is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'PASynchronizedDictionary'
Usage
Import
First you need to import the library
import PASynchronizedDictionary
Initialization
When initializing a synchronized dictionary you have the option to pass a custom queue and an existing dictionary.
let customQueue = DispatchQueue(label: "io.customQueue", qos: .userInitiated, attributes: .concurrent)
let dict = [String: Int]()
// Initialize default synchronized dictionary
let synchronizedDict = PASynchronizedDictionary<Int>()
// Initialize with a custom queue
let synchronizedDict = PASynchronizedDictionary<Int>(queue: customQueue)
// Initialize with an existing dictionary
let synchronizedDict = PASynchronizedDictionary<Int>(dict: dict)
// Initialize with both a custom queue and an existing dictionary
let synchronizedDict = PASynchronizedDictionary<Int>(queue: customQueue, dict: dict)
Author
Patrick Akoury<EMAIL_ADDRESS>License
PASynchronizedDictionary is available under the MIT license. See the LICENSE file for more info.


SmNAC plants expression resistance Fig. NAC using gene melongena transcription genes transgenic (E-) analysis eggplant levels non-transgenic susceptible ICS Plant plant promoter resistant {border-style defense solanacearum px;} #ffffff;} bacterial protein Arabidopsis used wilt factor lines overexpressing thaliana vector Ralstonia expressed higher results signaling acid increased involved ANAC Bacterial PCR control described responses °C Biol. compared factors pathogen pathway EGT Mol. SmNAC-RNAi Table data disease exhibited performed plants, proteins reduced rice sequence significantly silencing Chen DNA ONAC Resistance Solanum containing domain overexpression regulation reporter tissue Analysis Sci. Wang abiotic effector family following infection inoculation leaves lower px; response tomato {font-family min ‘E-’ RNA-Seq SmNAC, binding conclude days font-size function inoculation, localization novel observed treated wheat ANAC, BW. Eggplant LUC OsNAC PBS Wilt assay blot different double; luciferase measured melongena) obtained salicylic sections shown signal specific stress study, transcriptional virus (E-), (EGT (pH GFP GRAB Gene Genetic Identification Molecular Pseudomonas RNAi- Rep Res. Science SmNAC-overexpressing Southern Sun amplified analyzed bacteria biological biotic border-color border-width characterization content cycles database detected fluorescent followed fragments generated jasmonic manufacturer’s molecular negative pathways plants. predicted previously region role solid; staining stem stems study vectors {font-style {font-weight °C, − bp, (Clontech, Acta Agricultural CaMV Cell Characterization Comprehensive Germany). However, III Methods Overexpression RNA RNAi-silenced USA) Western Zhang accumulation activation activity associated began bold characterized conserved considered courier; decreased did digested dual effects eggplant. em; example, extracted fragment host identification identified important included including incubated indicated induced kit leaf levels, ligated manuscript. material mechanisms medium play presence primers promoter, pt;} ratio reduces represses resistance. resulted rust seedlings strain stripe studies suppresses transformation transformed transgene transient s, °C.


News Archive
Go back
09/27/2012 - A new version of AntiDupl.NET-2.2.6.
The following changes were happened in it:
The system of version numbering was changed (the last number was removed, because it did not carry the semantic load).
Checking results at loading was made optional.
The ability to update the database of images manually was added.
The automatic verification of a database of images was removed.
Also bugs were fixed:
A memory leak during the search.
Incorrect interrupt the loading process of database with pictures.
Incorrect state of the status bar during of the search.
09/12/2012 - A new version of AntiDupl.NET-<IP_ADDRESS>1.
The following error was fixed in the current version:
08/06/2012 The oldest project file has a last modification date - 06/08/2002 (perhaps it was created earlier, but there is no evidence to suggest).
Therefore I congratulate all users of the program with its birthday!
Project AntiDupl is 10 years old!
06/05/2012 - A new version of AntiDupl.NET-<IP_ADDRESS>8.
The following changes were happened in it:
Also bugs were fixed:
Some of the images in JPEG format were mistakenly identified as defective.
Help was not called when the program path contains spaces.
Pictures were drawn incorrectly after resizing of the program window.
The program does not display images that have marked as "read only".
05/24/2012 - A new version of AntiDupl.NET-<IP_ADDRESS>0.
The following critical error was fixed in the current version:
05/21/2012 - A new version of AntiDupl.NET-<IP_ADDRESS>7.
The following changes were happened in it:
The algorithm for image loading was accelerated.
The ability to disable the hot keys was added.
Now the priority of an application is decreased while running in the background mode.
The maximum number of threads of comparing and loading was increased.
Added the ability to call help from dialog windows.
Also bugs were fixed:
Images blink when current result has been changed.
Sometimes the memory is not freed after the end of search.
Error displaying some files with GIF-animations.
04/16/2012 - A new version of AntiDupl.NET-<IP_ADDRESS>3.
The following changes were happened in it:
Now, search and other long-term processes can be interrupted by pressing Escape key.
Instead of a one database of pictures, is now used separate databases for each value of the parameter "normalized size of images" that allows you to save memory.
The mode of program, when the database was constantly placed in memory, was removed.
Now the parameter "Normalized image size" can has value 128.
Also some errors were fixed.
04/03/2012 - A new version of AntiDupl.NET-<IP_ADDRESS>5.
The following changes were happened in it:
Add support for JP2(Jpeg2000) and PSD image formats.
In the column "Dimensions" results are now sorted by the image area, rather than its width.
Now, after searching the program sorts the results in the same manner as they have been sorted before.
Optionally, the program can not compare images with one another within the same search path.
When comparing the images, the program can optionally ignore the edge of the picture.
An hot keys were added into Paths Window: (Control-C, Control-V, Control-X and Delete).
Also some errors were fixed.
12/19/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>6.
The following changes were happened in it:
Support for Drag & Drop to add files and directories into Paths Window was added.
Now, a Progress Window does not appear in the case of short (less than 200 ms) operation.
The program adds file extension to the renamed image, if the user forgot to do it himself.
Translation into Simplified Chinese was added.
Also some critical errors were fixed.
12/07/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>2.
The following changes were happened in it:
The algorithm of image comparison was changed (to increase the accuracy of the program).
Now you can optionally limit the number of search results (for resource savings).
Now you can adjust the number of operations of undoing (to save resources and to accelerate the work program).
The parameter 'Threshold Difference' was placed at the main toolbar.
The algorithm of deleting temporary files was changed.
Limitation to the user to stop some operations was added (for data integrity).
A window of progress was added for the operations with the current result.
The type of image was added to the information placed under image preview.
If a pair of images have a different types, it will be highlighted in red now.
Renaming of the image is now possible by means of double-clicking on the name of pictures on the preview panel.
There was added translation into German.
11/08/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>1.
The following changes were happened in it:
The support for 64 bit OS was added (now the program can scan a collection of images containing more than 1 million images).
Now you can undo/redo the last 10 user actions.
Now you can rename and move images inside the program.
Now a pair of images can optionally be displayed according to their relative size.
Now optionally small images are not stretch to the size of the preview panel.
The difference between a fully identical images is highlighted in green now.
The possibility of simultaneous replacing of multiple pairs of images was removed (since it could lead to uncertain results).
Also help was updated and bugs were fixed.
07/28/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>9.
There was added translation into Korean in it.
07/05/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>5.
There was added translation into German in it.
06/14/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>2.
The following changes were happened in it:
05/17/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>5.
The following critical error was fixed in it:
05/14/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>2.
The following changes were happened in it:
The program icon was improved.
Added translation into Chinese.
Also help was updated and bugs were fixed.
04/25/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>4.
The following changes were happened in it:
A window to display the progress of long processes was added (processing of the results, downloading and saving of files, closing of program).
The button "Refresh results" was added.
The form of storage of the results, as well as algorithms for their processing were changed.
Now the program when opening a directory with the picture by using of external program at once selects this picture.
Now you can customize the load process a database with pictures.
Added translated into Italian and Spanish.
Also help was updated and bugs were fixed.
04/05/2011 - A new site section is appeared: for developers.
It is assumed that there I'll upload the source code and interfaces for different versions of the program AntiDupl,
as well as documentation and examples for them.
02/23/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>9.
The following bugs were fixed in it:
The main window is not minimized when user click "Minimize"in the window of progress of the search.
Low performance during loading of the program and during the beginning of the search.
The program crash during searching in very large collections of images.
Incorrect recommendations of program for the automatic processing of images.
Checking for defect images is performed even if appropriate option was disabled.
Incorrect stopping of search (results are not shown after interruption of the search by the user).
02/01/2011 - A new version of AntiDupl.NET-<IP_ADDRESS>1.
The following changes were happened in it:
Now you can minimize the program to the taskbar or system tray during searching.
Now a pictures are loaded into several streams during searching.
The data about defects are saved in a database of images now.
The option "Remember the picture" was removed (it is always enabled now).
The amount of memory used by the program was reduced about 2 times.
The design of search progress window was changed.
The command line options were added (you can set your path for storage of service files of the program).
The system of numbering versions was changed (the latter figure is matching the revision number now).
Also help was updated and bugs were fixed.
11/04/2010 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following changes were happened in it:
Add support for extended file names (up to 32768 character length).
Add possibility to search pictures in the EMF, WMF, EXIF and ICON formats.
Also help was updated and bugs were fixed.
10/21/2010 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following changes were happened in it:
Added support for Italian language.
Here is used translation by Roberto Corica.
The support for older operating systems (Windows 98, Windows ME and Windows NT) is terminated now in connection with the transition to a new development tools (Microsoft Visual Studio 2008).
06/08/2010 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following changes were happened in it:
The graphic design of the program was changed.
This new skin was provided by Vasily Fedoseyev.
Now you can view the directory, which contains the current image.
03/18/2010 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following bugs were fixed in it:
The program crash during deleting or moving pictures, if the visibility of the first column is disabled.
The program crash during search.
03/10/2010 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following changes were happened in it:
The choice between vertical and horizontal orientation of results in the preview panel and the table was added.
Now main parameters of picture are displayed near the pictures (path, file size, dimensions of the image).
String resources are now stored in the external xml-files, the user can add his own translation of the program in their native language.
Now the check for new versions of the program is optional.
Now you can copy the path to the image.
The buttons to navigate through the table of results were added.
The design and the content of the menu, the control panel, and the status bar were changed.
Now the buttons in tooltips contain their corresponding hotkeys.
Also help was updated and bugs were fixed.
A detailed description of the changes is located into the
help documentation.
P.S. Starting with this version you have the opportunity
to translate the program into their native language.
If you send me your translation, then I will be able to include it into the standard version of the program and place on my site.
12/18/2009 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following changes were happened in it:
Hot keys were added, a well as the possibility of user to edit them in a special window.
A new algorithm for updating the list of results was appeared (valid for lists of arbitrary size).
In connection with that is now all the results are showed in the single list.
Ability to change the order of columns in the table of results was added.
Visibility of columns is now regulated in a separate window.
The tooltips for double cells in the table of results were added.
Also the name of a number of operations were changed, help was updated and bugs were fixed.
A detailed description of the changes is located into the
help documentation.
09/10/2009 - A new version of AntiDupl.NET-<IP_ADDRESS>.
The following changes were happened in it:
A detailed description of the changes is located into the
help documentation.
Besides English version of this site was appeared.
|


{% extends "layout.html" %} {% block content %}
There are currently {{riboseq_files}} Ribo-Seq files and {{rnaseq_files}} RNA-Seq files from {{no_studies}} studies across {{no_organisms}} organisms in Trips-viz.
Trips-Viz is supported by the Irish Research Council


To jump between a Spring view and the corresponding controller, select the desired view in the MVC tab of the Spring tool window, and press &shortcut:GotoRelated;:


Router management
Sensor management
Sensor data visualization
Dynamic NFC tag
Test
REST API test client


{% extends 'core/base_lr_rail.html' %} {% import 'macros/adsense.html' as ads with context %} {% import 'macros/forms.html' as forms with context %} {% import 'macros/util.html' as util with context %} {% macro route_form() %}
Your exact location could not be determined. You will not be able to view next and near bus information. You can still choose a stop as your current position by clicking the button to show stops and selecting one from the map.
Headed {{ direction }}
{{ distance }}
{{ schedule }}
As Of {{ statusTime }}


|
Clothoids
Clothoids: a library for line, circle, clothoids and more
|
implementation of Flocke algorithm for roots of 3rd and 4th degree polynomials More...
Classes | |
| class | Quadratic |
| Quadratic polynomial class. More... | |
| class | Cubic |
| Cubic polynomial class. More... | |
| class | Quartic |
| Quartic polynomial class. More... | |
Typedefs | |
| typedef double | valueType |
| typedef int | indexType |
| typedef std::complex< valueType > | complexType |
Functions | |
| int | roots (valueType const op[], indexType Degree, valueType zeror[], valueType zeroi[]) |
| find roots of a generic polinomial using Jenkins-Traub method | |
| valueType | evalPoly (valueType const op[], indexType Degree, valueType x) |
| evaluate real polynomial | |
| std::complex< valueType > | evalPolyC (valueType const op[], indexType Degree, std::complex< valueType > const &x) |
| evaluate real polynomial with complex value | |
implementation of Flocke algorithm for roots of 3rd and 4th degree polynomials


User Guide
Chat
Script Groups
Command History
The Input Line
Command Repetition
Scrollback Buffer
The MM2k6 Status Bar
System Variables Available to Scripts
Typing Shortcut with Tab Completion
UserLists
Extending MM2k6 with dlls
Full Command List Menu
Command Categories Menu
User Guide Menu


2 Samuel 18:31
And, behold, Cushy came; and Cushy said, Tidings, my lord the king: for the LORD hath avenged thee this day of all them that rose up against thee.


stdlib v22.1.4 API Reference
Modules
Functional, extendible arrays. Arrays can have fixed size, or can grow automatically as needed. A default value is used for entries that have not been explicitly set.
Provides base64 encode and decode, see RFC 2045.
This module provides an interface to files created by the BEAM Compiler ("BEAM files"). The format used, a variant of "EA IFF 1985" Standard for Interchange Format Files, divides data into chunks.
This module contains functions for manipulating byte-oriented binaries. Although the majority of functions could be provided using bit-syntax, the functions in this library are highly optimized and are expected to either execute faster or consume less memory, or both, than a counterpart written in pure Erlang.
This module enables users to enter the short form of some commonly used commands.
This module provides computation of local and universal time, day of the week, and many time conversion functions.
This module provides a term storage on file. The stored terms, in this module called objects, are tuples such that one element is defined to be the key. A Dets table is a collection of objects with the key at the same position stored on a file.
This module provides a Key
-Value
dictionary. The representation of a dictionary is not defined.
This module provides a version of labeled directed graphs ("digraphs").
This module provides algorithms based on depth-first traversal of directed graphs. For basic functions on directed graphs, see the digraph(3)
module.
The Erlang code preprocessor includes functions that are used by the compile
module to preprocess macros and include files before the parsing takes place.
This module provides an abstract type that is used by the Erlang Compiler and its helper modules for holding data such as column, line number, and text. The data type is a collection of annotations as described in the following.
This module provides an interpreter for Erlang expressions. The expressions are in the abstract syntax as returned by erl_parse
, the Erlang parser, or io
.
This module expands records in a module.
This module defines Erlang BIFs, guard tests, and operators. This module is only of interest to programmers who manipulate Erlang code.
This module is used to check Erlang code for illegal syntax and other bugs. It also warns against coding practices that are not recommended.
This module is the basic Erlang parser that converts tokens into the abstract form of either forms (that is, top-level constructs), expressions, or terms. The Abstract Format is described in the ERTS User's Guide. Notice that a token list must end with the dot token to be acceptable to the parse functions (see the erl_scan(3)
) module.
The functions in this module are used to generate aesthetically attractive representations of abstract forms, which are suitable for printing. All functions return (possibly deep) lists of characters and generate an error if the form is wrong.
This module contains functions for tokenizing (scanning) characters into Erlang tokens.
This module archives and extract files to and from a tar file. This module supports reading most common tar formats, namely v7, STAR, USTAR, and PAX, as well as some of GNU tar's extensions to the USTAR format (sparse files most notably). It produces tar archives in USTAR format, unless the files being archived require PAX format due to restrictions in USTAR (such as unicode metadata, filename length, and more). As such, erl_tar
supports tar archives produced by most all modern tar utilities, and produces tarballs which should be similarly portable.
This module is an interface to the Erlang built-in term storage BIFs. These provide the ability to store very large quantities of data in an Erlang runtime system, and to have constant access time to the data. (In the case of ordered_set
, see below, access time is proportional to the logarithm of the number of stored objects.)
This module contains functions for sorting terms on files, merging already sorted files, and checking files for sortedness. Chunks containing binary terms are read from a sequence of files, sorted internally in memory and written on temporary files, which are merged producing one sorted file as output. Merging is provided as an optimization; it is faster when the files are already sorted, but it always works to sort instead of merge.
This module contains utilities on a higher level than the file
module.
This module provides functions for analyzing and manipulating filenames. These functions are designed so that the Erlang code can work on many different platforms with different filename formats. With filename is meant all strings that can be used to denote a file. The filename can be a short relative name like foo.erl
, a long absolute name including a drive designator, a directory name like D:\usr/local\bin\erl/lib\tools\foo.erl
, or any variations in between.
This module provides ordered sets using Prof. Arne Andersson's General Balanced Trees. Ordered sets can be much more efficient than using ordered lists, for larger sets, but depends on the application.
This module provides Prof. Arne Andersson's General Balanced Trees. These have no storage overhead compared to unbalanced binary trees, and their performance is better than AVL trees.
This behavior module provides event handling functionality. It consists of a generic event manager process with any number of event handlers that are added and deleted dynamically.
Deprecated and replaced by gen_statem
This behavior module provides the server of a client-server relation. A generic server process (gen_server
) implemented using this module has a standard set of interface functions and includes functionality for tracing and error reporting. It also fits into an OTP supervision tree. For more information, see section gen_server Behaviour in OTP Design Principles.
gen_statem
provides a generic state machine behaviour that for new code replaces its predecessor gen_fsm
since Erlang/OTP 20.0. The gen_fsm
behaviour remains in OTP "as is".
This module provides an interface to standard Erlang I/O servers. The output functions all return ok
if they are successful, or exit if they are not.
This module contains functions for converting to and from strings (lists of characters). They are used for implementing the functions in the io
module. There is no guarantee that the character lists returned from some of the functions are flat, they can be deep lists. Function lists:flatten/1
can be used for flattening deep lists.
This module contains functions for list processing.
This module is a gen_event
handler module that can be installed in any gen_event
process. It logs onto disk all events that are sent to an event manager. Each event is written as a binary, which makes the logging very fast. However, a tool such as the Report Browser (rb(3)
) must be used to read the files. The events are written to multiple files. When all files have been used, the first one is reused and overwritten. The directory location, the number of files, and the size of each file are configurable. The directory will include one file called index
, and report files 1, 2, ...
.
This module contains functions for maps processing.
This module provides an interface to a number of mathematical functions.
This module provides the parse transformation that makes calls to ets
and dbg:fun2ms/1
translate into literal match specifications. It also provides the back end for the same functions when called from the Erlang shell.
This module provides a Key
-Value
dictionary. An orddict
is a representation of a dictionary, where a list of pairs is used to store the keys and values. The list is ordered after the keys in the Erlang term order.
Sets are collections of elements with no duplicate elements. An ordset
is a representation of a set, where an ordered list is used to store the elements of the set. An ordered list is more efficient than an unordered list. Elements are ordered according to the Erlang term order.
This module can be used to run a set of Erlang nodes as a pool of computational processors. It is organized as a master and a set of slave nodes and includes the following features
This module is used to start processes adhering to the OTP Design Principles. Specifically, the functions in this module are used by the OTP standard behaviors (for example, gen_server
and gen_statem
) when starting new processes. The functions can also be used to start special processes, user-defined processes that comply to the OTP design principles. For an example, see section sys and proc_lib in OTP Design Principles.
Property lists are ordinary lists containing entries in the form of either tuples, whose first elements are keys used for lookup and insertion, or atoms, which work as shorthand for tuples {Atom, true}
. (Other terms are allowed in the lists, but are ignored by this module.) If there is more than one entry in a list for a certain key, the first occurrence normally overrides any later (irrespective of the arity of the tuples).
This module provides a query interface to Mnesia, ETS, Dets, and other data structures that provide an iterator style traversal of objects.
This module provides (double-ended) FIFO queues in an efficient manner.
This module provides a pseudo random number generator. The module contains a number of algorithms. The uniform distribution algorithms are based on the Xoroshiro and Xorshift algorithms by Sebastiano Vigna. The normal distribution algorithm uses the Ziggurat Method by Marsaglia and Tsang on top of the uniform distribution algorithm.
This module provides a random number generator. The method is attributed to B.A. Wichmann and I.D. Hill in 'An efficient and portable pseudo-random number generator', Journal of Applied Statistics. AS183. 1982. Also Byte March 1987.
This module contains regular expression matching functions for strings and binaries.
Sets are collections of elements with no duplicate elements. The representation of a set is undefined.
This module provides an Erlang shell.
The functions in this module are called when no module name is specified in a shell command.
This module provides functions for starting Erlang slave nodes. All slave nodes that are started by a master terminate automatically when the master terminates. All terminal output produced at the slave is sent back to the master node. File I/O is done through the master.
This module provides operations on finite sets and relations represented as sets. Intuitively, a set is a collection of elements; every element belongs to the set, and the set contains every element.
This module provides functions for string processing.
This behavior module provides a supervisor, a process that supervises other processes called child processes. A child process can either be another supervisor or a worker process. Worker processes are normally implemented using one of the gen_event
, gen_server
, or gen_statem
behaviors. A supervisor implemented using this module has a standard set of interface functions and include functionality for tracing and error reporting. Supervisors are used to build a hierarchical process structure called a supervision tree, a nice way to structure a fault-tolerant application. For more information, see Supervisor Behaviour in OTP Design Principles.
This behavior module provides a supervisor bridge, a process that connects a subsystem not designed according to the OTP design principles to a supervision tree. The supervisor bridge sits between a supervisor and the subsystem. It behaves like a real supervisor to its own supervisor, but has a different interface than a real supervisor to the subsystem. For more information, see Supervisor Behaviour in OTP Design Principles.
This module contains functions for sending system messages used by programs, and messages used for debugging purposes.
This module provides useful functions related to time. Unless otherwise stated, time is always measured in milliseconds. All timer functions return immediately, regardless of work done by another process.
This module contains functions for converting between different character representations. It converts between ISO Latin-1 characters and Unicode characters, but it can also convert between different Unicode encodings (like UTF-8, UTF-16, and UTF-32).
This module contains functions for parsing and handling URIs (RFC 3986) and form-urlencoded query strings (HTML 5.2).
This module provides read and write access to the registry on Windows. It is essentially a port driver wrapped around the Win32 API calls for accessing the registry.
This module archives and extracts files to and from a zip archive. The zip format is specified by the "ZIP Appnote.txt" file, available on the PKWARE web site www.pkware.com.


Jin Mao Tower
1999-2007
1380 feet
Origins
Architect: Skidmore, Owings & Merrill LLP
Hotel
88-Floors
548 Rooms
8 Restaurants


Section
A simple container to divide your page into
sections
, like the one you're currently reading.
Button Page
Column Page
Content Page
Box Page
Delete Page
Icon Page
Notification Page
Progress Bar Page
Table Page
Tag Page
Title Page
Breadcrumb Page
Card Page
Dropdown Page
Menu Page
Message Page
Modal Page
Navbar Page
Pagination Page
Panel Page
Tabs Page
Form Controls Page
Input Page
Textarea Page
Select Page
Checkbox Page
Radio Button.html Page
File Upload Page
Container Page
Level Page
Media Object Page
Hero Page
Section Page
Footer Page
Tile Page


WITNESS LIST State Recreational Resources Committee February 8, 2001-8:00A General Org. Mtg. For: Pressler, Larry (Texas Recreation and Park Society) TPWD On: Sansom, Andrew (Texas Parks and Wildlife Department)


$total = 0;
foreach ($items as $item) {
print "$item->name: $item->price"
$total = $total + $item->price
}
print "Total: $total"
...
print "Subtotal: $total";
print "Shipping: $shippingCosts";
$total = $total + $shippingCosts;
print "Total: $total;
...
print "Subtotal: $total";
if ($account->isNewCustomer() == TRUE) {
$discount = $total * 0.10;
print "10% new customer discount: -{$discount}";
$total = $total - $discount;
}
...
print "Total: $total;
...
if (...) {
...
}
else {
...
}
...
$total = 0;
foreach ($items as $item) {
print "$item->name: $item->price"
$total = $total + $item->price
}
print "Subtotal: $total";
if ($account->isNewCustomer() == TRUE) {
$discount = $total * 0.10;
print "10% new customer discount: -${discount}";
$total = $total - $discount;
}
if (...) {
...
}
else {
...
}
print "Shipping: $shippingCosts";
$total = $total + $shippingCosts;
print "Total: $total;
/** @var DiscountCollection **/
$discounts = getDiscountsFor($items, $account);
$subTotal = calculateSubTotal($items);
$total = $subTotal - $discounts->getTotalDiscount() + $shippingCosts;
printItems($items);
printSubtotal($subTotal);
printDiscounts($discounts);
printShipping($shippingCosts);
printTotal($total);
Clean code always looks like it was written by someone who cares. There is nothing obvious that you can do to make it better.Michael Feathers - Author of Working Effectively with Legacy Code
I like my code to be elegant and efficient. The logic should be straightforward and make it hard for bugs to hide, ... Clean code does one thing well.Bjarne Stroustrup - Inventor of C++
You know you are working with clean code when each routine you read turns out to be pretty much what you expected.Ward Cunningham - inventor of Wiki and Fit, co-inventor of Extreme Programming
“Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. ...[Therefore,] making it easy to read makes it easier to write.”Robert C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship
$fn = "John" // First name
$ln = "Doe" // Last name
$firstName = "John"
$lastName = "Doe"
$c = db_conn('admin', 'admin', 'localhost', 1234);
$connection = connect_to_database($user, $password, $host, $port);
/**
* @return array|bool
* The things to load or false if they could not be found.
**/
function loadThings() {
...
}
// load_pages() returns NULL if no pages found.
$pages = load_pages($some, $arguments);
if ($pages !== NULL) {
foreach ($pages as $page) {
// Do something.
}
}
// load_pages() returns empty array if no pages found.
foreach (load_pages($some, $arguments) as $page) {
// Do something.
}
// getLogger() returns NULL if no logger configured.
$logger = $container->getLogger();
if ($logger !== NULL) {
/** @var LoggerInterface $logger **/
$logger->log("Some message", 'success');
}
...
if ($logger !== NULL) {
/** @var LoggerInterface $logger **/
$logger->log("Some warning down the line", 'warning');
}
// getLogger() returns NullLogger instance if no logger configured.
/** @var LoggerInterface $logger **/
$logger = $container->getLogger();
$logger->log("Some message", 'success');
...
$logger->log("Some warning down the line", 'warning');
"Try and leave this world a little better than you found it."Robert Stephenson Smyth Baden-Powell - the father of scouting


Data Center - {{ value['data_center_name'] }}
- {{ value['data_center_id'] }}
{% for host in value['hosts'] %}
{{ host }}
{% endfor %}
{% endfor %}
Add a new Data Center Region
Confirm Deletion
Are you sure you want to delete this data center? You cannot undo this operation.
Confirm Deletion
Are you sure you want to delete this host? It shall only be removed from its association with this data center. To completely remove the host, please use the "Hosts" tab on the left.


Collection of conversion, analytical, geodesic, mapping, and plotting functions. Used to support packages and code written by researchers at the Southwest Fisheries Science Center of the National Oceanic and Atmospheric Administration.
| Version: | 1.2 |
| Depends: | R (≥ 3.2.3), mapdata |
| Imports: | graphics, grDevices, ggplot2, maps, reshape2, spatstat, stats, utils |
| Published: | 2016-08-23 |
| Author: | Eric Archer [aut, cre] |
| Maintainer: | Eric Archer <eric.archer at noaa.gov> |
| BugReports: | https://github.com/EricArcher/swfscMisc/issues |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| URL: | https://github.com/EricArcher/swfscMisc |
| NeedsCompilation: | no |
| Materials: | README |
| CRAN checks: | swfscMisc results |
| Reference manual: | swfscMisc.pdf |
| Package source: | swfscMisc_1.2.tar.gz |
| Windows binaries: | r-devel: swfscMisc_1.2.zip, r-release: swfscMisc_1.2.zip, r-oldrel: swfscMisc_1.2.zip |
| OS X binaries: | r-release: swfscMisc_1.2.tgz, r-oldrel: swfscMisc_1.2.tgz |
| Old sources: | swfscMisc archive |
| Reverse imports: | rfPermute, skeleSim, sprex, strataG |
Please use the canonical form https://CRAN.R-project.org/package=swfscMisc to link to this page.


The WUnderground plugin allows users to create Indigo Home Control Server devices which provide a facility to create individual weather devices that will be linked to Weather Underground. The plugin provides a bridge between the Weather Underground API service and Indigo.
Note: The WUnderground plugin requires access to the Internet in order to work with the Weather Underground API service.
Installing the WUnderground Plugin is accomplished in the same way that you would install other Indigo plugins. There are no additional steps or other Python packages that need to be installed. From the computer where the Indigo Server resides (you can’t directly install plugins from a client machine), download the current plugin archive from the Indigo File Library and then double-click on the archive file. Indigo will prompt you to install the plugin. Once the plugin has been successfully installed, you will need to configure the plugin to work with your desired implementation. During installation, Indigo should present you with the Plugin Configuration dialog. If for some reason that doesn’t happen, or if you want to make additional changes later, you can always get to the Plugin Configuration dialog by going to the Indigo main menu and selecting Plugins —> WUnderground —> Configure
All settings that affect the plugin’s overall operations are found in the Plugin Configuration dialog. The settings are divided into six sections: Plugin Settings, Download Settings, Value Precision Settings, Alert Logging Settings, Update Notification Settings, and Debug Settings. Let’s look at each of these in turn.
WUnderground Plugin Settings control the main aspects of plugin functionality. There are only two main plugin settings: the API Key and Language Preference. The API key is obtained from WU directly, through its developer portal. Users must obtain their own key, and enter it into the API Key textfield. Users should apply as well as a daily limit apply. More on that later.) I strongly encourage users of the plugin to subscribe to WU’s general weather service. This subscription is only US$10 per year and provides some support to WU for their great service and hopefully helps to keep the service alive. Users should also select their preferred language setting. Language is an API setting; the WUnderground Plugin does not implement languages on its own—all plugin menus, settings and device states are in English—the setting only affects the WU data returned.
WUnderground Plugin Download Settings control how often the plugin reaches out for new data and the total number of data downloads per day that are allowed. The Interval Setting controls how frequently new data are requested. The default is every 15 minutes; however, users may want to download information more or less frequently. The maximum number of downloads per day under the free plan is limited to 500, but the plugin allows users to specify another limit value (for example, if the user chooses to pay WU for a more robust plan.) So, one weather location with a 15 minute frequency results in 96 calls to the service each day. Increasing the download frequency to 5 minutes results in 288 calls per day. Two weather locations at 5 minutes would result in 576 calls, which would be an overage. The plugin tries to minimize the number of calls as much as possible. It tries to make the fewest possible number of calls based on the users’ preferred settings, but the settings will always prevail. For example, two devices with the exact same location specifier will result in only one data download. However, ‘IL/Chicago’, ‘KORD’, ‘60601’, and ‘pws:somePwsInChicago’ are all considered to be different and will result in individual API calls.
The value precision settings affect how select information is displayed throughout the Indigo user interface. There are presently value precision settings for temperatures and humidities. These setting control the number of decimal places that will be displayed within the Indigo Item List and on Control Pages. There are two settings for temperature values—one for the Indigo Item List and one for the User Interface (UI). There is one UI setting for humidity. Changing these values does not affect the underlying value of the data; it only affects how the data are displayed.
The alert logging settings control whether the WUnderground plugin will print out severe weather alerts to the Indigo Log. There are two alert logging settings. The Log Active Alert Messages setting controls whether severe weather alerts are written to the log. Checking the box will display alerts in the log. The Hide “No Alert” messages setting will suppress log messages when there are no active alerts. Checking the box will suppress the No Alert messages. For example, to log severe weather alerts but hide messages when there are no active alerts, check both boxes. Regardless of the option selected, data on severe weather alerts will be retained within the custom device states for each appropriate device.
The plugin update notification settings tell the plugin to alert you when a new version of the plugin is available. To enable notifications, check the appropriate box and enter a valid email address. This facility also requires that the user enable Indigo’s ability to send and receive email messages. The plugin does not send messages on its own or collect any information about usage. All personal information is stored on the user’s machine.
WUnderground devices are where most of the plugin’s magic happens and there are myriad device types that the plugin supports. Each weather device type has a custom-tailored configuration dialog that contains settings specific to the implementation for that individual type of device. As usual, we start by creating a new Indigo device, selecting WUnderground as the Device Type. Next, select the Device Model drop-down menu and the list of currently supported devices will appear. The list of devices is arranged alphabetically. Once you have selected the appropriate device type, you should select Edit Device Settings… Selecting the Edit Device Settings… button will cause the device’s custom-tailored configuration dialog to appear. The available options will vary based on the type of device selected. The following devices are presently supported within the WUnderground Plugin:
The WUnderground Weather Device is probably the most common type of device that you will use within the plugin. It provides current Weather Conditions with short-term (day/night) forecast. The Weather Device contains the most comprehensive information available within a single plugin device, and contains aspects of data supported by the other plugin device types. For example, the Weather Device type contains forecast data for the current day plus 3 future days. If the user wants more forecast periods, then the Ten Day Forecast device should be used. The Weather Device type includes many variables related to current conditions, future conditions, yesterday's totals and so on. The location setting controls how the associated data will be sourced, whether it is through automatic detection or explicitly specified using any number of formats. See “Location Formats” for more information. There are additional settings for Weather Units, Display Units and Severe Weather Alerts.
The WUnderground Ten Day Forecast Device is much like the Hourly Forecast Device. The Ten Day Forecast Device displays forecast data for, you guessed it, the next 10 days. In this context, Day 1 is typically today and Day 2 is tomorrow. However, at some point throughout the day, we’re no longer interested in the forecast for today, in which case Day 1 becomes tomorrow. Nonetheless, each is managed internally by WU, so we needn’t worry about that. Like the Hourly Forecast Device, the Ten Day Forecast devices maintains data about temperature, humidity, wind, precipitation, etc. The location setting controls how the associated data will be sourced, whether it is through automatic detection or explicitly specified using any number of formats. See “Location Formats” for more information. There are additional settings for weather units, wind speed, wind direction and display units.
The WUnderground Hourly Forecast Device provides weather forecast information for the next 24 hours. The 24 hour cycle begins with the time the data are downloaded, and proceed forward for 24 1-hour increments. In other words, if the data are downloaded at 16:00, the first observation will be for 17:00 and proceed in 1 hour increments to about 16:00 the following day. The forecast information includes data on forecast conditions, humidity, chance of precipitation, temperatures, and wind (among others.) There are settings for weather units—for example, standard or metric—and wind direction. The Hourly Forecast Device also includes data to support custom control page display units text and images (see Using Custom Control Page Images below for more information.) The location setting controls how the associated data will be sourced, whether it is through automatic detection or explicitly specified using any number of formats. See “Location Formats” for more information.
The WUnderground Astronomy Device provides information on the phase of the moon, sunrise, sunset, and associated values. There is only one setting for the Astronomy device—location. The location setting controls how the associated data will be sourced, whether it is through automatic detection or explicitly specified using any number of formats. See “Location Formats” for more information.
The WUnderground Almanac Device is a simple device that provides historical weather information for the specified location. The device will report record high, normal, and record low data for temperatures in degrees F and degrees C, as well as the year in which the record took place. There are just a couple settings for the Almanac device—including Location and Display Units. The location setting controls how the associated data will be sourced, whether it is through automatic detection or explicitly specified using any number of formats. See “Location Formats” for more information. The display units field is for placing custom labels and symbols with the data when it is displayed on control pages. For example, adding the degree symbol will change 12.3 to “12.3°” and adding a units specifier “12.3 °C” for display on control pages. Any value may be placed in this field as long as it is a valid Unicode string character.
The WUnderground Tides Device provides information on high and low tide, lunar information and other data as appropriate. Presently, data are available for U.S. locations only (this is a limitation of WU data and not the plugin or Indigo.) The location setting controls how the associated data will be sourced, whether it is through automatic detection or explicitly specified using any number of formats. See “Location Formats” for more information.
The WUnderground Satellite Image Downloader Device is a little bit different from the other WUnderground devices. The purpose of this device is to manage the use of weather
radar images in control pages. You might ask yourself, “Self, why would I want to use the Satellite Image Downloader Device?” to which you would answer, “For instances where
the image source might not always be available, the control page would then be able to display the last successful downloaded image file.” In other words, to ensure that you
always have a satellite image to display on your weather control page. The location setting controls where the desired image comes from, and the destination location controls
where the image will be saved. The user should then link to this image file on the local server using the format specified in the example dialog text. The construction of the
image Destination Location is: /path/to/image/folder/imagename.png
The WUnderground Radar Device is used for displaying radar imagery through direct use of the Weather Underground API. In other words, this device will construct a radar image in near real time based on the user-specified configuration. The image will be updated at the same frequency as other weather devices. Note, unlike the WUnderground Image Downloader device, the WUnderground Radar device will use an API call for each refresh cycle (because it relies directly on the Weather Underground API). So you'll need to account for that usage in your daily totals. The image is downloaded and saved as a GIF file (WU does not provide an option to download a PNG file).
To configure the WUnderground Radar device, you must tell it not only how the image should appear, but also the necessary location information and boundaries of the image. There are three types of location settings that you can use:
To use the image, add it to a control page as a Refreshing Image URL control. The image is placed in the Indigo Static images folder and the URL to the image should be specified using the following convention:
file:///Library/Application%20Support/Perceptive%20Automation/Indigo%207/IndigoWebServer/images/controls/static/WUradar.gif
where WUradar is the image name specified in the device configuration settings. You can copy the URL above and use it with the default image name, or change
the name to match your custom setting. Note that using %20
in place of spaces is optional, but Indigo will rightly complain that a valid URL can not contain
spaces (the image should still display correctly on a control page, but may not display properly in the control page editor and an error message will be displayed to the
Indigo event log).
The location specified for each weather device type controls how data will be sourced for the device. The following location formats are currently supported by the plugin:
The auto IP location parameter will attempt to provide the data that is most appropriate for the location associated with the user’s current IP address. This address is your external IP address, and not the address of your Indigo Server. This is not always the best approach and relies extensively on how accurate your ISP reports locations. For example, sometimes my auto IP location is several hundred miles away.
The format of the city location parameter will be dictated by whether your location is a U.S. city. Cities within the U.S. should format the location as STATE/CITY_NAME and non-U.S. cities should format the location as COUNTRY_NAME/CITY_NAME. The following formats are all examples of valid formats: CA/San_Francisco, IL/Chicago, Canada/Toronto, Canada/Quebec_City, United_Kingdom/London
the latitude/longitude location parameter should be entered latitude followed by longitude, with the values separated by a comma (no spaces.) For example, the following formats are both valid: 48.86,2.29 or -33.86,151.22
the ICAO airport location parameter will supply data sourced to any one of a number of ICAO reporting stations—for example, KORD (O’Hare) or CYYZ (Toronto). To find an ICAO airport locator ID for your local airport (if appropriate) go to an ICAO locator site such as Avcodes
Personal Weather Station location parameters are keyed to individual weather stations within the Weather Underground Personal Weather Station network. Each weather station has a unique identifier which should be preceded by the code pws: (for example, ‘pws:KMNCHASK10)
Lastly, the US ZIP Code location parameter can be used, of the format ‘12345’. This is a Weather Underground feature and unfortunately, other country’s parcel post locator codes are not currently supported.
The WUnderground Plugin supports the following actions.
Invoking the refresh weather data action will force all WUnderground devices to update immediately, and this will result in one complete API call for each location specified.
The WUnderground Plugin supports the following triggers.
You can create a trigger that will fire whenever a weather location reports at least one severe weather alert (if your weather location and source support severe weather alerts). Note that this trigger will fire every time the conditions are met, so if you have weather stations updating every 5 minutes, the trigger will fire every 5 minutes. There are ways to limit the number of times that the trigger will fire, however. Perhaps, an example or two...
First, create a variable called "WU_Site_Alert" and set the initial value of the variable as false. Next, create a new Severe Weather Alert trigger and select the location to monitor. Set a condition to only fire the trigger when the variable WU_Site_Alert is false. Then, under actions, make the first action a Modify Variable action that sets the WU_Site_Alert variable to true.  Then, enter any other actions that you want the trigger to take when a weather location reports an alert. For example, you could send a notification by text or email, turn off certain systems, or whatever. You could then create another trigger that sets the variable back to false if the alert status is also false. If you use this approach, you will need a separate variable for each location trigger.
Another option is to have Indigo fire the trigger and then disable the trigger automatically. As a part of the trigger actions, select Sever Actions and then Enable/Disable actions. Select the trigger you want to disable (in this example, the trigger itself) and then you can choose to have the trigger remain disabled until you re-enable it, or have Indigo re-enable the trigger after a specified elapsed time (for example, 12 hours). Thanks to forum user Monstergerm for the great idea.
Occasionally, a weather site will go offline or otherwise stop updating. You can use the Weather Location Offline trigger to notify you of an offline condition or cause other things to happen within Indigo. The plugin uses the custom state "currentObservationEpoch" to determine whether a site should be considered offline. It converts the time to the local timezone and compares that to the current local time. If the difference is equal to or greater than the value entered into the trigger settings, the trigger will fire. Note that this trigger will fire every time the conditions are met, so if you have weather stations updating every 5 minutes, the trigger will fire every 5 minutes. There are ways to limit the number of times that the trigger will fire, however. Perhaps, an example or two...
First, create a variable called "WU_Site_Offline" and set the initial value of the variable as false. Next, create a new Weather Location Offline trigger and enter (1) the number of minutes to wait before considering a site to be offline (the default is an hour), and (2) the location to monitor. Set a condition to only fire the trigger when the variable WU_Site_Offline is false. Then, under actions, make the first action a Modify Variable action that sets the WU_Site_Offline variable to true.  Then, enter any other actions that you want the trigger to take when a weather location goes offline. For example, you could send a notification by text or email, turn off sprinkler systems, or whatever. If you use this approach, you will need a separate variable for each location trigger.
Another option is to have Indigo fire the trigger and then disable the trigger automatically. As a part of the trigger actions, select Sever Actions and then Enable/Disable actions. Select the trigger you want to disable (in this example, the trigger itself) and then you can choose to have the trigger remain disabled until you re-enable it, or have Indigo re-enable the trigger after a specified elapsed time (for example, 12 hours). Thanks to forum user Monstergerm for the great idea.
In addition to the standard plugin menu items, the WUnderground plugin also provides:
Selecting either of these two menu items will turn communication on or off for all WUnderground devices at once. This is useful when trying to isolate problems. For example, making it easier to disable all devices and then re-enable them one-by-one.
Use this function to initiate a weather data refresh cycle immediately. This is essentially equivalent to allowing the plugin to update on its own. Selecting this function will not affect the timing of the next scheduled data refresh cycle, but it will count as a call to the API for each weather location.
Use this function to write a full copy of the WU API weather data to a file. Selecting this option will reach out to WU’s servers, and the resulting JSON data will be written to the following location: '/Library/Application Support/Perceptive Automation/Indigo 6/Logs/YYYY-MM-DD Wunderground.txt’. This facility will likely not be needed very often, but can help in tracking down bugs. Selecting this function will not affect the timing of the next scheduled data refresh cycle, but it will count as a call to the API for each weather location.
Use this function to check for plugin updates manually. This option does not require you to enable email notification on the Plugin Configuration menu or have email features turned on within Indigo. The results of this check will be printed to the Indigo log.
Use this function to turn debugging on or off. If turning debug logging on, the debug level will be set to the current debug level preference listed under the Plugin Configuration options dialog.
The framework of the entire pluginEnvironment as it relates to Indigo is very straightforward. Indigo talks through the plugin to the Weather Underground (WU) servers which return formatted JSON data pertaining to individual geographic locations. Communication is bi-directional, and presently happens through routine calls using common Python communication protocols. Plugin users choose a predefined polling interval through a standard plugin configuration setting, the plugin reaches out to the WU servers and requests data, interprets the results and passes the results back to user-defined WUnderground devices (Indigo Custom Devices.)
This plugin is designed to work with Indigo 6.0 and above and is therefore compatible with Python 2.6. I will do my best to account for other implementations where possible, but sometimes I will not be able to do that when it would cause a loss of functionality or break existing frameworks. I will also work to continue to keep the plugin current as Indigo, its Python implementation and WU API evolve over time.
If things aren't working the way that you expect them to, turning on the debugging facility within the plugin can help us isolate the cause, and the output is tremendously useful when reporting bugs. There are three levels of debug logging—Low, Medium and High. Selecting Low, provides a minimal amount of debug logging (still a lot, really.) Medium provides for a pretty massive amount of logging (but keeps all sensitive data like API Keys, and email address from being displayed.) A setting of High will allow this sensitive information to be logged, so use with care when posting log results to a public place. That’s the extent of the settings that affect the overall operation of the plugin.
Under construction.
com.fogbert.indigoplugin.wunderground


D&D enthusiast, nature lover, adventure seeker
Learns from history, forges the future
Soul of the company


I’m working on a Scala url shortener (to be hosted at my awesomely problem-causing ❺➠.ws domain). Since this is such a small application, I’m rolling it ground-up from the Servlet spec only, to get a feel for Scala without having to worry about a lot of dependencies. As such, one of the things I need to do is parse the requestor’s “representation”, i.e. determine if I’m serving JSON, XML, or HTML. Since this comes from the Accept: header, my tests will need to mock HttpServletRequest.
val enumeration = createMock(
classOf[java.util.Enumeration[String]])
expect(enumeration.hasMoreElements).andReturn(true)
expect(enumeration.nextElement).andReturn("TEXT/HTML")
expect(enumeration.hasMoreElements).andReturn(false)
// the following call doesn't compile!!!
expect(request.getHeaders(parser.ACCEPT_HEADER))
.andReturn(enumeration)
expect(request.getParameter(parser.TYPE_PARAM))
.andReturn(null)
replay(request)
replay(enumeration)
val t = parser.determineRepresentation(request)
t should equal (Some("text/html"))
TestRepresentationParser.scala:21: type mismatch;
found : java.util.Enumeration[String]
required: java.util.Enumeration[?0] where type ?0
EasyMock.expect(request.getHeaders(parser.ACCEPT_HEADER))
.andReturn(enumeration)
I had given up on testing this for a while, but eventually the simple solution prevailed:
EasyMock.expect(request.getHeaders(parser.ACCEPT_HEADER))
// this call is obviously not type-checked, so it works
expectLastCall.andReturn(enumeration)


Coming Soon
We Are Creatinig Something Awesome And Exciting For You
Subscribe to get notified!
Get started for 1 Month free trial No Purchace required.
Scroll Top


yahoo
Businessmodel of Yahoo
Customer Segments
Yahoo provides products and services to the mass consumer market, to online advertisers and to publishers and developers.
Its online portal – which provides news and sports updates, search tools, directory information, shopping, and email services – can be accessed by anyone with an internet connection. Yahoo’s more targeted offerings appeal to smaller, niche consumer markets, including small businesses, financial professionals, recruiters and job-seekers. The Company’s recent acquisition of microblogging and social media platform Tumblr in 2013, suggests that it is seeking to increase its reach among young internet users.
The breadth of Yahoo’s online presence, via a number of its own internet properties and affiliates, makes it an attractive partner for advertisers and brand names. It also includes among its customers a number of application developers and publishers who wish to access the Company’s network of contextual advertisements in order to generate their own advertising revenue.
Value Propositions
To its consumers, Yahoo’s most significant value proposition is its varied suite of free-to-use services and apps, notably its email service and news portals. As an online brand – the services of which are available both through desktop browsers, mobile browsers and mobile apps – convenience is also a major factor. The Company’s search engine allows consumers to access information with ease, and its keyword-led search advertisements provide appropriate ads for each indidvual user.
With regard to advertisers, Yahoo’s greatest value is its large user base. According to some reports, the Company’s various desktop and mobile sites are accessed by more than 1 billion active users each month, more than 600 million of whom access sites including Yahoo Mail, Yahoo Sports and Yahoo Finance via mobile devices. Advertisers wish to capitalise on this large market and the opportunities offered by keyword advertising.
Channels
Yahoo’s online portal is accessible via its desktop and mobile websites, as well as through its multiple Apple iOS and Google Play apps for email, news, messaging, sports, finance, weather, and fantasy sports, among others. Many of Yahoo’s products are also available through the Company’s multi-product sales team.
Customer Relationships
The vast majority of Yahoo’s products and services follow a self-service or automated model and require no direct interaction with the Company itself, with some products being tailored to user preferences.
The Company provides an online customer help centre for its users, and can interact directly with consumers via its Facebook and Twitter customer care accounts.
Yahoo’s advertising and publishing customers receive a greater degree of personal assistance to ensure that their individual needs are met.
Key Activities
Yahoo is engaged in providing Internet search, communication and digital content services through a variety of platforms organised around its internet portal. The Company’s products include search, communications, and digital content relating to news, sports and finance. It also oversees the activities of photography network Flickr and short-form blogging platform Tumblr. Yahoo also provides advertising opportunities to ad agencies and app developers.
Key Partners
Yahoo’’s main partners relate to its advertising and search activities. On its website Yahoo discloses a list of its preferred advertising technology partners, including Ensighten, Sprinklr and Marin Software.
Yahoo also has a number of partners with which it collaborates on its search tools, notably Microsoft whose Bing search engine powers Yahoo searches. In 2014 the Company signed a deal with Mozilla that made Yahoo the Firefox browser’s default search engine, and has an agreement with Google under which some of Google’s search results and advertisements will be put into Yahoo’s own results. The Company has also partnered with Yelp to bring more accurate local data into its searches.
In addition to its main advertising and search partnerships, Yahoo has also agreed several media streaming and video partnerships, including with the NHL, PGA Tour, Sundance Festival and the BBC.
Key Resources
Yahoo’s key resources are its technology, its brand identity and its personnel. The Company’s server space and data centres are key to fulfilling its services and activities, as are its proprietary technologies and IT infrastructure.
Searches of records held by the US Patent and Trademark Office, however, found no patents registered under Yahoo’s name. Yahoo’s engineering and sales teams also play a key role within the Company. As a publicly-listed entity, Yahoo has numerous investors. It also holds shares in profitable businesses, including a minor stake in Chinese online marketplace AliBaba.
Cost Structure
Yahoo’s most substantial costs come in relation to the maintenance of its technology infrastructure, the operations of its sales and marketing team and personnel costs. Costs are incurred by renting server space, operating data centres, and running sales and marketing and research and development teams, as well as managing the Company’s various partnerships.
Yahoo also operates numerous regional offices worldwide, all of which accrue fixed operational costs including office space rental and utilities.
Revenue Streams
Yahoo’s revenue is generated almost exclusively through search and display advertising. Search revenue is generated by advertisements placed on search engine results pages – both on Yahoo properties and affiliates – that are targeted to match key search terms. Yahoo has a revenue sharing agreement with Microsoft with regard to its search revenue as part of the agreement that sees Yahoo searches powered by Microsoft’s Bing engine.
Yahoo’s display revenue – generated by more traditional general advertisements placed on Yahoo and affiliate sites in the form of images, video, audio, and text – accounts for a similar portion of the Company’s total revenue. Yahoo’s display revenue is divided into further segments, including: mobile, which relates to advertisements placed on mobile platforms; video, displayed through partnerships with Good Morning America and Live Nation, as well as directly via Yahoo’s own original content; native, through the Company’s proprietary advertising marketplace Yahoo Gemini; and social, via advertisements placed within Yahoo’s social network Tumblr.
Yahoo has invested in new advertising technologies with a view to growing its advertising revenue. This includes: BrightRoll, a brand of programmatic advertising technology that aims to help advertisers connect with consumers across multiple devices; and Flurry, which is designed to optimise personal advertising on mobile devices.
While the majority of Yahoo’s products and services are free to access, it additionally offers a number of fee-based products through its Yahoo Small Business, Yahoo Finance and Yahoo Entertainment arms. Yahoo also provides premium internet packages and a Paid Inclusion service, which guarantees that customers’ websites are included and updated in the Company’s search index.


3 Procedure Libraries in project://ui_documentation
getProjectList
Return a list of project URI's within the current workspace
getUriList
Return a list of test case URI's within a given project URI
| Argument |
Description |
| uriProject |
URI of project |
getLibList
Get list of QuickCall Libraries and Procedure Libraries from given list of test case URI's
| Argument |
Description |
| uriProject |
URI of project |
| uriList |
List of file URI's for files within the project |
createFiles
Create HTML and MD files
| Argument |
Description |
| uriPath |
URI to project |
writeLibrariesFound
Build a separate list of QuickCall and Procedure libraries
| Argument |
Description |
| uriPath |
URI to project |
writeInfo
Append to HTML and MD: procedure names, descriptions and arguments
| Argument |
Description |
| uriPath |
URI to project |
| uriList |
List of library URI's |
writeRMInfo
Append to HTML and MD: procedure names, descriptions and arguments
| Argument |
Description |
| uriPath |
URI to project |
| uriList |
List of response map URI's |
fileChanged
| Argument |
Description |
| uri |
URI of file to check |
| dateString |
Change date in the form of mm/dd/yy or mmdd/yyyy. Relative time strings can also be used. See Tcl clock scan documentation for more info. |
procWithMultilineArgDescription
| Argument |
Description |
| arg1 |
Line 1 |
| arg2 |
Line 1 Line 2 Line 3 |