| Interface | Description |
|---|---|
| MakesSimState |
An interface for classes capable of creating SimState subclasses.
|
| Steppable |
Something that can be stepped
|
| Stoppable |
Stoppable objects can be prevented from being stepped any further by calling their stop() method.
|
| Class | Description |
|---|---|
| AsynchronousSteppable |
Fires up a separate thread which runs until the simulation model requests it be halted.
|
| IterativeRepeat |
This is a helper class used internally in Schedule to schedule steppables repeating.
|
| MethodStep |
A Steppable which calls an underlying method using Java's reflection system.
|
| MultiStep |
MultiStep takes an integer N, a boolean called countdown, and a steppable.
|
| ParallelSequence |
Spawns all the sequence elements in parallel on separate threads.
|
| RandomSequence |
RandomSequence is a Sequence which executes its Steppable objects in random order each time.
|
| Repeat |
Repeat is an abstract Steppable and Stoppable which generalizes the notion of repeated
Steppables.
|
| Schedule |
Schedule defines a threadsafe scheduling queue in which events can be scheduled to occur
at future time.
|
| Schedule.Key |
Timestamps stored as keys in the heap.
|
| Sequence |
Sequence is Steppable which holds an array of Steppables.
|
| SimState |
SimState represents the simulation proper.
|
| TentativeStep |
A Steppable wrapper which can be stopped.
|
| WeakStep |
WeakStep is a wrapper for steppable objects in the situation where we only want
the schedule to tenuously hold onto the steppable object -- that is, if everyone
else has forgotten about the object, the schedule should as well.
|


Then right click on the images and click "save as" or "download image" or whatever.
Custom width/height?
If so, width:
height:


SmartBond™ Logging
Dialog SoC:
DA1469x
Web BLE version:
0.0.1
Debug:
Log:
Scan for devices
Clear Logs
Disconnect
Debug
Notice
Warning
Error
Critical
Clear Logs


Plugins
Overview
To allow the player to be extended, a system of “plugins” has been added.
Those plugins are often under the form of functions passed as an argument to the
loadVideo
API call.
segmentLoader
The segmentLoader is a function that can be included in the transportOptions
of the loadVideo
API call.
A segmentLoader allows to define a custom audio/video segment loader (it might on the future work for other types of segments, so always check the type if you only want those two).
The segment loader is the part performing the segment request. One usecase where you might want to set your own segment loader is to integrate Peer-to-Peer segment downloading through the player.
To give a complete example, here is a segment loader which uses an XHR (it has no use, as our implementation does the same thing and more):
/**
* @param {Object} infos - infos about the segment to download
* @param {string} infos.url - the url the segment request should normally be on
* @param {Object} infos.adaptation - the adaptation containing the segment.
* More information on its structure can be found on the documentation linked
* below [1]
* @param {Object} infos.representation - the representation containing the
* segment.
* More information on its structure can be found on the documentation linked
* below [2]
* @param {Object} infos.segment - the segment itself
* More information on its structure can be found on the documentation linked
* below [3]
* @param {Object} callbacks
* @param {Function} callbacks.resolve - Callback to call when the request is
* finished with success. It should be called with an object with at least 3
* properties:
* - data {ArrayBuffer} - the segment data
* - duration {Number} - the duration of the request, in ms
* - size {Number} - size, in bytes, of the total downloaded response.
* @param {Function} callbacks.reject - Callback to call when an error is
* encountered. If you relied on an XHR, it is recommended to include it as an
* object property named "xhr" in the argument.
* @param {Function} callbacks.fallback - Callback to call if you want to call
* our default implementation instead for this segment. No argument is needed.
* @returns {Function|undefined} - If a function is defined in the return value,
* it will be called if and when the request is canceled.
*/
const customSegmentLoader = (infos, callbacks) => {
// we will only use this custom loader for videos segments.
if (infos.adaptation.type !== "video") {
callbacks.fallback();
return;
}
const xhr = new XMLHttpRequest();
const sentTime = Date.now();
xhr.onload = (r) => {
if (200 <= xhr.status && xhr.status < 300) {
const duration = Date.now() - sentTime;
const size = r.total;
const data = r.responseData;
callbacks.resolve({ duration, size, data });
} else {
const err = new Error("didn't work");
err.xhr = xhr;
callbacks.reject(err);
}
};
xhr.onerror = () => {
const err = new Error("didn't work");
err.xhr = xhr;
callbacks.reject(err);
};
xhr.open("GET", infos.url);
xhr.responseType = "arraybuffer";
const range = infos.segment.range;
if (range) {
if (range[1] && range[1] !== Infinity) {
xhr.setRequestHeader("Range", `bytes=${range[0]}-${range[1]}`);
} else {
xhr.setRequestHeader("Range", `bytes=${range[0]}-`);
}
}
xhr.send();
return () => {
xhr.abort();
};
};
manifestLoader
The manifestLoader is a function that can be included in the
transportOptions
of the loadVideo
API call.
A manifestLoader allows to define a custom manifest loader.
The manifest loader is the part performing the manifest request.
Here is a manifest loader which uses an XHR (it has no use, as our implementation does the same thing and more):
/**
* @param {string} url - the url the manifest request should normally be on
* @param {Object} callbacks
* @param {Function} callbacks.resolve - Callback to call when the request is
* finished with success. It should be called with an object with at least 3
* properties:
* - data {Document|String} - the manifest data
* - duration {Number} - the duration of the request, in ms
* - size {Number} - size, in bytes, of the total downloaded response.
* @param {Function} callbacks.reject - Callback to call when an error is
* encountered. If you relied on an XHR, it is recommended to include it as an
* object property named "xhr" in the argument.
* @param {Function} callbacks.fallback - Callback to call if you want to call
* our default implementation instead for this segment. No argument is needed.
* @returns {Function|undefined} - If a function is defined in the return value,
* it will be called if and when the request is canceled.
*/
const customManifestLoader = (url, callbacks) => {
const xhr = new XMLHttpRequest();
const sentTime = Date.now();
xhr.onload = (r) => {
if (200 <= xhr.status && xhr.status < 300) {
const duration = Date.now() - sentTime;
const size = r.total;
const data = r.targget.response;
callbacks.resolve({ duration, size, data });
} else {
const err = new Error("didn't work");
err.xhr = xhr;
callbacks.reject(err);
}
};
xhr.onerror = () => {
const err = new Error("didn't work");
err.xhr = xhr;
callbacks.reject(err);
};
xhr.open("GET", infos.url);
xhr.responseType = "document";
xhr.send();
return () => {
xhr.abort();
};
};


Technical Reflection
Can you think of an analogy to describe HTML, CSS and the DOM? How would you describe it to your non-technical friend?
There's a video on Udacity which explains HTML, CSS and Javascript as a house with the DOM being a graphical representation of how it's all linked. Since this analogy is so good I'll recycle it here.
Think of HTML as the structure of a house, the walls, the floor, the kitchen, the bathroom, the attic etc. Now imagine CSS is the designer coming in and making it look great. Rearranging the furniture, painting the walls, picking out which benchtop goes best. Without CSS the house would just be exposed raw materials put in the right spots, now it's a good looking, feature-rich home.
Javascript can be thought of as a family coming to live in the house. Pulling the curtains every night, turning the TV on and off, switching light switches and running taps. They're there changing things as they go.
The DOM can be thought of as the architectural plans. Overall they show a property, within the property is a house, a front yard and a back yard, within the back yard is a shed and within the house is several floors which all contain several rooms.
What is meant by boxifying design?
 Boxifying a design is splitting a website into these boxes to figure out the order in which it's put/going to be put together.
What is the box model?
Each box is made up of a few components. There's the content, padding, border and margin. This is the box model and mainpulating these components allows huge customisation and creative design of a web page.


{% extends "base.html" %} {% block title %}Site History{% endblock %} {% block content %}
Although I started to regularly listen to Wait Wait... Don't Tell Me! in 2005, I didn't immediately start taking notes until some time later in 2006. While NPR site would include details about each show's segments, guests and panelists, they didn't keep track of any scores or how many times a panelist appeared on the show.
Eventually, I would start collecting that information in a small notebook; but, I lost it after an office move or one of several cleaning sprees. So, the idea of storing the data in a database and creating a front-end for that came up.
I decided to build the site using PHP and use MySQL for the database as I already had a web server at home that hosted my website, written in PHP, and had a MySQL database server running on another server. After a couple months of work during my spare time, I published the first version of the site at the end of July 2007.
Version 2 of the Stats Page was an evolutionary update to the site with the addition of more detailed panelist statistics and a pair of graphs showing how well each panelist has done.
The name "Stats Page" was pretty apt for the first two versions of the site, due to the fact that everything was presented on a single web page. As more features and details were added, along with the number of shows, the single page design made became unwieldy from both a user experience and a programming standpoint.
Thus, I postponed adding new features to the site until I could sit down and do a complete overhaul of the site. Since PHP was still my go-to language at that point, I decided to go with the Silex micro-framework as the foundation for the new site. This allowed me to create a very rudimentary MVC design and create views for each of the core items: shows, guests, hosts, panelists and scorekeepers.
Another key requirement that I had for the new version of the site was to make it more mobile-friendly. At that time, I went as minimalistic as possible when it came to the design and in terms of not requiring the use of JavaScript. I would only make use of JavaScript later to create interactive panelist graphs.
After a long-ish development process, the new version of the site launched in 2014. Since then, people have asked for additional features and analysis of the data that I've collected. I was able to add the introductions that Bill Kurtis would use to describe himself at the start of the show and started to keep track of Bluff the Listener data.
As I continued to do more data analysis and field requests that I would get, there wasn't a clean way to add those to the Stats Page. Between that and the real need to extend and redesign the Stats Page for a more modern and responsive web landscape, I decided to build the next version of the Stats Page from scratch again.
By building the site from scratch again allowed me to move away from PHP and actually code in the language that I really loved and had started to get back into more: Python. I had been already been using Python for projects at work and with some of the Wait Wait data analysis requests.
The development of the Stats Page actually started with the creation of a data access library, libwwdtm. That data access library would be used as the foundation for the Stats Page and for the Wait Wait... Don't Tell Me! Stats API. The source code for both are released under the terms of Apache License 2.0 and are available on Github: libwwdtm | api.wwdt.me.
For the Stats Page itself, it had to be mobile-first and maintain a minimalist design. For the front-end, I picked the Materialize framework, and Flask and Jinja2 would handle the backend. To keep things as simple as possible, I limited the front-end customization to only CSS overrides.
While most of the features of the Stats Page made it over to the new version, a few changes and omissions had to be made. The first change is the omission of the panelist scoring graphs due to need to completely overhaul them to be mobile-first. Those graphs will eventually be made available via the Wait Wait... Don't Tell Me! Reports site.
Another change is that going to the guest, host, panelist, scorekeeper and show views will only provide a list of the respective items. Most will provide a link at the bottom to get a full detail view of all items. This was done to reduce overall clutter.
{% endblock %}


Before Change
// discrete scales change the dtype
// from category to int. Use a new dataframe
// to collect these results.
df = pd.DataFrame({}, index=range(len(data)))
cat_cols = []
// Loop through each variable, mapping across each scale,
// then joining back into the copy of the data
After Change
// from category to int. Use a new dataframe
// to collect these results.
// Using `type` preserves the subclass of pd.DataFrame
df = type(data)(index=data.index)
cat_cols = []
// Loop through each variable, mapping across each scale,
// then joining back into the copy of the data


Recipe 2.7. Using Random-Access Input/Output
Credit: Luther Blissett
Problem
You want to read a binary record from
somewhere inside a large file of fixed-length records, without
reading a record at a time to get there.
Solution
The byte offset of the start of a record in the file is the size of a
record, in bytes, multiplied by the progressive number of the record
(counting from 0). So, you can just seek right to the proper spot,
then read the data. For example, to read the seventh record from a
binary file where each record is 48 bytes long:
thefile = open('somebinfile', 'rb')
record_size = 48
record_number = 6
thefile.seek(record_size * record_number)
buffer = thefile.read(record_size)
Note that the record_number of the
seventh record is 6: record numbers count from
zero!
Discussion
This approach works only on files (generally binary ones) defined in
terms of records that are all the same fixed size in bytes; it
doesn't work on normal text files. For clarity, the
recipe shows the file being opened for reading as a binary file by
passing 'rb' as the second argument to
open, just before the seek. As
long as the file object is open for reading as a binary file, you can
perform as many seek and read
operations as you need, before eventually closing the file
againyou don't necessarily open the file just
before performing a seek on it.
See Also
The section of the Library Reference and
Python in a Nutshell on file objects;
Perl Cookbook recipe 8.12.
|


Market Charts > 1995 > Movie Chart
Annual Movie Chart - 1995
Note: This chart ranks movies by the amount they earned during 1995.
It includes movies released in previous years that earned money during 1995.
For example, a movie released over Thanksgiving in 1994 will most likely earn money in 1994 and 1995.
Click on the individual movie to see its total gross over all the years in which it played.
Each box office year ends on the first Sunday of the following year.
The next year starts the following day (Monday).
For example, the "2004 box office year" ended on Sunday, January 2, 2005.
Inflation-adjusted figures are based on ticket sale estimates.
See Top 1995 Movies at the Domestic Box Office for the total domestic box office for the top 100 movies released in 1995, and Movie Index 1995 for an overview of all movies released in 1995.
Top Grossing Movies of 1995
| Rank | Movie | Release Date | Distributor | Genre | 1995 Gross | Tickets Sold |
| 1 |
Batman Forever |
Jun 16, 1995 |
Warner Bros. |
Action |
$184,031,112 |
42,306,002 |
| 2 |
Apollo 13 |
Jun 30, 1995 |
Universal |
Drama |
$172,036,360 |
39,548,588 |
| 3 |
Toy Story |
Nov 22, 1995 |
Walt Disney |
Adventure |
$150,004,917 |
34,483,888 |
| 4 |
Pocahontas |
Jun 10, 1995 |
Walt Disney |
Adventure |
$141,551,246 |
32,540,516 |
| 5 |
Ace Ventura: When Nature Calls |
Nov 10, 1995 |
Warner Bros. |
Comedy |
$104,371,496 |
23,993,447 |
| 6 |
Casper |
May 26, 1995 |
Universal |
Comedy |
$100,328,194 |
23,063,952 |
| 7 |
Die Hard: With a Vengeance |
May 19, 1995 |
20th Century Fox |
Action |
$100,012,499 |
22,991,379 |
| 8 |
Goldeneye |
Nov 17, 1995 |
MGM |
Action |
$93,662,146 |
21,531,527 |
| 9 |
Crimson Tide |
May 12, 1995 |
Walt Disney |
Action |
$91,387,195 |
21,008,550 |
| 10 |
Waterworld |
Jul 28, 1995 |
Universal |
Action |
$88,246,220 |
20,286,487 |
| 11 |
Se7en |
Sep 22, 1995 |
New Line |
Thriller/Suspense |
$87,113,775 |
20,026,155 |
| 12 |
Dangerous Minds |
Aug 11, 1995 |
Walt Disney |
Drama |
$84,409,943 |
19,404,584 |
| 13 |
While You Were Sleeping |
Apr 21, 1995 |
Walt Disney |
Romantic Comedy |
$81,057,016 |
18,633,796 |
| 14 |
Congo |
Jun 9, 1995 |
Paramount Pictures |
Adventure |
$81,022,333 |
18,625,823 |
| 15 |
Mortal Kombat |
Aug 18, 1995 |
New Line |
Action |
$70,383,146 |
16,180,033 |
| 16 |
The Bridges of Madison County |
Jun 2, 1995 |
Warner Bros. |
Drama |
$70,107,178 |
16,116,592 |
| 17 |
Nine Months |
Jul 12, 1995 |
20th Century Fox |
Romantic Comedy |
$69,660,733 |
16,013,961 |
| 18 |
Get Shorty |
Oct 20, 1995 |
MGM |
Comedy |
$69,066,951 |
15,877,460 |
| 19 |
Outbreak |
Mar 10, 1995 |
Warner Bros. |
Thriller/Suspense |
$67,823,573 |
15,591,625 |
| 20 |
Braveheart |
May 24, 1995 |
Paramount Pictures |
Drama |
$67,019,456 |
15,406,771 |
| 21 |
Legends of the Fall |
Dec 23, 1994 |
Sony Pictures |
Western |
$66,020,491 |
15,177,124 |
| 22 |
Bad Boys |
Apr 7, 1995 |
Sony Pictures |
Action |
$65,647,413 |
15,091,359 |
| 23 |
The Living Sea |
Feb 1, 1995 |
IMAX Films |
Documentary |
$64,800,000 |
14,896,551 |
| 24 |
Dumb & Dumber |
Dec 16, 1994 |
New Line |
Comedy |
$60,671,411 |
13,947,450 |
| 25 |
Species |
Jul 7, 1995 |
MGM |
Action |
$60,054,449 |
13,805,620 |
| 26 |
Jumanji |
Dec 15, 1995 |
Sony Pictures |
Adventure |
$57,848,637 |
13,298,537 |
| 27 |
Babe |
Aug 4, 1995 |
Universal |
Adventure |
$56,805,285 |
13,058,686 |
| 28 |
Clueless |
Jul 1, 1995 |
Paramount Pictures |
Comedy |
$56,461,210 |
12,979,588 |
| 29 |
Father of the Bride Part II |
Dec 8, 1995 |
Walt Disney |
Comedy |
$52,265,735 |
12,015,111 |
| 30 |
The American President |
Nov 17, 1995 |
Sony Pictures |
Romantic Comedy |
$51,068,604 |
11,739,908 |
| 31 |
Something to Talk About |
Aug 4, 1995 |
Warner Bros. |
Comedy |
$50,865,589 |
11,693,238 |
| 32 |
The Net |
Jul 28, 1995 |
Sony Pictures |
Thriller/Suspense |
$50,621,733 |
11,637,180 |
| 33 |
Under Siege 2: Dark Territory |
Jul 14, 1995 |
Warner Bros. |
Action |
$50,024,083 |
11,499,789 |
| 34 |
A Walk in the Clouds |
Aug 11, 1995 |
20th Century Fox |
Drama |
$50,008,143 |
11,496,124 |
| 35 |
The Brady Bunch Movie |
Feb 17, 1995 |
Paramount Pictures |
Comedy |
$46,546,167 |
10,700,268 |
| 36 |
Pulp Fiction |
Oct 14, 1994 |
Miramax |
Drama |
$44,268,548 |
10,176,677 |
| 37 |
Man of the House |
Mar 3, 1995 |
Walt Disney |
Comedy |
$40,029,009 |
9,202,071 |
| 38 |
Nobody's Fool |
Dec 23, 1994 |
Paramount Pictures |
Drama |
$39,007,303 |
8,967,196 |
| 39 |
French Kiss |
May 5, 1995 |
20th Century Fox |
Romantic Comedy |
$38,863,798 |
8,934,206 |
| 40 |
Higher Learning |
Jan 11, 1995 |
Sony Pictures |
Drama |
$38,023,585 |
8,741,054 |
| 41 |
Mighty Morphin Power Ranger… |
Jun 30, 1995 |
20th Century Fox |
Adventure |
$37,785,198 |
8,686,252 |
| 42 |
Casino |
Nov 22, 1995 |
Universal |
Drama |
$37,532,665 |
8,628,198 |
| 43 |
First Knight |
Jul 7, 1995 |
Sony Pictures |
Adventure |
$37,361,412 |
8,588,830 |
| 44 |
Just Cause |
Feb 17, 1995 |
Warner Bros. |
Thriller/Suspense |
$36,853,222 |
8,472,005 |
| 45 |
Heat |
Dec 15, 1995 |
Warner Bros. |
Drama |
$36,508,135 |
8,392,674 |
| 46 |
To Wong Foo Thanks for Ever… |
Sep 8, 1995 |
Universal |
Comedy |
$36,466,570 |
8,383,119 |
| 47 |
Waiting to Exhale |
Dec 22, 1995 |
20th Century Fox |
Drama |
$36,024,320 |
8,281,452 |
| 48 |
The Indian in the Cupboard |
Jul 14, 1995 |
Paramount Pictures |
Adventure |
$35,627,222 |
8,190,165 |
| 49 |
A Goofy Movie |
Apr 7, 1995 |
Walt Disney |
Adventure |
$35,336,439 |
8,123,319 |
| 50 |
Judge Dredd |
Jun 30, 1995 |
Walt Disney |
Action |
$34,687,912 |
7,974,232 |
| 51 |
Money Train |
Nov 22, 1995 |
Sony Pictures |
Action |
$34,678,517 |
7,972,072 |
| 52 |
Forget Paris |
May 19, 1995 |
Sony Pictures |
Romantic Comedy |
$33,194,512 |
7,630,922 |
| 53 |
Tommy Boy |
Mar 31, 1995 |
Paramount Pictures |
Comedy |
$32,648,673 |
7,505,442 |
| 54 |
Copycat |
Oct 27, 1995 |
Warner Bros. |
Thriller/Suspense |
$31,436,894 |
7,226,872 |
| 55 |
Rob Roy |
Apr 7, 1995 |
MGM |
Drama |
$31,390,587 |
7,216,226 |
| 56 |
Disclosure |
Dec 9, 1994 |
Warner Bros. |
Thriller/Suspense |
$31,301,740 |
7,195,802 |
| 57 |
Forrest Gump |
Jul 6, 1994 |
Paramount Pictures |
Drama |
$31,074,434 |
7,143,548 |
| 58 |
Sabrina |
Dec 15, 1995 |
Paramount Pictures |
Romantic Comedy |
$30,788,670 |
7,077,855 |
| 59 |
Grumpier Old Men |
Dec 22, 1995 |
Warner Bros. |
Romantic Comedy |
$30,767,512 |
7,072,991 |
| 60 |
Free Willy 2: The Adventure… |
Jul 19, 1995 |
Warner Bros. |
Adventure |
$30,077,111 |
6,914,278 |
| 61 |
Powder |
Oct 27, 1995 |
Walt Disney |
Drama |
$29,961,344 |
6,887,665 |
| 62 |
Assassins |
Oct 6, 1995 |
Warner Bros. |
Action |
$29,488,174 |
6,778,890 |
| 63 |
Little Women |
Dec 21, 1994 |
Sony Pictures |
Drama |
$29,474,280 |
6,775,696 |
| 64 |
Major Payne |
Mar 24, 1995 |
Universal |
Comedy |
$29,412,050 |
6,761,390 |
| 65 |
Friday |
Apr 26, 1995 |
New Line |
Comedy |
$27,467,564 |
6,314,382 |
| 66 |
Now and Then |
Oct 20, 1995 |
New Line |
Drama |
$26,480,554 |
6,087,483 |
| 67 |
Houseguest |
Jan 6, 1995 |
Walt Disney |
Comedy |
$26,325,256 |
6,051,782 |
| 68 |
Desperado |
Aug 25, 1995 |
Sony Pictures |
Action |
$25,532,388 |
5,869,514 |
| 69 |
Billy Madison |
Feb 10, 1995 |
Universal |
Comedy |
$25,460,475 |
5,852,982 |
| 70 |
Operation Dumbo Drop |
Jul 28, 1995 |
Walt Disney |
Adventure |
$24,670,346 |
5,671,343 |
| 71 |
Dolores Claiborne |
Mar 24, 1995 |
Sony Pictures |
Drama |
$24,262,193 |
5,577,515 |
| 72 |
Dead Presidents |
Oct 4, 1995 |
Walt Disney |
Drama |
$24,061,776 |
5,531,442 |
| 73 |
Virtuosity |
Aug 4, 1995 |
Paramount Pictures |
Action |
$23,998,226 |
5,516,833 |
| 74 |
How to Make an American Quilt |
Oct 6, 1995 |
Universal |
Drama |
$23,600,020 |
5,425,291 |
| 75 |
Boys on the Side |
Feb 3, 1995 |
Warner Bros. |
Drama |
$23,418,200 |
5,383,494 |
| 76 |
Circle of Friends |
Mar 15, 1995 |
Savoy |
Drama |
$23,389,975 |
5,377,005 |
| 77 |
The Usual Suspects |
Aug 16, 1995 |
Gramercy |
Drama |
$22,959,756 |
5,278,104 |
| 78 |
Don Juan DeMarco |
Apr 7, 1995 |
New Line |
Drama |
$22,032,635 |
5,064,973 |
| 79 |
To Die For |
Sep 27, 1995 |
Sony Pictures |
Black Comedy |
$21,155,211 |
4,863,266 |
| 80 |
Tales from the Crypt: Demon… |
Jan 13, 1995 |
Universal |
Horror |
$21,089,146 |
4,848,079 |
| 81 |
The Jungle Book |
Dec 25, 1994 |
Walt Disney |
Adventure |
$20,975,770 |
4,822,016 |
| 82 |
Nell |
Dec 14, 1994 |
20th Century Fox |
Drama |
$20,914,085 |
4,807,835 |
| 83 |
Showgirls |
Sep 22, 1995 |
MGM |
Drama |
$20,350,754 |
4,678,334 |
| 84 |
Vampire in Brooklyn |
Oct 27, 1995 |
Paramount Pictures |
Horror |
$19,114,796 |
4,394,205 |
| 85 |
Johnny Mnemonic |
May 26, 1995 |
Sony Pictures |
Action |
$19,006,201 |
4,369,241 |
| 86 |
The Quick and the Dead |
Feb 10, 1995 |
Sony Pictures |
Western |
$18,552,460 |
4,264,933 |
| 87 |
The Big Green |
Sep 29, 1995 |
Walt Disney |
Adventure |
$17,736,619 |
4,077,383 |
| 88 |
Heavy Weights |
Feb 17, 1995 |
Walt Disney |
Comedy |
$17,671,310 |
4,062,370 |
| 89 |
It Takes Two |
Nov 17, 1995 |
Warner Bros. |
Comedy |
$17,468,169 |
4,015,671 |
| 90 |
Murder in the First |
Jan 20, 1995 |
Warner Bros. |
Drama |
$17,300,238 |
3,977,066 |
| 91 |
Home for the Holidays |
Nov 3, 1995 |
Paramount Pictures |
Comedy |
$17,289,513 |
3,974,600 |
| 92 |
Jury Duty |
Apr 12, 1995 |
Sony Pictures |
Comedy |
$16,941,552 |
3,894,609 |
| 93 |
The Prophecy |
Sep 1, 1995 |
Miramax |
Horror |
$16,091,660 |
3,699,232 |
| 94 |
Devil in a Blue Dress |
Sep 29, 1995 |
Sony Pictures |
Drama |
$16,030,096 |
3,685,079 |
| 95 |
Mad Love |
May 26, 1995 |
Walt Disney |
Drama |
$15,446,532 |
3,550,926 |
| 96 |
Muriel's Wedding |
Mar 10, 1995 |
Miramax |
Comedy |
$15,185,000 |
3,490,804 |
| 97 |
Halloween: The Curse of Mic… |
Sep 29, 1995 |
Miramax |
Horror |
$15,126,948 |
3,477,459 |
| 98 |
The Madness of King George |
Dec 28, 1994 |
Goldwyn Entertain… |
Drama |
$15,019,414 |
3,452,738 |
| 99 |
Kiss of Death |
Apr 21, 1995 |
20th Century Fox |
Drama |
$14,942,422 |
3,435,039 |
| 100 |
Ri¢hie Ri¢h |
Dec 21, 1994 |
Warner Bros. |
Comedy |
$14,709,190 |
3,381,422 |
| 101 |
Tom and Huck |
Dec 22, 1995 |
Walt Disney |
Adventure |
$14,604,245 |
3,357,297 |
| 102 |
Candyman: Farewell to Flesh |
Mar 17, 1995 |
Gramercy |
Horror |
$13,916,665 |
3,199,233 |
| 103 |
Highlander: The Final Dimen… |
Jan 27, 1995 |
Miramax |
Action |
$13,738,574 |
3,158,292 |
| 104 |
Sudden Death |
Dec 22, 1995 |
Universal |
Action |
$13,467,140 |
3,095,894 |
| 105 |
A Kid in King Arthur's Court |
Aug 11, 1995 |
Walt Disney |
Adventure |
$13,406,717 |
3,082,003 |
| 106 |
Lord of Illusions |
Aug 25, 1995 |
MGM |
Horror |
$13,249,614 |
3,045,888 |
| 107 |
I.Q. |
Dec 25, 1994 |
Paramount Pictures |
Romantic Comedy |
$13,201,318 |
3,034,785 |
| 108 |
Clockers |
Sep 13, 1995 |
Universal |
Drama |
$12,993,765 |
2,987,072 |
| 109 |
The Lion King |
Jun 15, 1994 |
Walt Disney |
Adventure |
$12,472,984 |
2,867,352 |
| 110 |
Hideaway |
Mar 3, 1995 |
Sony Pictures |
Horror |
$12,201,255 |
2,804,886 |
| 111 |
Roommates |
Mar 3, 1995 |
Walt Disney |
Comedy |
$12,076,989 |
2,776,319 |
| 112 |
Bye Bye Love |
Mar 17, 1995 |
20th Century Fox |
Comedy |
$12,073,560 |
2,775,531 |
| 113 |
Street Fighter |
Dec 23, 1994 |
Universal |
Action |
$11,920,295 |
2,740,297 |
| 114 |
Tales from the Hood |
May 24, 1995 |
Savoy |
Horror |
$11,784,569 |
2,709,096 |
| 115 |
The Shawshank Redemption |
Sep 23, 1994 |
Sony Pictures |
Drama |
$11,772,053 |
2,706,219 |
| 116 |
Far from Home: The Adventur… |
Jan 13, 1995 |
20th Century Fox |
Adventure |
$11,380,788 |
2,616,273 |
| 117 |
Fair Game |
Nov 3, 1995 |
Warner Bros. |
Action |
$11,184,039 |
2,571,043 |
| 118 |
My Family |
May 3, 1995 |
New Line |
Drama |
$11,079,373 |
2,546,982 |
| 119 |
The Englishman Who Went Up … |
May 12, 1995 |
Miramax |
Comedy |
$10,904,930 |
2,506,880 |
| 120 |
The Brothers McMullen |
Aug 9, 1995 |
Fox Searchlight |
Drama |
$10,426,506 |
2,396,897 |
| 121 |
The Scarlet Letter |
Oct 13, 1995 |
Walt Disney |
Drama |
$10,359,006 |
2,381,380 |
| 122 |
A Little Princess |
May 10, 1995 |
Warner Bros. |
Drama |
$10,015,449 |
2,302,402 |
| 123 |
Jade |
Oct 13, 1995 |
Paramount Pictures |
Thriller/Suspense |
$9,812,870 |
2,255,832 |
| 124 |
The Baby-Sitters Club |
Aug 18, 1995 |
Sony Pictures |
Comedy |
$9,574,155 |
2,200,955 |
| 125 |
Immortal Beloved |
Dec 16, 1994 |
Sony Pictures |
Drama |
$9,090,824 |
2,089,844 |
| 126 |
The Postman |
Jun 14, 1995 |
Miramax |
Drama |
$9,026,521 |
2,075,062 |
| 127 |
In the Mouth of Madness |
Feb 3, 1995 |
New Line |
Horror |
$8,924,549 |
2,051,620 |
| 128 |
Village of the Damned |
Apr 28, 1995 |
Universal |
Horror |
$8,729,915 |
2,006,877 |
| 129 |
Smoke |
Jun 9, 1995 |
Miramax |
Drama |
$8,353,284 |
1,920,295 |
| 130 |
Dracula: Dead and Loving It |
Dec 22, 1995 |
Sony Pictures |
Comedy |
$8,302,858 |
1,908,702 |
| 131 |
Tall Tale |
Mar 24, 1995 |
Walt Disney |
Western |
$8,247,627 |
1,896,006 |
| 132 |
Unstrung Heroes |
Sep 15, 1995 |
Walt Disney |
Drama |
$7,929,000 |
1,822,758 |
| 133 |
Strange Days |
Oct 6, 1995 |
20th Century Fox |
Thriller/Suspense |
$7,918,562 |
1,820,359 |
| 134 |
Nick of Time |
Nov 22, 1995 |
Paramount Pictures |
Thriller/Suspense |
$7,914,560 |
1,819,439 |
| 135 |
Nixon |
Dec 20, 1995 |
Walt Disney |
Drama |
$7,604,153 |
1,748,081 |
| 136 |
The Amazing Panda Adventure |
Aug 25, 1995 |
Warner Bros. |
Adventure |
$7,590,169 |
1,744,866 |
| 137 |
Losing Isaiah |
Mar 17, 1995 |
Paramount Pictures |
Drama |
$7,564,608 |
1,738,990 |
| 138 |
The Jerky Boys |
Feb 3, 1995 |
Walt Disney |
Comedy |
$7,555,256 |
1,736,840 |
| 139 |
Hackers |
Sep 15, 1995 |
MGM |
Thriller/Suspense |
$7,487,370 |
1,721,234 |
| 140 |
Kids |
Jul 21, 1995 |
Shining Excalibur |
Drama |
$7,412,216 |
1,703,957 |
| 141 |
Cutthroat Island |
Dec 22, 1995 |
MGM |
Adventure |
$7,399,785 |
1,701,100 |
| 142 |
Bushwhacked |
Aug 4, 1995 |
20th Century Fox |
Comedy |
$7,377,107 |
1,695,886 |
| 143 |
Three Wishes |
Oct 27, 1995 |
Savoy |
Drama |
$7,025,496 |
1,615,056 |
| 144 |
Last of the Dogmen |
Sep 8, 1995 |
Savoy |
Western |
$7,008,542 |
1,611,159 |
| 145 |
The Santa Clause |
Nov 11, 1994 |
Walt Disney |
Adventure |
$7,007,259 |
1,610,864 |
| 146 |
Never Talk to Strangers |
Oct 20, 1995 |
Sony Pictures |
Thriller/Suspense |
$6,849,998 |
1,574,712 |
| 147 |
Panther |
May 3, 1995 |
Gramercy |
Drama |
$6,834,000 |
1,571,034 |
| 148 |
Balto |
Dec 22, 1995 |
Universal |
Adventure |
$6,646,130 |
1,527,845 |
| 149 |
The Hunted |
Feb 24, 1995 |
Universal |
Action |
$6,420,615 |
1,476,003 |
| 150 |
The Secret of Roan Inish |
Feb 3, 1995 |
First Look |
Adventure |
$6,101,815 |
1,402,716 |
| 151 |
The Walking Dead |
Feb 24, 1995 |
Savoy |
Drama |
$6,014,340 |
1,382,606 |
| 152 |
Junior |
Nov 23, 1994 |
Universal |
Comedy |
$5,911,390 |
1,358,940 |
| 153 |
The Tie That Binds |
Sep 8, 1995 |
Walt Disney |
Thriller/Suspense |
$5,762,795 |
1,324,780 |
| 154 |
Hoop Dreams |
Oct 14, 1994 |
Fine Line |
Documentary |
$5,758,625 |
1,323,821 |
| 155 |
Gold Diggers: The Secret of… |
Nov 3, 1995 |
Universal |
Adventure |
$5,691,405 |
1,308,368 |
| 156 |
Beyond Rangoon |
Aug 25, 1995 |
Sony Pictures |
Drama |
$5,656,641 |
1,300,377 |
| 157 |
Drop Zone |
Dec 9, 1994 |
Paramount Pictures |
Action |
$5,465,044 |
1,256,331 |
| 158 |
Speechless |
Dec 16, 1994 |
MGM |
Romantic Comedy |
$5,361,348 |
1,232,493 |
| 159 |
Before Sunrise |
Jan 27, 1995 |
Sony Pictures |
Drama |
$5,274,005 |
1,212,414 |
| 160 |
Miami Rhapsody |
Jan 27, 1995 |
Walt Disney |
Romantic Comedy |
$5,086,578 |
1,169,328 |
| 161 |
Mighty Aphrodite |
Oct 27, 1995 |
Miramax |
Comedy |
$5,052,044 |
1,161,389 |
| 162 |
Top Dog |
Apr 28, 1995 |
MGM |
Action |
$4,992,085 |
1,147,605 |
| 163 |
Angus |
Sep 15, 1995 |
New Line |
Comedy |
$4,812,891 |
1,106,411 |
| 164 |
National Lampoon's Senior Trip |
Sep 8, 1995 |
New Line |
Comedy |
$4,686,937 |
1,077,456 |
| 165 |
Bullets Over Broadway |
Oct 21, 1994 |
Miramax |
Comedy |
$4,597,373 |
1,056,867 |
| 166 |
Wings of Courage |
Apr 21, 1995 |
Sony Pictures Cla… |
Drama |
$4,570,769 |
1,050,751 |
| 167 |
Interview with the Vampire:… |
Nov 11, 1994 |
Warner Bros. |
Horror |
$4,474,164 |
1,028,543 |
| 168 |
Ready to Wear |
Dec 25, 1994 |
Miramax |
Comedy |
$4,469,411 |
1,027,450 |
| 169 |
Sense and Sensibility |
Dec 11, 1995 |
Sony Pictures |
Drama |
$4,365,694 |
1,003,607 |
| 170 |
Star Trek: Generations |
Nov 18, 1994 |
Paramount Pictures |
Adventure |
$4,216,958 |
969,415 |
| 171 |
Priest |
Mar 24, 1995 |
Miramax |
Drama |
$4,165,845 |
957,665 |
| 172 |
Tank Girl |
Mar 1, 1995 |
MGM |
Action |
$4,064,333 |
934,329 |
| 173 |
Belle de Jour |
Apr 10, 1968 |
Miramax |
Drama |
$4,030,203 |
926,483 |
| 174 |
Gordy |
May 12, 1995 |
Miramax |
Adventure |
$3,941,146 |
906,010 |
| 175 |
The Pebble and the Penguin |
Apr 12, 1995 |
MGM |
Adventure |
$3,939,728 |
905,684 |
| 176 |
Persuasion |
Sep 27, 1995 |
Sony Pictures Cla… |
Drama |
$3,859,594 |
887,262 |
| 177 |
Fluke |
Jun 2, 1995 |
MGM |
Drama |
$3,794,761 |
872,358 |
| 178 |
Born to be Wild |
Mar 31, 1995 |
Warner Bros. |
Adventure |
$3,730,409 |
857,565 |
| 179 |
White Man's Burden |
Dec 1, 1995 |
Savoy |
Drama |
$3,622,433 |
832,743 |
| 180 |
New Jersey Drive |
Apr 19, 1995 |
Gramercy |
Drama |
$3,540,207 |
813,840 |
| 181 |
Bad Company |
Jan 20, 1995 |
Walt Disney |
Thriller/Suspense |
$3,523,909 |
810,094 |
| 182 |
Exotica |
Mar 3, 1995 |
Miramax |
Drama |
$3,504,510 |
805,634 |
| 183 |
Jeffrey |
Aug 4, 1995 |
Orion Classics |
Romantic Comedy |
$3,487,000 |
801,609 |
| 184 |
The Glass Shield |
Jun 2, 1995 |
Miramax |
Drama |
$3,270,822 |
751,913 |
| 185 |
The Last Seduction |
Oct 26, 1994 |
October Films |
Thriller/Suspense |
$3,172,270 |
729,257 |
| 186 |
Steal Big, Steal Little |
Sep 29, 1995 |
20th Century Fox |
Comedy |
$3,150,170 |
724,177 |
| 187 |
Crumb |
Apr 21, 1995 |
Sony Pictures Cla… |
Documentary |
$3,041,083 |
699,099 |
| 188 |
Carrington |
Nov 10, 1995 |
Gramercy |
Drama |
$2,964,436 |
681,479 |
| 189 |
Quiz Show |
Sep 14, 1994 |
Walt Disney |
Drama |
$2,920,195 |
671,309 |
| 190 |
Shallow Grave |
Feb 10, 1995 |
Gramercy |
Black Comedy |
$2,834,250 |
651,551 |
| 191 |
Unzipped |
Aug 4, 1995 |
Miramax |
Documentary |
$2,833,010 |
651,266 |
| 192 |
The Perez Family |
May 12, 1995 |
Goldwyn Entertain… |
Comedy |
$2,794,056 |
642,311 |
| 193 |
Leaving Las Vegas |
Oct 27, 1995 |
MGM |
Drama |
$2,765,412 |
635,726 |
| 194 |
Dr. Jekyll and Ms. Hyde |
Aug 25, 1995 |
Savoy |
Comedy |
$2,739,002 |
629,655 |
| 195 |
Death and the Maiden |
Dec 23, 1994 |
Fine Line |
Drama |
$2,705,259 |
621,898 |
| 196 |
The Show |
Aug 25, 1995 |
Savoy |
Documentary |
$2,702,000 |
621,149 |
| 197 |
Stargate |
Oct 28, 1994 |
MGM |
Adventure |
$2,701,752 |
621,092 |
| 198 |
Four Rooms |
Dec 25, 1995 |
Miramax |
Comedy |
$2,603,844 |
598,584 |
| 199 |
Magic in the Water |
Aug 30, 1995 |
Sony/TriStar |
Adventure |
$2,535,916 |
582,969 |
| 200 |
The Cure |
Apr 21, 1995 |
Universal |
Drama |
$2,513,250 |
577,758 |
| 201 |
Blue Sky |
Sep 16, 1994 |
Orion Pictures |
Drama |
$2,471,351 |
568,126 |
| 202 |
Jefferson in Paris |
Mar 31, 1995 |
Walt Disney |
Drama |
$2,461,628 |
565,891 |
| 203 |
Moonlight and Valentino |
Sep 29, 1995 |
Gramercy |
Drama |
$2,459,766 |
565,463 |
| 204 |
The Basketball Diaries |
Apr 21, 1995 |
New Line |
Drama |
$2,381,087 |
547,376 |
| 205 |
Red |
Nov 23, 1994 |
Miramax |
Drama |
$2,359,574 |
542,430 |
| 206 |
Burnt by the Sun |
Apr 21, 1995 |
Sony Pictures Cla… |
Drama |
$2,302,338 |
529,273 |
| 207 |
The Incredibly True Adventu… |
Jun 16, 1995 |
Fine Line |
Drama |
$2,210,408 |
508,139 |
| 208 |
Once Were Warriors |
Feb 24, 1995 |
Fine Line |
Drama |
$2,201,126 |
506,005 |
| 209 |
A Month by the Lake |
Sep 22, 1995 |
Miramax |
Romantic Comedy |
$2,196,000 |
504,827 |
| 210 |
Wild Bill |
Dec 1, 1995 |
MGM |
Western |
$2,169,373 |
498,706 |
| 211 |
Mallrats |
Oct 20, 1995 |
Gramercy |
Comedy |
$2,108,367 |
484,682 |
| 212 |
A Low Down Dirty Shame |
Nov 23, 1994 |
Walt Disney |
Action |
$1,980,559 |
455,300 |
| 213 |
Endless Winter |
Oct 20, 1995 |
Warren Miller Ent… |
Documentary |
$1,966,454 |
452,058 |
| 214 |
Strawberry and Chocolate |
Jan 20, 1995 |
Miramax |
Comedy |
$1,918,424 |
441,017 |
| 215 |
The Mangler |
Mar 3, 1995 |
New Line |
Horror |
$1,781,000 |
409,425 |
| 216 |
Heavenly Creatures |
Nov 16, 1994 |
Miramax |
Drama |
$1,569,711 |
360,853 |
| 217 |
Safe Passage |
Dec 23, 1994 |
New Line |
Drama |
$1,517,700 |
348,896 |
| 218 |
Farinelli |
Mar 17, 1995 |
Sony Pictures Cla… |
Drama |
$1,434,847 |
329,849 |
| 219 |
Blue in the Face |
Oct 13, 1995 |
Miramax |
Drama |
$1,275,000 |
293,103 |
| 220 |
To Live |
Nov 19, 1994 |
Goldwyn Entertain… |
Drama |
$1,253,592 |
288,182 |
| 221 |
Picture Bride |
Apr 28, 1995 |
Miramax |
Drama |
$1,238,905 |
284,805 |
| 222 |
The Professional |
Nov 18, 1994 |
Sony Pictures |
Thriller/Suspense |
$1,231,340 |
283,066 |
| 223 |
Across The Sea of Time |
Oct 20, 1995 |
Sony Pictures Cla… |
Drama |
$1,221,528 |
280,811 |
| 224 |
The Specialist |
Oct 7, 1994 |
Warner Bros. |
Action |
$1,205,413 |
277,106 |
| 225 |
Destiny Turns on the Radio |
Apr 28, 1995 |
Savoy |
Comedy |
$1,173,149 |
269,689 |
| 226 |
Mute Witness |
Sep 15, 1995 |
Sony Pictures Cla… |
Thriller/Suspense |
$1,125,910 |
258,829 |
| 227 |
Living in Oblivion |
Jul 14, 1995 |
Sony Pictures Cla… |
Comedy |
$1,111,790 |
255,583 |
| 228 |
Little Odessa |
May 19, 1995 |
Fine Line |
Drama |
$1,095,885 |
251,927 |
| 229 |
The River Wild |
Sep 30, 1994 |
Universal |
Action |
$1,082,410 |
248,829 |
| 230 |
The Mask |
Jul 29, 1994 |
New Line |
Comedy |
$1,053,965 |
242,290 |
| 231 |
Separate Lives |
Sep 8, 1995 |
Trimark |
Thriller/Suspense |
$961,147 |
220,953 |
| 232 |
Stuart Saves His Family |
Apr 12, 1995 |
Paramount Pictures |
Comedy |
$911,310 |
209,496 |
| 233 |
When Night is Falling |
Nov 17, 1995 |
October Films |
Drama |
$879,516 |
202,187 |
| 234 |
Othello |
Dec 14, 1995 |
Sony Pictures |
Drama |
$876,671 |
201,533 |
| 235 |
Wes Craven's New Nightmare |
Oct 14, 1994 |
New Line |
Horror |
$869,118 |
199,797 |
| 236 |
The Crossing Guard |
Nov 15, 1995 |
Miramax |
Drama |
$847,704 |
194,874 |
| 237 |
Mrs. Parker and the Vicious… |
Nov 23, 1994 |
Fine Line |
Drama |
$802,544 |
184,492 |
| 238 |
The Sum of Us |
Mar 8, 1995 |
Goldwyn Entertain… |
Drama |
$766,000 |
176,091 |
| 239 |
Wild Reeds |
Apr 28, 1995 |
Strand |
Drama |
$759,196 |
174,527 |
| 240 |
Amateur |
Apr 7, 1995 |
Sony Pictures Cla… |
Drama |
$757,088 |
174,043 |
| 241 |
Kicking and Screaming |
Oct 6, 1995 |
Trimark |
Drama |
$718,490 |
165,170 |
| 242 |
Wigstock: The Movie |
Jun 9, 1995 |
Goldwyn Entertain… |
Documentary |
$686,152 |
157,736 |
| 243 |
The Thief and the Cobbler |
Aug 25, 1995 |
Miramax |
Adventure |
$669,276 |
153,856 |
| 244 |
Mixed Nuts |
Dec 21, 1994 |
Sony Pictures |
Comedy |
$664,788 |
152,824 |
| 245 |
The Swan Princess |
Nov 18, 1994 |
New Line |
Romantic Comedy |
$642,192 |
147,630 |
| 246 |
Les Misérables |
Oct 20, 1995 |
Warner Bros. |
Drama |
$620,498 |
142,643 |
| 247 |
Shanghai Triad |
Dec 20, 1995 |
Sony Pictures Cla… |
Drama |
$610,244 |
140,285 |
| 248 |
Double Happiness |
Jul 28, 1995 |
Fine Line |
Comedy |
$560,491 |
128,848 |
| 249 |
The Innocent |
Sep 1, 1995 |
Miramax |
Drama |
$553,454 |
127,230 |
| 250 |
Love & Human Remains |
Jun 2, 1995 |
Sony Pictures Cla… |
Comedy |
$542,985 |
124,824 |
| 251 |
The Underneath |
Apr 28, 1995 |
Gramercy |
Drama |
$536,023 |
123,223 |
| 252 |
Funny Bones |
Mar 31, 1995 |
Walt Disney |
Comedy |
$529,135 |
121,640 |
| 253 |
The Pagemaster |
Nov 23, 1994 |
20th Century Fox |
Adventure |
$519,284 |
119,375 |
| 254 |
The Wild Bunch |
Jun 18, 1969 |
Warner Bros. |
Western |
$509,424 |
117,108 |
| 255 |
Cobb |
Dec 2, 1994 |
Warner Bros. |
Drama |
$499,294 |
114,780 |
| 256 |
Lamerica |
Dec 20, 1995 |
New Yorker |
Drama |
$494,095 |
113,585 |
| 257 |
Clerks |
Oct 19, 1994 |
Miramax |
Comedy |
$481,383 |
110,662 |
| 258 |
Party Girl |
Jun 9, 1995 |
First Look |
Romantic Comedy |
$472,370 |
108,590 |
| 259 |
The Run of the Country |
Sep 22, 1995 |
Sony Pictures |
Drama |
$470,768 |
108,222 |
| 260 |
A Pyromaniac’s Love Story |
Mar 28, 1995 |
Walt Disney |
Romantic Comedy |
$468,240 |
107,641 |
| 261 |
Safe |
Jun 23, 1995 |
Sony Pictures Cla… |
Drama |
$465,498 |
107,011 |
| 262 |
Nadja |
Aug 25, 1995 |
October Films |
Horror |
$446,934 |
102,743 |
| 263 |
Before the Rain |
Feb 24, 1995 |
Gramercy |
Drama |
$431,105 |
99,104 |
| 264 |
A Man of No Importance |
Dec 22, 1994 |
Sony Pictures Cla… |
Drama |
$427,308 |
98,231 |
| 265 |
Richard III |
Dec 29, 1995 |
MGM |
Drama |
$425,532 |
97,823 |
| 266 |
Vanya on 42nd Street |
Oct 19, 1994 |
Sony Pictures |
Drama |
$418,805 |
96,277 |
| 267 |
3 Ninjas Knuckle Up |
Apr 7, 1995 |
Sony/TriStar |
Action |
$407,618 |
93,705 |
| 268 |
The Adventures of Priscilla… |
Aug 10, 1994 |
Gramercy |
Comedy |
$402,962 |
92,634 |
| 269 |
Bandit Queen |
Jun 30, 1995 |
Arrow Releasing |
Drama |
$399,748 |
91,896 |
| 270 |
Bar Girls |
Mar 24, 1995 |
Orion Classics |
Romantic Comedy |
$397,566 |
91,394 |
| 271 |
Search and Destroy |
Apr 28, 1995 |
October Films |
Drama |
$389,731 |
89,593 |
| 272 |
Gospa |
Oct 13, 1995 |
Penland |
Drama |
$381,000 |
87,586 |
| 273 |
Swimming with Sharks |
Apr 21, 1995 |
Trimark |
Comedy |
$376,928 |
86,650 |
| 274 |
Country Life |
Jul 28, 1995 |
Miramax |
Drama |
$350,354 |
80,541 |
| 275 |
Total Eclipse |
Nov 3, 1995 |
Fine Line |
Drama |
$339,889 |
78,135 |
| 276 |
Cry, The Beloved Country |
Dec 15, 1995 |
Miramax |
Drama |
$317,777 |
73,052 |
| 277 |
Empire Records |
Sep 22, 1995 |
Warner Bros. |
Comedy |
$303,841 |
69,848 |
| 278 |
The Addiction |
Oct 4, 1995 |
October Films |
Horror |
$303,300 |
69,724 |
| 279 |
12 Monkeys |
Dec 27, 1995 |
Universal |
Drama |
$303,125 |
69,683 |
| 280 |
Feast of July |
Oct 13, 1995 |
Walt Disney |
Drama |
$293,274 |
67,419 |
| 281 |
Rampo |
May 19, 1995 |
Goldwyn Entertain… |
Thriller/Suspense |
$284,613 |
65,428 |
| 282 |
The City of Lost Children |
Dec 15, 1995 |
Sony Pictures Cla… |
Thriller/Suspense |
$279,590 |
64,273 |
| 283 |
Restoration |
Dec 29, 1995 |
Miramax |
Drama |
$273,776 |
62,937 |
| 284 |
An Awfully Big Adventure |
Jul 21, 1995 |
Fine Line |
Drama |
$258,195 |
59,355 |
| 285 |
Lie Down with Dogs |
Jun 30, 1995 |
Miramax |
Comedy |
$240,280 |
55,236 |
| 286 |
Georgia |
Dec 8, 1995 |
Miramax |
Drama |
$215,009 |
49,427 |
| 287 |
Things to Do in Denver when… |
Dec 1, 1995 |
Miramax |
Black Comedy |
$196,137 |
45,088 |
| 288 |
Tom & Viv |
Dec 2, 1994 |
Miramax |
Drama |
$188,709 |
43,381 |
| 289 |
Canadian Bacon |
Sep 22, 1995 |
Gramercy |
Comedy |
$178,104 |
40,943 |
| 290 |
Doctor Zhivago |
Dec 22, 1965 |
MGM |
Drama |
$175,917 |
40,440 |
| 291 |
Miracle on 34th Street |
Nov 18, 1994 |
20th Century Fox |
Drama |
$156,966 |
36,084 |
| 292 |
Pushing Hands |
Jun 2, 1995 |
Cinepix Film Prop… |
|
$152,322 |
35,016 |
| 293 |
Mr. Payback: An Interactive… |
Feb 17, 1995 |
Interfilm |
Comedy |
$144,961 |
33,324 |
| 294 |
Dead Tired |
Jul 12, 1995 |
Miramax |
Comedy |
$142,852 |
32,839 |
| 295 |
Last Summer in the Hamptons |
Nov 21, 1995 |
Rainbow Releasing |
Comedy |
$138,528 |
31,845 |
| 296 |
Jason's Lyric |
Sep 28, 1994 |
Gramercy |
Drama |
$133,815 |
30,762 |
| 297 |
Mr. Holland's Opus |
Dec 29, 1995 |
Walt Disney |
Drama |
$131,816 |
30,302 |
| 298 |
Dead Man Walking |
Dec 29, 1995 |
Gramercy |
Drama |
$125,793 |
28,917 |
| 299 |
Milk Money |
Aug 31, 1994 |
Paramount Pictures |
Romantic Comedy |
$125,013 |
28,738 |
| 300 |
Oleanna |
Aug 3, 1995 |
Goldwyn Entertain… |
|
$124,693 |
28,665 |
| 301 |
Roosters |
Jul 14, 1995 |
IRS Releasing |
Drama |
$113,354 |
26,058 |
| 302 |
Tie-died: Rock 'n Roll's Mo… |
Sep 22, 1995 |
ISA Releasing |
Documentary |
$107,528 |
24,719 |
| 303 |
Reckless |
Nov 17, 1995 |
MGM |
Drama |
$103,351 |
23,758 |
| 304 |
Theremin: An Electronic Ody… |
Aug 25, 1995 |
Orion Classics |
Documentary |
$99,459 |
22,864 |
| 305 |
The Stars Fell on Henrietta |
Sep 15, 1995 |
Warner Bros. |
Drama |
$99,318 |
22,831 |
| 306 |
Queen Margot |
Jun 17, 1994 |
Miramax |
Drama |
$89,658 |
20,611 |
| 307 |
Second Best |
Apr 27, 1995 |
Warner Bros. |
|
$86,115 |
19,796 |
| 308 |
Frankie Starlight |
Nov 22, 1995 |
Fine Line |
Drama |
$81,666 |
18,773 |
| 309 |
Clear and Present Danger |
Aug 3, 1994 |
Paramount Pictures |
Action |
$74,720 |
17,177 |
| 310 |
The Last Good Time |
Apr 14, 1995 |
Goldwyn Entertain… |
|
$65,081 |
14,961 |
| 311 |
S.F.W. |
Jan 20, 1995 |
Gramercy |
|
$63,649 |
14,631 |
| 312 |
Delta of Venus |
Oct 13, 1995 |
Fine Line |
Drama |
$63,174 |
14,522 |
| 313 |
World and Time Enough |
Aug 11, 1995 |
Strand |
Drama |
$60,301 |
13,862 |
| 314 |
Erotique |
Jan 20, 1995 |
Group 1 |
Drama |
$57,595 |
13,240 |
| 315 |
The Convent |
Dec 1, 1995 |
Strand |
Drama |
$52,609 |
12,094 |
| 316 |
Pharaoh's Army |
Nov 9, 1995 |
Cinepix Film Prop… |
Western |
$50,652 |
11,644 |
| 317 |
For Better or Worse |
Mar 19, 1995 |
Columbia |
Comedy |
$41,628 |
9,569 |
| 318 |
Tsahal |
Jan 27, 1995 |
New Yorker |
Documentary |
$38,773 |
8,913 |
| 319 |
Color of Night |
Aug 19, 1994 |
Walt Disney |
Thriller/Suspense |
$24,420 |
5,613 |
| 320 |
Arizona Dream (1993) (Re-Re… |
Jun 7, 1995 |
Warner Bros. |
Drama |
$9,733 |
2,237 |
| 321 |
Coldblooded |
Sep 15, 1995 |
IRS Releasing |
Comedy |
$8,423 |
1,936 |
| 322 |
Augustin |
Oct 11, 1995 |
Kino International |
Comedy |
$5,490 |
1,262 |
| 323 |
War of the Buttons |
Sep 29, 1995 |
Warner Bros. |
|
$5,000 |
1,149 |
| 324 |
Two Bits |
Nov 22, 1995 |
Miramax |
|
$5,000 |
1,149 |
| 325 |
A Business Affair |
Dec 8, 1995 |
Castle Hill Produ… |
Comedy |
$5,000 |
1,149 |
| 326 |
Under the Hula Moon |
Dec 1, 1995 |
|
|
$5,000 |
1,149 |
| 327 |
Reflections on a Crime |
Jun 30, 1995 |
|
|
$5,000 |
1,149 |
| 328 |
The Maddening |
Sep 8, 1995 |
Trimark |
Thriller/Suspense |
$5,000 |
1,149 |
| 329 |
Rent-a-Kid |
Nov 4, 1995 |
|
|
$5,000 |
1,149 |
| 330 |
Art for Teachers of Children |
Mar 31, 1995 |
Zeitgeist |
Drama |
$1,424 |
327 |
| Total Gross of All Movies | $5,314,381,090 | |
| Total Tickets Sold | 1,221,696,643 |
Our Theatrical Market pages are based on the Domestic Theatrical Market performance only. The Domestic Market is defined as the North American movie territory (consisting of the United States, Canada, Puerto Rico and Guam).
The yearly amounts on our Theatrical Market pages are based on box office years. Each box office year starts on the first Monday of the year, so the previous year ends on the Sunday before the first Monday. For example, the "2017 box office year" started on January 2, 2017 so the "2016 box office year" ended on Sunday, January 1, 2017.


About
The editor is an instance of CodeMirror, extended with various
standard, contributed and dedicated plugins. Notably the hover
and semantic highlighting plugins have been developed within
the SWISH project.
Find and replace
We load the default CodeMirror plugin for find and replace.
The keybindings are:
- Ctrl + F / Command ⌘ + F
- Start searching
- Ctrl + G / Command ⌘ + G
- Find next
- Shift ⇧ + Ctrl + G / Shift ⇧ + Command ⌘ + G
- Find previous
- Shift ⇧ + Ctrl + F / Command ⌘ + Option ⌥ + F
- Replace
- Shift ⇧ + Ctrl + R / Shift ⇧ + Command ⌘ + Option ⌥ + F
- Replace all
- Alt + F
- Persistent search (dialog doesn't autoclose,
enter to find next, Shift ⇧ + Enter ↵ to find previous)
- Alt + G
- Jump to line
Navigating
If a token is related to one or more source locations, a long click (>
500 millseconds) opens a menu below the cursor that allows for jumping to the
related location. Currently, these are:
- :- include(file).
- a predicate all written as name(arg, ...).
Future versions are likely to add more options, such as jumping to caller
locations, open the documentation, listing predicates, etc.


Ticket ID: 409788
Name:
●
Parker Seidel
No Active Support
Email:
<EMAIL_ADDRESS>Response Time:
72hours, 60 hours left
Last Action:
Never been locked.
Link to public post
Status:
Not answered


“Do your little bit of good where you are; it's those little bits of good put together that overwhelm the world.” ― Desmond Tutu
AP Calculus Derivatives Test: Monday, April 16th
Physics Test: Wednesday, April 18th


Introduction
Hello World is a simple program that can be written in almost every programming language as a very first step into that programming language. What is required is documented below:
- curiosity about new programming languages
- desire to learn
- a computer
- a text editor
- the appropriate compiler for each language
Ada
Ada is a structured, statically typed, imperative, and object-oriented high-level programming language, extended from Pascal and other languages. It has built-in language support for design by contract (DbC), extremely strong typing, explicit concurrency, tasks, synchronous message passing, protected objects, and non-determinism. Ada improves code safety and maintainability by using the compiler to find errors in favor of runtime errors. Ada is an international technical standard, jointly defined by the International Organization for Standardization (ISO), and the International Electrotechnical Commission (IEC). As of 2020, the standard, called Ada 2012 informally, is ISO/IEC 8652:2012.
Ada was originally designed by a team led by French computer scientist Jean Ichbiah of CII Honeywell Bull under contract to the United States Department of Defense (DoD) from 1977 to 1983 to supersede over 450 programming languages used by the DoD at that time. Ada was named after Ada Lovelace (1815–1852), who has been credited as the first computer programmer.
Ada is used to design extremely large software systems. It is often used in US government agencies that depend on no errors in the code. It is currently used in the US Department of Defense, NATO, Airplan Info Management Systems, as well as many railway systems.
Hello World in Ada:
with Ada.Text_IO; use Ada.Text_IO;
procedure hello is
begin
Put_Line ("Hello World!");
end hello;
BASIC
BASIC (Beginners' All-purpose Symbolic Instruction Code) is a family of general-purpose, high-level programming languages whose design philosophy emphasizes ease of use. The original version was designed by John G. Kemeny and Thomas E. Kurtz and released at Dartmouth College in 1964. They wanted to enable students in fields other than science and mathematics to use computers. At the time, nearly all use of computers required writing custom software, which was something only scientists and mathematicians tended to learn. In addition to the language itself, Kemeny and Kurtz developed the Dartmouth Time Sharing System (DTSS), which allowed multiple users to edit and run BASIC programs at the same time. This general model became very popular on minicomputer systems like the PDP-11 and Data General Nova in the late 1960s and early 1970s. Hewlett-Packard produced an entire computer line for this method of operation, introducing the HP2000 series in the late 1960s and continuing sales into the 1980s. Many early video games trace their history to one of these versions of BASIC. The emergence of early microcomputers in the mid-1970s led to the development of number of BASIC dialects, including Microsoft BASIC in 1975. Due to the tiny main memory available on these machines, often 4 kB, a variety of Tiny BASIC dialects was also created. BASIC was available for almost any system of the era, and naturally became the de facto programming language for the home computer systems that emerged in the late 1970s. These machines almost always had a BASIC interpreter installed by default, often in the machine's firmware or sometimes on a ROM cartridge. BASIC fell from use during the later 1980s as newer machines with far greater capabilities came to market and other programming languages (such as Pascal and C) became tenable. In 1991, Microsoft released Visual Basic, combining a greatly updated version of BASIC with a visual forms builder. This reignited use of the language and "VB" remains a major programming language in the form of VB.NET.
BASIC has no real modern uses other than historic and academic. Many other BASIC dialects have also sprung up since 1990, including the open source QB64 and FreeBASIC, inspired by QBasic, and the Visual Basic-styled RapidQ, Basic For Qt and Gambas. Modern commercial incarnations include PureBasic, PowerBASIC, Xojo, Monkey X and True BASIC (the direct successor to Dartmouth BASIC from a company controlled by Kurtz). Several web-based simple BASIC interpreters also now exist, including Quite BASIC and Microsoft's Small Basic. Many versions of BASIC are also now available for smartphones and tablets via the Apple App Store, or Google Play store for Android. On game consoles, an application for the Nintendo 3DS and Nintendo DSi called Petit Computer allows for programming in a slightly modified version of BASIC with DS button support.
Hello World in BASIC:
PRINT "Hello, world!"
Pascal
Pascal is an imperative and procedural programming language, designed by Niklaus Wirth as a small, efficient language intended to encourage good programming practices using structured programming and data structuring. It is named in honour of the French mathematician, philosopher and physicist Blaise Pascal.
Based on Wirth's book, Algorithms + Data Structures = Programs, Pascal was developed on the pattern of the ALGOL 60 language. Wirth was involved in the process to improve the language as part of the ALGOL X efforts and proposed a version known as ALGOL W. This was not accepted, and the ALGOL X process bogged down. In 1968, Wirth decided to abandon the ALGOL X process and further improve ALGOL W, releasing this as Pascal in 1970.
On top of ALGOL's scalars and arrays, Pascal enabled defining complex datatypes and building dynamic and recursive data structures such as lists, trees and graphs. Pascal has strong typing on all objects, which means that one type of data cannot be converted or interpreted as another without explicit conversions. Unlike most languages in the C-family, Pascal allows nested procedure definitions to any level of depth, and also allows most kinds of definitions and declarations inside subroutines (procedures and functions). A program is thus syntactically similar to a single procedure or function. Pascal became very successful in the 1970s, notably on the burgeoning minicomputer market. Compilers were also available for many microcomputers as the field emerged in the late 1970s. It was widely used as a teaching language in university-level programming courses in the 1980s, and also used in production settings for writing commercial software during the same period. It was displaced by the C programming language during the late 1980s and early 1990s as UNIX-based systems became popular, and especially with the release of C++.
A derivative known as Object Pascal designed for object-oriented programming was developed in 1985; this was used by Apple Computer and Borland in the late 1980s and later developed into Delphi on the Microsoft Windows platform. Extensions to the Pascal concepts led to the languages Modula-2 and Oberon.
Today Pascal is primarily used to academic purposes, however, a derivative language called Object Pascal continues to be used by Microsoft today for some Windows applications.
Hello World in Pascal:
program HelloWorld(output);
begin
Write('Hello, World!')
end.
Python
Python is an interpreted, high-level, general-purpose programming language. Created by Guido van Rossum and first released in 1991, Python's design philosophy emphasizes code readability with its notable use of significant whitespace. Its language constructs and object-oriented approach aim to help programmers write clear, logical code for small and large-scale projects.
Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including structured (particularly, procedural), object-oriented, and functional programming. Python is often described as a "batteries included" language due to its comprehensive standard library. Python was conceived in the late 1980s as a successor to the ABC language. Python 2.0, released in 2000, introduced features like list comprehensions and a garbage collection system capable of collecting reference cycles. Python 3.0, released in 2008, was a major revision of the language that is not completely backward-compatible, and much Python 2 code does not run unmodified on Python 3.
The Python 2 language was officially discontinued in 2020 (first planned for 2015), and "Python 2.7.18 is the last Python 2.7 release and therefore the last Python 2 release." No more security patches or other improvements will be released for it. With Python 2's end-of-life, only Python 3.5.x and later are supported.
Python interpreters are available for many operating systems. A global community of programmers develops and maintains CPython, an open source[34] reference implementation. A non-profit organization, the Python Software Foundation, manages and directs resources for Python and CPython development.
Hello World in Python:
print('Hello, world!')
x86 Assembly
x86 Assembly Language is a family of backward-compatible assembly languages, which provide some level of compatibility all the way back to the Intel 8008 introduced in April 1972. x86 assembly languages are used to produce object code for the x86 class of processors. Like all assembly languages, it uses short mnemonics to represent the fundamental instructions that the CPU in a computer can understand and follow. Compilers sometimes produce assembly code as an intermediate step when translating a high level program into machine code. Regarded as a programming language, assembly coding is machine-specific and low level. Assembly languages are more typically used for detailed and time critical applications such as small real-time embedded systems or operating system kernels and device drivers.
Each x86 assembly instruction is represented by a mnemonic which, often combined with one or more operands, translates to one or more bytes called an opcode; the NOP instruction translates to 0x90, for instance and the HLT instruction translates to 0xF4. There are potential opcodes with no documented mnemonic which different processors may interpret differently, making a program using them behave inconsistently or even generate an exception on some processors. These opcodes often turn up in code writing competitions as a way to make the code smaller, faster, more elegant or just show off the author's prowess.
Hello World in x86 Assembly:
; Image base = 0x00400000
%define RVA(x) (x-0x00400000)
section .text
push dword hello
call dword [printf]
push byte +0
call dword [exit]
ret
section .data
hello db "Hello world!"
section .idata
dd RVA(msvcrt_LookupTable)
dd -1
dd 0
dd RVA(msvcrt_string)
dd RVA(msvcrt_imports)
times 5 dd 0 ; ends the descriptor table
msvcrt_string dd "msvcrt.dll", 0
msvcrt_LookupTable:
dd RVA(msvcrt_printf)
dd RVA(msvcrt_exit)
dd 0
msvcrt_imports:
printf dd RVA(msvcrt_printf)
exit dd RVA(msvcrt_exit)
dd 0
msvcrt_printf:
dw 1
dw "printf", 0
msvcrt_exit:
dw 2
dw "exit", 0
dd 0
References
- Ada
- Ada Wikipedia
- BASIC
- BASIC Wikipedia
- Pascal
- Pascal Wikipedia
- Python
- Python Wikipedia
- x86 Assembly
- x86 Assembly Wikipedia


More than just a name.
Learning should never stop, no matter how difficult or obscure it may be.
By Guy is committed to pursuing the thing that matters most:
passion. The belief that all amazing
things come from that innate drive.
From developing applications to video editing, true joy comes from turning those crazy ideas into a reality.


Skip to navigation
Skip to content
Skip to footer
Homepage - egghead example
Article Title
Another Article Title
Open dialog
Dialog title
Close


Investors can expect a 10-15% decline, with a possibility of a 20% decline. More details at https://seekingalpha.com/article/4060118-expect-10minus-15-percent-decline-stock-market
In the stock market today, shares of Panera Bread (PNRA) soared 14% to 312.57 on news that it's being bought by JAB, whose brands include Keurig, Krispy Kreme and Peet's Coffee & Tea. The deal is valued at more than $7.5 billion and values Panera at around $315 a share.
Contributer to stock market: President Donald Trump is slated to meet with his Chinese counterpart, Xi Jinping, in a closely watched two-day summit that could influence the relationship between the world’s largest economies amid growing tensions.
Snap shares priced at $17 and opened at $24 in their March 2 public debut. The stock hit an intraday high of $29.44 on March 3. If the stock closes down on Wednesday it would mark Snap's fifth straight session of declines.


>
Email:
Input Your Password:
Bio:
Tell me about yourself
<
How did you hear about us?
Billboard
Radio Advertisement
Internet Advertisement
Other
Select your browser:
Google Chrome
Mozilla Firefox
Vivaldi
Safari
Submit the form


Open your favourite editor and paste:
<?xml version="1.0" encoding="UTF-8"?>
<changelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.liquigraph.org/schema/1.0/liquigraph.xsd">
<changeset id="hello-world" author="you">
<query>CREATE (n:Sentence {text:'Hello monde!'}) RETURN n</query>
</changeset>
<changeset id="hello-world-fixed" author="you">
<query>MATCH (n:Sentence {text:'Hello monde!'}) SET n.text='Hello world!' RETURN n</query>
</changeset>
</changelog>
Save these migrations in ${your_project}/${root_classpath_folder}/changelog.xml.
Then, running the migrations can be done as follows:
import org.liquigraph.core.api.Liquigraph;
import org.liquigraph.core.configuration.Configuration;
import org.liquigraph.core.configuration.ConfigurationBuilder;
// [...]
Configuration configuration = new ConfigurationBuilder()
.withMasterChangelogLocation("changelog.xml")
.withUri("jdbc:neo4j://localhost:7474")
.withRunMode()
.build();
Liquigraph liquigraph = new Liquigraph();
liquigraph.runMigrations(configuration);
If want to dry-run your migrations, replace withRunMode()
by withDryRunMode(Paths.get(outputDirectory))
, where outputDirectory
specifies the path of the directory where output.cypher
will be written in.
Save these migrations in ${your_project}/src/main/resources/changelog.xml.
Then, include Liquigraph plugin in your pom.xml:
<plugin>
<groupId>org.liquigraph</groupId>
<artifactId>liquigraph-maven-plugin</artifactId>
<version>1.0-RC3</version>
<configuration>
<changelog>changelog.xml</changelog><!-- classpath location -->
<jdbcUri>jdbc:neo4j://localhost:7474</jdbcUri>
</configuration>
<executions>
<execution>
<id>run-migrations</id>
<goals>
<goal>dry-run</goal>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
And finally, run:
$> mvn clean package
Full documentation is here.
Save these migrations in ${your_project}/migrations/changelog.xml.
Homebrew users, skip the following installation steps altogether. Specific instructions are here.
LIQUIGRAPH_DIR
LIQUIGRAPH_DIR/liquigraph-cli/
to your PATH
LIQUIGRAPH_DIR/liquigraph-cli/liquigraph.sh
is executableYou can now check your installation by executing the following command (reminder to non-Unix users: replace .sh
with .bat
):
$> cd LIQUIGRAPH_DIR/liquigraph-cli
$> ./liquigraph.sh --help
A description should be displayed. Then, simulate the changes (replace /tmp
with whatever floats your boat):
$> ./liquigraph.sh --changelog "${your_project}/migrations/changelog.xml" \
--username neo4j \
--password \ # leave empty (password prompt will appear)
--graph-db-uri jdbc:neo4j://localhost:7474/ \
--dry-run-output-directory /tmp
# check contents
$> less /tmp/output.cypher
And finally, run:
$> ./liquigraph.sh --changelog "${your_project}/migrations/changelog.xml" \
--username neo4j \
--password \ # leave empty (password prompt will appear)
--graph-db-uri jdbc:neo4j://localhost:7474/
The above methods will prompt for your Neo4j password. If you wish to run liquigraph without password prompt (i.e. non interactively):
$> touch my_password.txt
# update mypassword.txt to contain your password and chmod appropriately
$> ./liquigraph.sh --changelog "${your_project}/migrations/changelog.xml" \
--username neo4j \
--graph-db-uri jdbc:neo4j://localhost:7474/ \
--password < my_password.txt
Liquibase users should have no problems grasping the concepts of Liquigraph. The latter is heavily inspired from the first.
A Liquigraph changelog defines a set of migrations to be performed. There can be only one changelog as entry point per project.
<?xml version="1.0" encoding="UTF-8"?>
<changelog>
<!-- import "sub-changelogs"-->
<import resource="version_1/sub_changelog.xml" />
<import resource="version_2/sub_changelog.xml" />
<!-- and/or define directly changesets-->
<changeset [...] />
<!-- [...] -->
</changelog>
Both sub_changelog.xml
files could import changelogs and/or define changeset
elements. Their root element is also changelog
.
A Liquigraph changeset describes one or more create or update statement. These statements must be written in Cypher Query Language and are wrapped in a single transaction (1 transaction per changeset). A changeset can be run only once (incremental) and cannot be altered (immutable) against the same graph database instance, by default. Finally, a changeset is uniquely identified within the changelog by its mandatory ID and author attributes.
<changeset id="unique_identifier" author="team_or_individual_name">
<!-- 1 to n queries: all executed in 1 transaction -->
<query>CREATE (m:MyAwesomeNode) RETURN m</query>
<query>CREATE (m:MyOtherAwesomeNode) RETURN m</query>
</changeset>
Both sub_changelog.xml
files could import changelogs and/or define changeset
elements.
An execution context is a simple string, defined at changeset level. A changeset can have 0, 1 or more execution contexts (in the latter case, they're comma-separated). For instance:
<changeset id="hello-world" author="you" contexts="foo,bar">
<query>CREATE (n:Sentence {text:'Hello monde!'}) RETURN n</query>
</changeset>
If no execution contexts are specified at runtime, all changesets will match.
If one or more execution contexts are specified at runtime, changesets will be selected:
As previously mentioned, Liquigraph changesets are immutable by default (an error will be thrown if they have been altered). That said, there may be situations where changesets should be run whenever their contents have changed. To achieve this, you just need to define one extra attribute:
<changeset id="hello-world" author="you" run-on-change="true">
<query>CREATE (n:Sentence {text:'Hello monde!'}) RETURN n</query>
</changeset>
As previously mentioned, Liquigraph changesets are incremental by default (they will be executed only once). That said, there may be situations where changesets should be run at every execution. To achieve this, you just need to define one extra attribute:
<changeset id="hello-world" author="you" run-always="true">
<query>CREATE (n:Sentence {text:'Hello monde!'}) RETURN n</query>
</changeset>
Changeset preconditions act like guards. They make sure that the changeset query will be executed if and only if the precondition is met.
A precondition can be simple (1 Cypher query) or compound (with boolean AND/OR operators).
In any case, each of the subqueries/the simple query has to return exactly one column named result of type boolean (true|false).
If the precondition fails, an error policy has to be selected amongst the following choices:
Here is a basic precondition example (you are right: this is the dumbest precondition ever):
<changeset id="hello-world" author="you">
<precondition if-not-met="MARK_AS_EXECUTED">
<query>RETURN true AS result</query>
</precondition>
<query>CREATE (n:Sentence {text:'Hello monde!'}) RETURN n</query>
</changeset>
Here comes a slightly more complicated example:
<changeset id="contest-winner-selection" author="futuroscope-engineering">
<precondition if-not-met="FAIL">
<or>
<and>
<query>MATCH (p:User {twitter:'@fbiville'}) RETURN NOT (p.underAge) AS result</query>
<query><![CDATA[MATCH (p:User {twitter:'@fbiville'}) OPTIONAL MATCH (p)-[:SUFFERS_FROM]->(d:NEURO_DISORDER {name:'photosensitive epilepsy'}) RETURN (d IS NULL) AS result]]></query>
</and>
<query><![CDATA[MATCH (p:User {twitter:'@fbiville'}) OPTIONAL MATCH (p)<-[:HAS_PARENTAL_CONTROL]-(parent:User) RETURN NOT (parent IS NULL) AS RESULT]]></query>
</or>
</precondition>
<query><![CDATA[MATCH (p:User {twitter:'@fbiville'}) CREATE (p)-[:IS_OFFERED_FREE_PASS_TO]->(:Location {name:'Futuroscope'})]]></query>
</changeset>
Feel free to ping @fbiville if you have any questions.
Bug reporting, improvement suggestion... belong here.


WITNESS LIST State Affairs Committee January 28, 1997-1:30P SB 221 For: STACY, TOM (SELF), AUSTIN WALKER, RONALD (TX ASSN OF REALTORS), AUSTIN Registering, but not testifying: For: MINTZ, DAVID (TX APARTMENT ASSN), AUSTIN NIEMANN, LARRY (TX BUILDING OWNERS), AUSTIN STINSON, BILL (TX ASSN OF REALTORS), AUSTIN SB 223 Registering, but not testifying: For: STACY, TOM (SELF), AUSTIN STINSON, BILL (TX ASSN OF REALTORS), AUSTIN WALKER, RONALD (TX ASSN OF REALTORS), AUSTIN


Project: Spirent TestCenter Basics
Description: Provides basic traffic quickcalls for the Spirent TestCenter session type and response maps for result and statistics views
Category: library
Class: Tested by Spirent
Tags: Test Equipment, Traffic Generator
1 QuickCall Library in project://di_STC
StartArp
Starts ARP/ND on all devices in config. Returns status in a JSON block.
Returns block
status "OK" if all ARPs resolve successfully, "error" otherwise
RunTraffic
Run all traffic generators in current STC config for a specified time and return basic traffic stats.
| Argument |
Description |
| run_time |
Time in seconds to run traffic |
StartTraffic
Start all traffic generators in current STC config
StopTraffic
Stop all traffic generators in current STC config
GetPortInfo
Get info on all ports in the current STC config.


class Jekyll::EntryFilter
Constants
- SPECIAL_LEADING_CHAR_REGEX
Attributes
site[R]
Public Class Methods
new(site, base_directory = nil)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 9 def initialize(site, base_directory = nil) @site = site @base_directory = derive_base_directory( @site, base_directory.to_s.dup ) end
Public Instance Methods
backup?(entry)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 64 def backup?(entry) entry.end_with?("~") end
base_directory()
click to toggle source
# File lib/jekyll/entry_filter.rb, line 16 def base_directory @base_directory.to_s end
derive_base_directory(site, base_dir)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 20 def derive_base_directory(site, base_dir) base_dir[site.source] = "" if base_dir.start_with?(site.source) base_dir end
excluded?(entry)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 68 def excluded?(entry) glob_include?(site.exclude - site.include, relative_to_source(entry)).tap do |excluded| if excluded Jekyll.logger.debug( "EntryFilter:", "excluded #{relative_to_source(entry)}" ) end end
filter(entries)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 31 def filter(entries) entries.reject do |e| # Reject this entry if it is just a "dot" representation. # e.g.: '.', '..', '_movies/.', 'music/..', etc next true if e.end_with?(".") # Check if the current entry is explicitly included and cache the result included = included?(e) # Reject current entry if it is excluded but not explicitly included as well. next true if excluded?(e) && !included # Reject current entry if it is a symlink. next true if symlink?(e) # Do not reject current entry if it is explicitly included. next false if included # Reject current entry if it is special or a backup file. special?(e) || backup?(e) end end
included?(entry)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 54 def included?(entry) glob_include?(site.include, entry) || glob_include?(site.include, File.basename(entry)) end
relative_to_source(entry)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 25 def relative_to_source(entry) File.join( base_directory, entry ) end
special?(entry)
click to toggle source
# File lib/jekyll/entry_filter.rb, line 59 def special?(entry) SPECIAL_LEADING_CHAR_REGEX.match?(entry) || SPECIAL_LEADING_CHAR_REGEX.match?(File.basename(entry)) end


Lombardo Funeral Home has new owner
One of the area's biggest funeral home operators has been acquired by a publicly traded company out of Texas, marking the end of its independence even though it will continue operating under its name and family management.
Carriage Services Inc., a major national operator of funeral homes and cemeteries, did not say how much it paid to acquire Buffalo's Lombardo Funeral Homes, which marks the company's entry into the Western New York market. Carriage, which is traded on the New York Stock Exchange, runs 183 funeral homes in 29 states and 29 cemeteries in 11 states, and operates as a consolidator of what it calls the "deathcare services" industry.
Founded in 1907 by Joseph Lombardo Sr., and then led successively by his wife, his two sons and now his grandson, Lombardo Funeral Homes has four locations that serve about 2,000 families per year. Joseph P. Lombardo, the current president, said he talked to four companies before settling on Carriage. He will remain as head of Lombardo.


Mike Matcke
Technical PM, CSM, Jack of all Trades
Thanks for checking out my site! My name is Mike and just like the header says, I consider myself a "Jack of all Trades." How I ended up here, well it starts with my curiosity and creativity as an individual. I love to learn!
My own curiosity and creativity has lead me
to discovering different skill sets over the years. Originally, I was a videographer, recording everything and making short movies. Eventually,
this lead to me getting hired to film and produce videos for weddings, music videos, segments for news stations and other projects during my weekends.
At the time, I was working as a product manager at a big company and I saw a connection with my video projects to project management. Which lead me to learning more about the skillset and
eventually moving into Project Mangement Roles at my company.
As a Project Manager, I began my career managing projects around products, specifically eCommerce. This experience got me exposed to working with developers, engineers
Dev Ops and other more technical fields.
Again, this peaked my curiosity and I found myself exploring programming!
All the above has resulted in me becoming an experienced and exceptional Technical Professional and an asset to any team I join!
Please review some of my work and if you are interested, please reach out to me!
Thank you for taking the time to read this and for visiting my site.


Here’s a quick article that shows you how to easily default links to rel=”nofollow”.


Totally math
Start
1. 1+2-1+3-1+4+(-5)
11
12
3
6
2. lim x→∞ (3x² + x)/(x² + 1)
5
7
16
3
3. 3+3x3-3-3-3
0
50
100
3
Refresh to replay!!!
Correct Answers:
0
Incorrect Answers:
0
Unanswered:
0
Done


HackbertToken
My Wallet
Balance
Balance
:
HAC
Transfer
Transfer
Admin of HacerBert
Send Rewards to users
Send to users
State
Total Supply
:
HAC
Total Deposited HackBert
:
HAC
Total Users
:
Total Activated Users
:
Settings
Minimum Deposit Amount
Minimum Withraw Amount
Activation Days
Set Params
My Referral Link
http://<IP_ADDRESS>:3000?ref=0x2324fd3422
Welcome to HacerBert
My information
Referral address
:
Balance
:
HAC
total deposited HAC
:
HAC
active state
:
last rewards
:
Deposit
Send Deposit Request
Withdraw
Send Withdraw Request
My Referral Link
http://<IP_ADDRESS>:3000?ref=0x2324fd3422


Home
Signup Form
Search Form
Questionnaire Form
Login Form
Color Building Form
Shipping & Billing
Scheduling Form
Credit/Debit
Search your favorite ice cream flavor
Your name:
Your Flavor:
Vanilla
Strawberry
Chocolate
Mint
Butter Pecan
Cotton Candy
Find it


Narrow your search with a helpful Survey!

Manage your alerts in your profile page


This Calculator is designed to calculate the grade point average of the semesters at the SRM Institute of Science & Technology, according to the 2018 regulations. Both CGPA (Cummulative Grade Point Average) and SGPA (Semester Grade Point Average) can be calculated using this application.
Enter individual course credits and grades obtained in each course.
Enter individual semester GPA and total credits obtained in each semester.
This site was designed with the sole purpose of developing the creator's web dev skills and contains elements and assests that do not belong to the author. Under no circumstance shall the author have any liability to you for any loss or damage of any kind incurred as a result of the use of the site or reliance on any information provided on the site. Your use of the site and your reliance on any information on the site is solely at your own risk. This disclaimer was created using Termly’s disclaimer generator.


5735 Hitchner Hall, 347 / 368
School of Biology & Ecology, University of Maine
Orono, ME 04469
jose.meireles at maine.edu
(207) 581 2529


{% load static %}
Register as a new admin
{{error}}
Registered Successfully Awaiting Activation
NOTE:… If you dont recieve a code after 30min … it means your request was declined by CodeUp Blood Team


--- layout: post title: "ASP.NET validation revisited" description: "Is the built-in validation framework better than applicative validation?" date: 2022-08-15 5:48 UTC tags: [ASP.NET Web API] --- {% include JB/setup %}
{{ page.description }}
I recently published an article called An applicative reservation validation example in C# in which I describe how to use the universal abstractions of applicative functors and semigroups to implement reusable, composable validation.
One reader reaction made me stop and think:
"An exercise on how to reject 90% of the framework's existing services (*Validation) only to re implement them more poorly, by renouncing standardization, interoperability and globalization all for the glory of FP."
(At the time of posting, the PopCatalin Twitter account's display name was Prime minister of truth™ カタリンポップ🇺🇦, which I find unhelpful. The linked GitHub account locates the user in Cluj-Napoca, a city I've repeatedly visited for conferences - the last time as recent as June 2022. I wouldn't be surprised if we've interacted, but if so, I'm sorry to say that I can't connect these accounts with one of the many wonderful people I've met there. In general, I'm getting a strong sarcastic vibe from that account, and I'm not sure whether or not to take Pronouns kucf/fof seriously. As the possibly clueless 51-year white male that I am, I will proceed with good intentions and to the best of my abilities.)
That reply is an important reminder that I should once in a while check my assumptions. I'm aware that the ASP.NET framework comes with validation features, but I many years ago dismissed them because I found them inadequate. Perhaps, in the meantime, these built-in services have improved to the point that they are to be preferred over applicative validation.
I decided to attempt to refactor the code to take advantage of the built-in ASP.NET validation to be able to compare the two approaches. This article is an experience report.
In order to compare the two approaches, the ASP.NET-based validation should support the same validation features as the applicative validation example:
At
property is required and should be a valid date and time. If it isn't, the validation message should report the problem and the offending input.Email
property should be required. If it's missing, the validation message should state so.Quantity
property is required and should be a natural number. If it isn't, the validation message should report the problem and the offending input.The previous article includes an interaction example that I'll repeat here for convenience:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 Content-Type: application/json { "at": "large", "name": "Kerry Onn", "quantity": -1 } HTTP/1.1 400 Bad Request Invalid date or time: large. Email address is missing. Quantity must be a positive integer, but was: -1.
ASP.NET validation formats the errors differently, as you'll see later in this article. That's not much of a concern, though: Error messages are for other developers. They don't really have to be machine-readable or have a strict shape (as opposed to error types, which should be machine-readable).
Reporting the offending values, as in "Quantity must be a positive integer, but was: -1." is part of the requirements. A REST API can make no assumptions about its clients. Perhaps one client is an unattended batch job that only logs errors. Logging offending values may be helpful to maintenance developers of such a batch job.
The first observation to make about the ASP.NET validation API is that it's specific to ASP.NET. It's not a general-purpose API that you can use for other purposes.
If, instead, you need to validate input to a console application, a background message handler, a batch job, or a desktop or phone app, you can't use that API.
Perhaps each of these styles of software come with their own validation APIs, but even if so, that's a different API you'll have to learn. And in cases where there's no built-in validation API, then what do you do?
The beauty and practicality of applicative validation is that it's universal. Since it's based on mathematical foundations, it's not tied to a particular framework, platform, or language. These concepts exist independently of technology. Once you understand the concepts, they're always there for you.
The code example from the previous article, as well as here, build upon the code base that accompanies Code That Fits in Your Head. An example code base has to be written in some language, and I chose C# because I'm more familiar with it than I am with Java, C++, or TypeScript. While I wanted the code base to be realistic, I tried hard to include only coding techniques and patterns that you could use in more than one language.
As I wrote the book, I ran into many interesting problems and solutions that were specific to C# and ASP.NET. While I found them too specific to include in the book, I wrote a series of blog posts about them. This article is now becoming one of those.
The point about the previous article on applicative reservation validation in C# was to demonstrate how the general technique works. Not specifically in ASP.NET, or even C#, but in general.
It just so happens that this example is situated in a context where an alternative solution presents itself. This is not always the case. Sometimes you have to solve this problem yourself, and when this happens, it's useful to know that validation is a solved problem. Even so, while a universal solution exists, it doesn't follow that the universal solution is the best. Perhaps there are specialised solutions that are better, each within their constrained contexts.
Perhaps ASP.NET validation is an example of that.
The following is a report on my experience refactoring validation to use the built-in ASP.NET validation API.
I decided to start with the Email
property, since the only requirement is that this value should be present. That seemed like an easy way to get started.
I added the [Required] attribute to the ReservationDto
class' Email
property. Since this code base also uses nullable reference types, it was necessary to also annotate the property with the [NotNull] attribute:
[Required, NotNull] public string? Email { get; set; }
That's not too difficult, and seems to be working satisfactorily:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 > content-type: application/json { "at": "2022-11-21 19:00", "name": "Kerry Onn", "quantity": 1 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|552ab5ff-494e1d1a9d4c6355.", "errors": { "Email": [ "The Email field is required." ] } }
As discussed above, the response body is formatted differently than in the applicative validation example, but I consider that inconsequential for the reasons I gave.
So far, so good.
The next property I decided to migrate was Quantity
. This must be a natural number; that is, an integer greater than zero.
Disappointingly, no such built-in validation attribute seems to exist. One highly voted Stack Overflow answer suggested using the [Range] attribute, so I tried that:
[Range(1, int.MaxValue, ErrorMessage = "Quantity must be a natural number.")] public int Quantity { get; set; }
As a declarative approach to validation goes, I don't think this is off to a good start. I like declarative programming, but I'd prefer to be able to declare that Quantity
must be a natural number, rather than in the range of 1
and int.MaxValue
.
Does it work, though?
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "at": "2022-11-21 19:00", "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|d9a6be38-4be82ede7c525913.", "errors": { "Email": [ "The Email field is required." ], "Quantity": [ "Quantity must be a natural number." ] } }
While it does capture the intent that Quantity
must be one or greater, it fails to echo back the offending value.
In order to address that concern, I tried reading the documentation to find a way forward. Instead I found this:
"Internally, the attributes call String.Format with a placeholder for the field name and sometimes additional placeholders. [...]"
"To find out which parameters are passed to
String.Format
for a particular attribute's error message, see the DataAnnotations source code."
Really?!
If you have to read implementation code, encapsulation is broken.
Hardly impressed, I nonetheless found the RangeAttribute source code. Alas, it only passes the property name
, Minimum
, and Maximum
to string.Format
, but not the offending value:
return string.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, Minimum, Maximum);
This looked like a dead end, but at least it's possible to extend the ASP.NET validation API:
public sealed class NaturalNumberAttribute : ValidationAttribute { protected override ValidationResult IsValid( object value, ValidationContext validationContext) { if (validationContext is null) throw new ArgumentNullException(nameof(validationContext)); var i = value as int?; if (i.HasValue && 0 < i) return ValidationResult.Success; return new ValidationResult( $"{validationContext.MemberName} must be a positive integer, but was: {value}."); } }
Adding this NaturalNumberAttribute
class enabled me to change the annotation of the Quantity
property:
[NaturalNumber] public int Quantity { get; set; }
This seems to get the job done:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "at": "2022-11-21 19:00", "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|bb45b60d-4bd255194871157d.", "errors": { "Email": [ "The Email field is required." ], "Quantity": [ "Quantity must be a positive integer, but was: 0." ] } }
The [NaturalNumber]
attribute now correctly reports the offending value together with a useful error message.
Compare, however, the above NaturalNumberAttribute
class to the TryParseQuantity
function, repeated here for convenience:
private Validated<string, int> TryParseQuantity() { if (Quantity < 1) return Validated.Fail<string, int>( $"Quantity must be a positive integer, but was: {Quantity}."); return Validated.Succeed<string, int>(Quantity); }
TryParseQuantity
is shorter and has half the cyclomatic complexity of NaturalNumberAttribute
. In isolation, at least, I'd prefer the shorter, simpler alternative.
Remaining is validation of the At
property. As a first step, I converted the property to a DateTime
value and added attributes:
[Required, NotNull] public DateTime? At { get; set; }
I'd been a little apprehensive doing that, fearing that it'd break a lot of code (particularly tests), but that turned out not to be the case. In fact, it actually simplified a few of the tests.
On the other hand, this doesn't really work as required:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "at": "2022-11-21 19:00", "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|1e1d600e-4098fb36635642f6.", "errors": { "dto": [ "The dto field is required." ], "$.at": [ "The JSON value could not be converted to System.Nullable`1[System.DateTime].↩ Path: $.at | LineNumber: 0 | BytePositionInLine: 26." ] } }
(I've wrapped the last error message over two lines for readability. The ↩
symbol indicates where I've wrapped the text.)
There are several problems with this response. First, in addition to complaining about the missing at
property, it should also have reported that there are problems with the Quantity
and that the Email
property is missing. Instead, the response implies that the dto
field is missing. That's likely confusing to client developers, because dto
is an implementation detail; it's the name of the C# parameter of the method that handles the request. Client developers can't and shouldn't know this. Instead, it looks as though the REST API somehow failed to receive the JSON document that the client posted.
Second, the error message exposes other implementation details, here that the at
field has the type System.Nullable`1[System.DateTime]
. This is, at best, irrelevant. At worst, it could be a security issue, because it reveals to a would-be attacker that the system is implemented on .NET.
Third, the framework rejects what looks like a perfectly good date and time: 2022-11-21 19:00
. This is a breaking change, since the API used to accept such values.
What's wrong with 2022-11-21 19:00
? It's not a valid ISO 8601 string. According to the ISO 8601 standard, the date and time must be separated by T
:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "at": "2022-11-21T19:00", "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|1e1d600f-4098fb36635642f6.", "errors": { "Email": [ "The Email field is required." ], "Quantity": [ "Quantity must be a positive integer, but was: 0." ] } }
Posting a valid ISO 8601 string does, indeed, enable the client to proceed - only to receive a new set of error messages. After I converted At
to DateTime?
, the ASP.NET validation framework fails to collect and report all errors. Instead it stops if it can't parse the At
property. It doesn't report any other errors that might also be present.
That is exactly the requirement that applicative validation so elegantly solves.
While it's true that 2022-11-21 19:00
isn't valid ISO 8601, it's unambiguous. According to Postel's law an API should be a Tolerant Reader. It's not.
This problem, however, is solvable. First, add the Tolerant Reader:
public sealed class DateTimeConverter : JsonConverter<DateTime> { public override DateTime Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return DateTime.Parse( reader.GetString(), CultureInfo.InvariantCulture); } public override void Write( Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { if (writer is null) throw new ArgumentNullException(nameof(writer)); writer.WriteStringValue(value.ToString("s")); } }
Then add it to the JSON serialiser's Converters:
opts.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
This, at least, addresses the Tolerant Reader concern:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "at": "2022-11-21 19:00", "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|11576943-400dafd4b489c282.", "errors": { "Email": [ "The Email field is required." ], "Quantity": [ "Quantity must be a positive integer, but was: 0." ] } }
The API now accepts the slightly malformed at
field. It also correctly handles if the field is entirely missing:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|11576944-400dafd4b489c282.", "errors": { "At": [ "The At field is required." ], "Email": [ "The Email field is required." ], "Quantity": [ "Quantity must be a positive integer, but was: 0." ] } }
On the other hand, it still doesn't gracefully handle the case when the at
field is unrecoverably malformed:
POST /restaurants/1/reservations?sig=1WiLlS5705bfsffPzaFYLwntrS4FCjE5CLdaeYTHxxg%3D HTTP/1.1 content-type: application/json { "at": "foo", "name": "Kerry Onn", "quantity": 0 } HTTP/1.1 400 Bad Request Content-Type: application/problem+json; charset=utf-8 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|11576945-400dafd4b489c282.", "errors": { "": [ "The supplied value is invalid." ], "dto": [ "The dto field is required." ] } }
The supplied value is invalid.
and The dto field is required.
? That's not really helpful. And what happened to The Email field is required.
and Quantity must be a positive integer, but was: 0.
?
If there's a way to address this problem, I don't know how. I've tried adding another custom attribute, similar to the above NaturalNumberAttribute
class, but that doesn't solve it - probably because the model binder (that deserialises the JSON document to a ReservationDto
instance) runs before the validation.
Perhaps there's a way to address this problem with yet another class that derives from a base class, but I think that I've already played enough Whack-a-mole to arrive at a conclusion.
Your context may differ from mine, so the conclusion that I arrive at may not apply in your situation. For example, I'm given to understand that one benefit that the ASP.NET validation framework provides is that when used with ASP.NET MVC (instead of as a Web API), (some of) the validation logic can also run in JavaScript in browsers. This, ostensibly, reduces code duplication.
"Yet in the case of validation, a Declarative model is far superior to a FP one. The declarative model allows various environments to implement validation as they need it (IE: Client side validation) while the FP one is strictly limited to the environment executing the code."
On the other hand, using the ASP.NET validation framework requires more code, and more complex code, than with applicative validation. It's a particular set of APIs that you have to learn, and that knowledge doesn't transfer to other frameworks, platforms, or languages.
Apart from client-side validation, I fail to see how applicative validation "re implement[s validation] more poorly, by renouncing standardization, interoperability and globalization".
I'm not aware that there's any standard for validation as such, so I think that @PopCatalin has the 'standard' ASP.NET validation API in mind. If so, I consider applicative validation a much more standardised solution than a specialised API.
If by interoperability @PopCatalin means the transfer of logic from server side to client side, then it's true that the applicative validation I showed in the previous article runs exclusively on the server. I wonder, however, how much of such custom validation as NaturalNumberAttribute
automatically transfers to the client side.
When it comes to globalisation, I fail to see how applicative validation is less globalisable than the ASP.NET validation framework. One could easily replace the hard-coded strings in my examples with resource strings.
It would seem, again, that any sufficiently complicated custom validation framework contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of applicative validation.
"I must admit I really liked the declarative OOP model using annotations when I first saw it in Java (EJB3.0, almost 20yrs ago) until I saw FP way of doing things. FP way is so much simpler and powerful, because it's just function composition, nothing more, no hidden "magic"."
I still find myself in the same camp as Witold Szczerba. It's easy to get started using validation annotations, but it doesn't follow that it's simpler or better in the long run. As Rich Hickey points out in Simple Made Easy, simple and easy isn't the same. If I have to maintain code, I'll usually choose the simple solution over the easy solution. That means choosing applicative validation over a framework-specific validation API.
Comments
Hello Mark. I was just wondering, is it possible to use the type system to do the validation instead ?
What I mean is, for example, to make all the ReservationDto's field a type with validation in the constructor (like a class name, a class email, and so on). Normally, when the framework will build ReservationDto, it will try to construct the fields using the type constructor, and if there is an explicit error thrown during the construction, the framework will send us back the error with the provided message.
Plus, I think types like "email", "name" and "at" are reusable. And I feel like we have more possibilities for validation with that way of doing than with the validation attributes.
What do you think ?
Regards.
Maurice, thank you for writing. I started writing a reply, but it grew, so I'm going to turn it into a blog post. I'll post an update here once I've published it, but expect it to take a few weeks.
I've published the article: Can types replace validation?.