We are Manutratech Industries, a company established in 2019 with a need to create value based products and services made in Africa and that compete on a global scale. Our strategy is to put Africa on the global map as a key supplier of manufactured household products. As we build a successful African-based company, we want to change the lives of Africans through a transfer of skills and knowledge by primarily changing mindsets and perspectives of the majority of Africans living in poverty. For Africa Forever ~.
Manutratech Industries is a Fast Moving Consumer Goods (FMCG) manufacturing company based in Kenya established on the 12th of January 2019. Our products trade under the Clean Haven brand which has grown to be a very trusted brand in households in Nairobi and its environs in our years of operation. Our company is its people and just like the lion, we are fearless, bold and work as a team to deliver the highest quality products for our customers. Manutratech Industries, through the Clean Haven brand is aligned to doing Global Good. This is through our Sustainable Development Goals which we are crafting and developing to be able to roll out to our consumers and partners. Our policies are our guiding tower and they enable us to always stay deeply rooted to our beliefs and principles.
Read MoreOur ever expanding line of Clean Haven Products are manufactured with absolute professionalism and care to ensure our esteemed customers get value for their money.
See MoreOur actions are motivated by Gaia Capitalism, a principle that combines the financial and humanitarian aspects of our shared world. Our belief is that every organisation needs to play a role in making a positive change in the world and Manutratech Industries is committed to being a part of that change through the following ways primarily:
Read More


Romee Strijd Flaunts Tiny Waist In Cropped White Outfit
November 24, 2019
Romee Strijd Flaunts Tiny Waist In Cropped White Outfit
Romee Strijd shared a new photo of herself rocking a cropped white outfit, as she flaunted her tiny waist. The model was seen posing outdoors, as she wore a form-fitting jacket. It had a black front zipper, along with glittering accents that decorated her chest and midriff. The top of the accept had lapels and a pointed shoulder, and long sleeves. The pants that she wore featured a v-shaped waistline. The cut allowed her to show off her midriff and her belly button. The rest of the pants appeared to have a baggy fit. Perhaps because of the lighting and angle, the model’s waist looked especially small.
The Victoria’s Secret Angel stood on the sidewalk in front of an empty street. Behind her several palm trees and a one-story building. The weather appeared to be good when the shot was taken, with the sun shining behind the blond, making her hair glow. But this also meant that her face and body were left in the shadows. There were also a couple of puffy clouds in the sky.
Romee opted to wear her hair down in a heavy right part, as her locks had light waves throughout.  The stunner also placed her hands in her pockets, offering a laid-back vibe.
The update was geotagged in Los Angeles, California.
Fans left tons of nice compliments in the comments section, where the stunner took the time to respond to some questions.

Loading...
“Will you upload a makeup tutorial?” requested a follower.
Romee has an Instagram presence, but she also has videos on YouTube that routinely get over 500,000 views. It’s likely that her fan was hoping for a makeup tutorial there. The model has covered a range of topics like weight, photoshoot, shopping hauls.
In addition, Romee previously showed off another cropped look last June. The model was seen posing in a white tank and a black skirt. The tank top appeared to be pushed up into a cropped look, as her midriff peeked through. The skirt was sequined, and likely sparkled. The photo was in sepia-tone, so it was hard to tell. The model also wore a plaid hat, and her long hair fell down the front of her shoulders.


Module: FriendlyId::Base
- Included in:
- ActiveRecordAdapter
- Defined in:
- lib/friendly_id.rb
Instance Method Summary (collapse)
-
- (Object) has_friendly_id(method, options = {})
Set up a model to use a friendly_id.
-
- (Boolean) uses_friendly_id?
Does the model class use the FriendlyId plugin?.
Instance Method Details
- (Object) has_friendly_id(method, options = {})
Set up a model to use a friendly_id. This method accepts a hash with several possible options.
45 46 47 |
# File 'lib/friendly_id.rb', line 45 def has_friendly_id(method, = {}) raise NotImplementedError end |
- (Boolean) uses_friendly_id?
Does the model class use the FriendlyId plugin?
50 51 52 |
# File 'lib/friendly_id.rb', line 50 def uses_friendly_id? respond_to? :friendly_id_config end |


To install SCION from packages, please follow the steps in the tutorials. As a short summary, the commands to install the packages on Ubuntu are:
sudo apt-get install apt-transport-https ca-certificates echo "deb [trusted=yes] https://packages.netsec.inf.ethz.ch/debian all main" | sudo tee /etc/apt/sources.list.d/scionlab.list sudo apt-get update sudo apt-get install scionlab
Once you've saved your setup, you can deploy the configuration to your machine. The easiest way is to run the scionlab-config
script:
{% if host_id and host_secret %} sudo scionlab-config --host-id={{host_id}} --host-secret={{host_secret}} {% else %} # host-id/secret will be displayed here after saving your configuration sudo scionlab-config --host-id=<...> --host-secret=<...> {% endif %}
Alternatively, you can download the configuration tarfile with the link below and manually unpack it following the instructions in the tutorials.


DataTables is a table enhancing plug-in for the jQuery Javascript library, adding sorting, paging and filtering abilities to plain HTML tables with minimal effort. The stated goal of DataTables is:
To enhance the accessibility of data in HTML tables.
To meet this goal, DataTables is developed with two distinct groups of users in mind:
You the developers using DataTables. For developers DataTables provides a wide array of options for how data should be obtained, displayed and acted upon, along with an extensive API for accessing and manipulating the table.
End users. For those using the interface DataTables presents, actions to get the most from the information contained in tables, such as sorting and filtering, along with paging and scrolling of the data in table, are easy to use, intuitive and fast.
In most cases, to use DataTables all you need to do is include jQuery, the DataTables Javascript and DataTables CSS files in your HTML page. See the DataTables manual for details on how to do this using the latest version of DataTables.
In its simplest case, DataTables can be initialised with a single line of Javascript:
$('table').dataTable();
where the jQuery selector is used to obtain a reference to the table you want to enhance with DataTables. Optional configuration parameters can be passed in to DataTables to have it perform certain actions by using a configuration object as the parameter passed in to the DataTables constructor. For example:
$('table').dataTable( {
paginate: false,
scrollY: 300
} );
will disable paging and enable scrolling.
A full list of the options available for DataTables are available in the documentation.
Full documentation of the DataTables options, API and pug-in interface are available on the DataTables web-site. The site also contains information on the wide variety of plug-ins that are available for DataTables, which can be used to enhance and customise your table even further.
Support for DataTables is available through the DataTables forums and commercial support options are available.
DataTables is release under the MIT license. You are free to use, modify and distribute this software, as long as the copyright header is left intact (specifically the comment block which starts with /*!
.


Hi there! We're Team Jalapeño, the proud owners of NUCoins.
Our team comprises of three CS students of NUST who are motivated to make extraordinary things that would be in anyway helpful for NUSTIANS. Our scope isn't limited to NUST only, we plan to extend our horizons after we graduate for the betterment of society. What you need to know about us is that we enjoy our work and put a lot of effort to achieve the end results.
We're glad you're using NUCoins!
The basic idea behind our product NUCoins is to introduce virtual money at NUST so the students can avoid carrying paper money all the time.  With NUCoins transactions are now one click away. Tickets can now be bought and NUCoins can be transferred by a single click. NUCoins can be used to award students for their efforts whether that be in studies or any extra curricular activity. This will give them a very good incentive to work harder.


nips nips2003 nips2003-26 nips2003-26-reference knowledge-graph by maker-knowledge-mining
Source: pdf
Author: David C. Parkes, Satinder P. Singh
Abstract: Online mechanism design (MD) considers the problem of providing incentives to implement desired system-wide outcomes in systems with self-interested agents that arrive and depart dynamically. Agents can choose to misrepresent their arrival and departure times, in addition to information about their value for diﬀerent outcomes. We consider the problem of maximizing the total longterm value of the system despite the self-interest of agents. The online MD problem induces a Markov Decision Process (MDP), which when solved can be used to implement optimal policies in a truth-revealing Bayesian-Nash equilibrium. 1


Gecode::IntSet Class Reference
[Integer variables, Set variables]
#include <int.hh>
Inherits Gecode::SharedHandle.
Detailed Description
Integer sets.Integer sets are the means to specify arbitrary sets of integers to be used as domains for integer variables.
Definition at line 123 of file int.hh.
Predefined value | |
| static const IntSet | empty |
| Empty set. | |
Constructors and initialization | |
| IntSet (void) | |
| Initialize as empty set. | |
| IntSet (int n, int m) | |
| Initialize as range with minimum n and maximum m. | |
| IntSet (const int r[], int n) | |
| Initialize with n integers from array r. | |
| IntSet (const int r[][2], int n) | |
| Initialize with n ranges from array r. | |
| template<class I> | |
| IntSet (I &i) | |
| Initialize with range iterator i. | |
Range length | |
| int | size (void) const |
| Return number of ranges of the specification. | |
Range access | |
| int | min (int i) const |
| Return minimum of range at position i. | |
| int | max (int i) const |
| Return maximum of range at position i. | |
| unsigned int | width (int i) const |
| Return width of range at position i. | |
Entire set access | |
| int | min (void) const |
| Return minimum of entire set. | |
| int | max (void) const |
| Return maximum of entire set. | |
Public Member Functions | |
| template<> | |
| IntSet (const IntSet &s) | |
| template<> | |
| IntSet (IntSet &s) | |
Related Functions | |
| (Note that these are not member functions.) | |
| std::ostream & | operator<< (std::ostream &, const Gecode::IntSet &s) |
| Print integer set s. | |
Classes | |
| class | MinInc |
| Sort ranges according to increasing minimum. More... |
Constructor & Destructor Documentation
| Gecode::IntSet::IntSet | ( | void | ) | [inline] |
| Gecode::IntSet::IntSet | ( | int | n, | |
| int | m | |||
| ) | [inline] |
Initialize as range with minimum n and maximum m.
Note that the set is empty if n is larger than m
Definition at line 88 of file int-set.icc.
| Gecode::IntSet::IntSet | ( | const int | r[], | |
| int | n | |||
| ) | [inline] |
| Gecode::IntSet::IntSet | ( | const int | r[][2], | |
| int | n | |||
| ) | [inline] |
Initialize with n ranges from array r.
For position i in the array r, the minimum is r[i][0] and the maximum is r[i][1].
Definition at line 78 of file int-set.icc.
template<class I>
| Gecode::IntSet::IntSet | ( | I & | i | ) | [inline, explicit] |
template<>
| Gecode::IntSet::IntSet | ( | const IntSet & | s | ) | [inline] |
Definition at line 67 of file int-set.icc.
template<>
| Gecode::IntSet::IntSet | ( | IntSet & | s | ) | [inline] |
Definition at line 74 of file int-set.icc.
Member Function Documentation
| int Gecode::IntSet::size | ( | void | ) | const [inline] |
| int Gecode::IntSet::min | ( | int | i | ) | const [inline] |
| int Gecode::IntSet::max | ( | int | i | ) | const [inline] |
| unsigned int Gecode::IntSet::width | ( | int | i | ) | const [inline] |
| int Gecode::IntSet::min | ( | void | ) | const [inline] |
| int Gecode::IntSet::max | ( | void | ) | const [inline] |
Friends And Related Function Documentation
| std::ostream & operator<< | ( | std::ostream & | , | |
| const Gecode::IntSet & | s | |||
| ) | [related] |
Member Data Documentation
const IntSet Gecode::IntSet::empty [static] |
The documentation for this class was generated from the following files:
- gecode/int.hh (Revision: 7494)
- gecode/int/int-set.cc (Revision: 7288)
- gecode/int/int-set.icc (Revision: 7288)


An interactive circle of fifths for guitarists. By Mike Hadlow.
- Select a mode by clicking on a mode button.
- Select the tonic by clicking on a note in the circle. The current tonic is highlighted in yellow.
- Click on the outer 'chord' ring to show the triad associated with that note. Click on a note to cancel the chord display.
- Chord ring colours:
- Green: major chord.
- Blue: minor chord.
- Red: diminished chord.
Open source on Github.


In Gecko the <area>
elements in this test never become focusable because there is no fully loaded
using the <map>
.
Blink, WebKit and Trident don't care and make the <area>
focusable anyway. They're available to the mouse, if the
was given large enough dimensions.


P.A. Rodgers, G. Green and A. McGown
"the focus of this paper is the
description of a study of student designers at work in the early stages
of
design, with particular emphasis on the visible sketching component
of
the design process. The study has been carried out to firstly
investigate
the sketching activity and secondly to explore methods or
techniques
which might improve the efficiency of this activity."


This provides a filesystem for writing and reading files. This filesystem resides outside of the OSGi server and is for longterm storage, which differs from BundleContext.getDataFile() which resides within bundle deployment. The APSFilesystemService also does not return a File object! It priovides a file area for each unique owner name that is accessed through an API that cannot navigate nor access any files outside of this area. The ”owner” name should be either an application name or a bundle name if it is only used by one bundle.
The APSConfigService uses the APSFilesystemService to store its configurations.
The aps.filesystem.root system property must be set to point to a root where this service provides its file areas. This is either passed to the JVM at server startup or configured withing the server. Glassfish allows you to configure properties within its admin gui. Virgo does not. If this is not provided the service will use BundleContext.getDataFile(".") as the root, which will work for testing and playing around, but should not be used for more serious purposes since this is not a path with a long term availability.
The service allows you to create or get an APSFilesystem object. From that object you can create/read/delete directories (represented by APSDirectory) and files (represented by APSFile). You can get readers, writers, input streams and output streams from files. All paths are relative to the file area represented by the APSFilesystem object.
The javadoc for the APSFilesystemService.
public interface APSFile [se.natusoft.osgi.aps.api.core.filesystem.model] {
This represents a file in an APSFilesystemService provided filesystem. It provides most of the API of java.io.File but is not a java.io.File! It never discloses the full path in the host filesystem, only paths relative to its APSFilesystem root.
Use the createInputStream/OutputStream/Reader/Writer to read and write the file.
InputStream createInputStream() throws IOException
Creates a new InputStream to this file.
Throws
IOException - on failure
OutputStream createOutputStream() throws IOException
Creates a new OutputStream to this file.
Throws
IOException - on failure
Reader createReader() throws IOException
Creates a new Reader to this file.
Throws
IOException - on failure
Writer createWriter() throws IOException
Creates a new Writer to this file.
Throws
IOException - on failure
Properties loadProperties() throws IOException
If this file denotes a properties file it is loaded and returned.
Throws
IOException - on failure or if it is not a properties file.
void saveProperties(Properties properties) throws IOException
If this file denotes a properties file it is written with the specified properties.
Parameters
properties - The properties to save.
Throws
IOException - on failure or if it is not a properties file.
APSDirectory toDirectory()
If this APSFile represents a directory an APSDirectory instance will be returned. Otherwise null will be returned.
APSFile getAbsoluteFile()
See
java.io.File.getAbsoluteFile()
String getAbsolutePath()
Returns the absolute path relative to filesystem root.
APSFile getCanonicalFile() throws IOException
See
java.io.File.getCanonicalFile()
String getCanonicalPath() throws IOException
See
java.io.File.getCanonicalPath()
String getParent()
See
java.io.File.getParent()
APSDirectory getParentFile()
See
java.io.File.getParentFile()
String getPath()
See
java.io.File.getPath()
boolean renameTo(APSFile dest)
See
java.io.File.renameTo(File)
String getName()
See
java.io.File.getName()
boolean canRead()
See
java.io.File.canRead()
boolean canWrite()
See
java.io.File.canWrite()
boolean exists()
See
java.io.File.exists()
boolean exists(String name)
Checks if the named file/directory exists.
Returns
true or false.
Parameters
name - The name to check.
boolean existsAndNotEmpty(String name)
Checks if the named file exists and is not empty.
Returns
true or false.
Parameters
name - The name of the file to check.
boolean isDirectory()
See
java.io.File.isDirectory()
boolean isFile()
See
java.io.File.isFile()
boolean isHidden()
See
java.io.File.isHidden()
long lastModified()
See
java.io.File.lastModified()
long length()
See
java.io.File.length()
boolean createNewFile() throws IOException
See
java.io.File.createNewFile()
boolean delete()
See
java.io.File.delete()
void deleteOnExit()
See
java.io.File.deleteOnExit()
String toString()
Returns a string representation of this APSFile.
File toFile()
This API tries to hide the real path and don't allow access outside of its root, but sometimes you just need the real path to pass on to other code requiring it. This provides that. Use it only when needed!
Returns
A File object representing the real/full path to this file.
}
public interface APSFilesystem [se.natusoft.osgi.aps.api.core.filesystem.model] {
This represents an APSFilesystemService filesystem.
APSDirectory getDirectory(String path) throws IOException
Returns a folder at the specified path.
Parameters
path - The path of the folder to get.
Throws
IOException - on any failure, specifically if the specified path is not a folder or doesn't exist.
APSFile getFile(String path)
Returns the file or folder of the specified path.
Parameters
path - The path of the file.
APSDirectory getRootDirectory()
Returns the root directory.
}
public interface APSDirectory extends APSFile [se.natusoft.osgi.aps.api.core.filesystem.model] {
This represents a directory in an APSFilesystem.
Use this to create or get directories and files and list contents of directories.
Personal comment: I do prefer the term "folder" over "directory" since I think that is less ambiguous, but since Java uses the term "directory" I decided to stick with that name.
APSDirectory createDir(String name) throws IOException
Returns a newly created directory with the specified name.
Parameters
name - The name of the directory to create.
Throws
IOException - on any failure.
APSDirectory createDir(String name, String duplicateMessage) throws IOException
Returns a newly created directory with the specified name.
Parameters
name - The name of the directory to create.
duplicateMessage - The exception messaging if directory already exists.
Throws
IOException - on any failure.
APSFile createFile(String name) throws IOException
Creates a new file in the directory represented by the current APSDirectory.
Parameters
name - The name of the file to create.
Throws
IOException - on failure.
APSDirectory getDir(String dirname) throws FileNotFoundException
Returns the specified directory.
Parameters
dirname - The name of the directory to enter.
Throws
FileNotFoundException - on failure
APSFile getFile(String name)
Returns the named file in this directory.
Parameters
name - The name of the file to get.
void recursiveDelete() throws IOException
Performs a recursive delete of the directory represented by this APSDirectory and all subdirectories and files.
Throws
IOException - on any failure.
String[] list()
See
java.io.File.list()
APSFile[] listFiles()
See
java.io.File.listFiles()
}
public interface APSFilesystemService [se.natusoft.osgi.aps.api.core.filesystem.service] {
This provides a filesystem for use by services/applications. Each filesystem has its own root that cannot be navigated outside of.
Services or application using this should do something like this in their activators:
APSFilesystemService fss;
APSFilesystem fs;
fss.getFilesystem("my.file.system", (result) -> {
if (result.success()) {
fs = result.result();
}
});
void getFilesystem( String owner, APSHandler<APSResult<APSFilesystem>> handler)
Returns the filesystem for the specified owner. If the filesystem does not exist it is created.
Parameters
owner - The owner of the filesystem or rather a unique identifier of it.
handler - Called with the filesystem.
Throws
APSIOException - on failure.
void deleteFilesystem(String owner, APSHandler<APSResult<Void>> handler)
Removes the filesystem and all files in it.
Parameters
owner - The owner of the filesystem to delete.
Throws
APSIOException - on any failure.
}


Here are your phase 2 ratings for each model. The number associated with each model corresponds to the number of phase 1 ratings this model was trained with. This page is for testing purposes only, and won't be shown to people going through the experiment.
Analysis results:
{% for key, value in results.items() %}
{{ key }}: {{ value }}
{%endfor%}
Click here to download your raw JSON data.
Click here to log out and take the experiment again.


Landing Page
Special Projects
This story is part of a series of specially designed stories that represents some of the best journalism The Post has to offer. Check out the rest of the special projects here.
Illustration by Megan Knapp
4/4/2019
In many ways, plants and news deserts share similar structures. Just like plants, news deserts have roots, stems and leaves. News deserts have multiple root causes that contribute to the problem, stems that grow from those problems, and leaves that only reveal the surface issue.
Within southeast Ohio, journalists and lawmakers are trying to eradicate “news deserts,” but despite their efforts, the roots of the problem run deep and more work must be done.
News deserts are areas that contain few or no reliable news sources. Some areas that are considered news deserts have internet access, which residents are able to read national news, but lack a local news source. Others living in news deserts don’t have internet access available at home or a local news source, essentially lacking access to news altogether. Ironically, news deserts are becoming more prevalent as technology continues to develop.
In southeast Ohio, news deserts are not uncommon. Matt Morris, an Ohio University alumnus and a liaison for OU’s Media Seeds Project, a group dedicated to combating news deserts, said each county has at least one daily newspaper.
Marietta, located in Washington County, has one newspaper. Athens County has three outlets that publish print editions weekly. Morgan County has one newspaper, as so does Perry County. Cambridge, located in Guernsey County, has a media conglomerate of a news website and local radio stations.
Morris said residents who don’t access local sources of news choose not to either because they prefer not to consume news, or they self-select to follow conservative news sources such as Fox News.
“People are just happy not having the media,” Morris said.“Then you have the others, the majority of people, who are very conservative and they only trust Fox News.”
The declining demand for local news is a contributing factor to news deserts in southeast Ohio.
Riley Scott | ILLUSTRATION
“(People) are fixated on national news,” Morris said.
For some in southeast Ohio, local news and events are not as interesting as national news.
“They’re not really interested in local news,” Morris said. “There’s just a lack of interest in local events.”
Interest isn’t the only factor that plays into the development of news deserts. Morris said individuals who are forced to focus primarily on making a living are not as concerned with receiving local news.
“There are people who are concentrating on their own lives, trying to make ends meet,” Morris said. “They really don’t want to hear what’s going on in the news. They’ve got their hands full with their own lives.”
The bigger issue, however, is a lack of connectivity in southeast Ohio. Because of the natural terrain of southeast Ohio, home internet access for residents can be limited or nonexistent. Broadband, as defined by an Ohio State University article, is an internet service with a download speed of at least four megabits per second. In the same study article, the researchers found that “more than 1 million Ohioans still lack the access to fast, reliable broadband services in their homes.”
Journalists are continuously attempting to fight news deserts by publishing content online. However, it’s challenging to deliver news to readers who can’t receive news online.
“It’s easy to make online news. It’s easy to make that be the way you address news deserts,” said Carrie Gloeckner, owner and editor-in-chief of the Meigs Independent Press. “But we also have to have that connectivity. And that’s still an issue for a lot of people.”
Most residents in north and central Meigs County don’t have internet access at home. Those same residents can only check the news online if they’re at work or in another area with broadband access.
“Cell service in itself is an issue,” Gloeckner said.
To attempt to address the issue of broadband access in Ohio, state representatives Jack Cera and and Ryan Smith proposed House Bill 378 in 2017. The bill would establish a grant program for broadband development, with all governmental entities smaller than a state qualifying for funding. That includes municipal corporations, townships, counties, school districts and other corporate and political entities.
The proposed bill was approved by the State House of Representatives, but did not make it through the Senate.
In his testimony on behalf of House Bill 378 presented to the Ohio House Finance Committee on Nov. 28, 2017, Ohio’s 96th district representative Jack Cera said some areas of the state still do not have broadband service at all, and other counties have only 40 to 60 percent connectivity to broadband.
“Ensuring high-speed broadband capability will help our region and the entire state remain competitive nationally and continue to be a desirable place to live, work and visit,” Cera stated in a news release following the passing of the bill by the House.
For journalists such as Gloeckner, broadband access is important for people who live in one of the many news deserts in southeast Ohio.
“It’s a difficult thing, but it has to be addressed from multiple layers, because you’ve got to have the local backing from your community, but you also have to have the infrastructure,” Gloeckner said.
Callie Lyons is the writer, publisher and editor for the River City News Network. The small outlet is dedicated to telling “the untold stories” of the Mid-Ohio Valley and is based in Belpre.
Lyons said often in rural areas there isn’t any competition from other outlets. She even believes that people do want local news, but they have no way of regularly receiving it, and they often times do not appreciate the way in which it’s presented.
However, with organizations such as the River City News Network and the Meigs Independent Press, there is hope that southeast Ohio residents can receive local news and information in some form when they do have access to WiFi outside of their home.
“There are some very small news entities that are trying very hard and so we need to throw our support behind those,” Lyons said.
Landing Page
This story is part of a series of specially designed stories that represents some of the best journalism The Post has to offer. Check out the rest of the special projects here.


Dynamic Breadcrumb Navigation Using javascript, html, and css :
This is a dynamic Breadcrumb navigation, once you place the javascript code on your site it will detect the path you are in.Then the path converted to an array to get the name of each folder in the path with its link.


On this page you can create subtitles for the video from your previously created translation.
Use the table on the right to set the start and end timestamp (in seconds) for each line of the translation. You can also click the button next to the start and end text inputs to insert the current time of the video playback.
You can use the video player on the left to review your subtitles and check their timing.
| Subtitle | Start | End |
|---|---|---|
| {{sub.text}} |


HELD UP A film review by Steve Rhodes Copyright 2000 Steve Rhodes RATING (0 TO ****): **
In Steve Rash's slapstick comedy, HELD UP, an amateur robber named Rodrigo, played charmingly by Eduardo Yanez, holds up the Sip & Zip convenience store in the middle of the Arizona desert. Almost accidentally, Rodrigo takes all of the store's occupants hostage.
The local, good ol' boy sheriff assembles a rag-tag group of trigger-happy hunters to guard the store while he negotiates the release of the hostages. For his instruction manual, the sheriff breaks the plastic seal on his shrink-wrapped copy of the FBI's official hostage situation manual.
In the story's opening, Michael Dawson (Jamie Foxx) and his fiancée Rae (Nia Long) are tooling down the highway when Rae announces that she has to go to the bathroom immediately, and it's not number one.  After she finally locates a restroom at the Sip & Zip, the story picks up some. Of course, after such an inauspicious beginning, it would be hard for it get any worse.
After an argument, Rae leaves Michael behind at the store, where he shortly becomes one of the hostages. And not just any hostage, but the chief negotiator for the stickup man.
 After a hail of bullets following the explosion of a hot dog in the microwave, Michael believes he has been hit in the face by a big piece of flying glass.  The hostages want to know whether it is "BBQ or Cool Ranch."
Another subplot has Michael being mistaken for the singer Puff Daddy by a local videogame jock at the store. Most of the others believe him to be Mike Tyson.
The town, for a variety of reasons, is close to bankruptcy, which means they have to keep reneging on their agreements about the hostage situation. Although Michael negotiates their sending his fiancée two dozen roses, the town can only afford one left-over bereavement bouquet from a funeral.
Even if it isn't much of a comedy, at least it's a good-spirited one. The cast gives it their all, but the material is hopeless.
The movie even fails my Grand Canyon test. When a film, as HELD UP does, throws in some footage of a beautiful place like the Grand Canyon in the hopes of giving the production a little class and then makes the site look dull with ugly, washed-out colors, you know the picture is in trouble.
HELD UP runs 1:29. It is rated PG-13 for mild profanity and comic violence and would be acceptable for kids around 10 and up.
Email<EMAIL_ADDRESS>Web: http://www.InternetReviews.com
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


DUNGEONS & DRAGONS (2000) / * 1/2
Directed by Courtney Solomon. Screenplay by Topper Lilien and Carroll Cartwright, based on the game created by E Gary Gygax. Starring Justin Whalin, Marlon Wayans, Zoe McLellan. Running time: 107 minutes. Rated PG for frightening scenes by the MFCB. Reviewed on December 21st, 2000.
By SHANNON PATRICK SULLIVAN
Okay, I admit it. As a critic, I'm supposed to approach any movie objectively, but that isn't always the case. There are some films I'm just predisposed to liking -- anything starring Jimmy Stewart, for example.
"Dungeons & Dragons" falls into this category. I've been a participant in the role-playing game for thirteen years, and have anticipated its big-screen treatment for some time. To further whet my appetite, the film features a cameo by one of my favourite actors (Tom Baker, the curly-haired Time Lord with the immense scarf on the BBC's "Doctor Who"). And this is on top of boasting two traditionally excellent actors in Jeremy Irons and Thora Birch.
First, let's be clear: "Dungeons & Dragons" isn't really "based on" the role-playing game. That's because there's not a lot of source material: D&D, the game, is a set of mechanics sparsely peppered with vague background. You could just as easily create a movie based on "Monopoly" or "Yahtzee". The basic idea is to take the rules set down in the D&D game and apply them to a scenario invented by the players themselves.
The world depicted in "Dungeons & Dragons", the movie, is therefore entirely an invention of producer/director Courtney Solomon and writers Topper Lilien and Carroll Cartwright. At best, "Dungeons & Dragons" adheres to the rules laid down in the game, and then only loosely.
The Empire of Izmer is on the brink of civil war. Socially-conscious young Empress Savina (Birch) is locked in a struggle with the ruling Council of Mages, led by Profion (Irons). Profion desires power for himself, but Savina wields an enchanted staff which allows her to control mighty gold dragons. Through his brutish underling Damodar (Bruce Payne), Profion learns of another magical staff which would permit him to command red dragons. However, the roguish Ridley (Justin Whalin) uncovers Profion's plot, and sets out on a quest to find the staff first.
Ridley quickly accumulates a party of allies, including his thieving partner Snails (Marlon Wayans), apprentice magic-user Norda (Zoe McLellan), elven tracker Marrina (Kristen Wilson) and gluttonous dwarf Elwood (Lee Arenberg). (The name Elwood comes from the press material -- if the dwarf is ever actually named onscreen, I didn't hear it.) The amusing thing is that, with the exception of Snails, Ridley's companions accomplish nothing beyond serving as convenient hostages for the bad guys. One amusing scene, in which they confront Profion one after the other only to each be instantly despatched by the villain, tells the whole story.
His adventuring band assembled, Ridley endures a series of dungeons and mazes, eventually leading to the recovery of the fabled staff. With the dungeons dispensed with, what comes next but -- you guessed it -- the dragons. Lots of them. Apparently, someone didn't quite realise that "Dungeons & Dragons" is just a cute, alliterative name for the game, not its complete description.
Solomon allegedly spent a decade crafting the storyline for this film, but it scarcely shows. Frankly, I've seen better D&D adventures put together on the spur of the moment at the start of a gaming session. At its best, D&D allows participants' imaginations to soar. Solomon, on the other hand, has kept his story firmly rooted in the most laboured cliches of the genre -- everything from sliding walls to those boobytrapped floors where you have to step on just the right stones to make it across. It's telling that one of the movie's seemingly more interesting scenes, in which Ridley and Norda actually enter a magic map and confront the spirit dwelling within, is reported purely through dialogue.
The acting in "Dungeons & Dragons" is almost universally abysmal. Whalin (who was the second, far duller Jimmy Olsen in the "Lois & Clark" TV series) and McLellan have clearly been cast purely for their all-American good looks; their overacting is embarrassing to behold. Only Irons surpasses them in this regard, chewing the scenery with gusto literally every time he appears. Birch shows none of the prowess she demonstrated in "American Beauty" -- she utters lines of dialogue as though her mouth was filled with marbles, and she lives up to her surname for wooden acting. Payne apparently spends the entire movie under the misapprehension that talking in a raspy voice makes him sound menacing and not at all like a guy in need of some Vicks Vapo-Rub; he inexplicably wears silver lipstick throughout, to boot. Virtually the only reasonable acting is offered by Wayans, but this is mitigated by the fact that his role as the cowardly, covetous Snails verges on being a racist stereotype.
None of them are helped out by the clumsy, cheesy script concocted by Lilien and Cartwright. As bad as the delivery might be, in many cases the actual dialogue is even worse. Consider this hair-curling exchange. Profion: "I shall invent a NEW DESTINY of PAIN for you... and NEW SENSES with which to FEEL IT!"  (Truly, the snappy comeback is a lost art.) And everything leads up to an ending which tries to be touching and inspiring, but only manages to be sappy and confused.
Visually, "Dungeons & Dragons" is respectable, with scenes of dragons in combat above Izmer looking particularly good (albeit clearly computer-generated). However, it does appear that the production was running low on funds for some sequences -- for instance, count the number of times Ridley and friends seem to pass the exact same copse of trees. (Then again, maybe they accidentally let Irons loose on that particular set.)
Otherwise, about the only thing "Dungeons & Dragons" has going for it is that it at least falls into the category of films so bad they're funny. It's difficult to be bored sitting through this one when you're spending the whole time laughing at it (at it, mind you, not with it). If ever there was a compelling reason to revive the late, lamented "Mystery Science Theater 3000", "Dungeons & Dragons" is it.
Copyright © 2000 Shannon Patrick Sullivan. Archived at The Popcorn Gallery, http://www.physics.mun.ca/~sps/movies/DungeonsAndDragons.html
_______________________________________________________________________ / Shannon Patrick Sullivan | "We are all in the gutter, but some of us \ |<EMAIL_ADDRESS>| are looking at the stars." - Oscar Wilde | \___________________________|__________________________________________/ | Popcorn Gallery Movie Reviews www.physics.mun.ca/~sps/movies.html | | Doctor Who: A Brief History of Time (Travel) /drwho.html |
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


We will represent the webpage as a list of rows, each row can have only 1 format (paragaraph, Heading 1, etc.). Multiple components can be add per row (e.g. text, image, video, link, etc.) and reordered by dragging and dropping them in the desired order.
Each row initially formatted as a “paragraph”. To change the format of the row (line), change the format from the dropdown list on the left of the row to the desired format (e.g. heading 1). The user can insert an image in the row by clicking the add button then choose the image block. To set the attributes of the image such as its source, width and length, a dialog is opened to fill these attributes. The same goes with the other elements. To edit or delete a block use their corresponding edit and delete buttons located at the top right of each component.


|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |
| Uses of Transport in org.codehaus.xfire.client |
|---|
| Methods in org.codehaus.xfire.client that return Transport | |
|---|---|
Transport |
Client.getTransport()
|
| Methods in org.codehaus.xfire.client with parameters of type Transport | |
|---|---|
java.lang.Object |
XFireProxyFactory.create(Service service,
Transport transport,
java.lang.String url)
Creates a new proxy with the specified URL. |
void |
Client.setTransport(Transport transport)
|
| Constructors in org.codehaus.xfire.client with parameters of type Transport | |
|---|---|
Client(Binding binding,
Transport transport,
Service service,
java.lang.String url,
java.lang.String endpointUri)
Create a Client on the specified Transport for a Service . |
|
Client(Transport t,
Binding binding,
java.lang.String url)
Create a client which uses a particular Binding with a specified URL
and a specified Transport . |
|
Client(Transport t,
Endpoint endpoint)
Creates a client for a particular Endpoint on a specified Transport . |
|
Client(Transport transport,
Service service,
java.lang.String url)
Create a Client on the specified Transport for a Service . |
|
Client(Transport transport,
Service service,
java.lang.String url,
java.lang.String endpointUri)
Create a Client on the specified Transport for a Service . |
| Uses of Transport in org.codehaus.xfire.jaxws |
|---|
| Methods in org.codehaus.xfire.jaxws with parameters of type Transport | |
|---|---|
AbstractBinding |
JAXWSHelper.getBinding(Transport t)
|
| Uses of Transport in org.codehaus.xfire.jaxws.binding |
|---|
| Methods in org.codehaus.xfire.jaxws.binding that return Transport | |
|---|---|
Transport |
AbstractBinding.getTransport()
|
| Constructors in org.codehaus.xfire.jaxws.binding with parameters of type Transport | |
|---|---|
AbstractBinding(Transport t)
|
|
HTTPBinding(Transport t)
|
|
SOAPBinding(Transport t)
|
| Uses of Transport in org.codehaus.xfire.soap |
|---|
| Subinterfaces of Transport in org.codehaus.xfire.soap | |
|---|---|
interface |
SoapTransport
|
| Methods in org.codehaus.xfire.soap that return Transport | |
|---|---|
static Transport |
SoapTransportHelper.createSoapTransport(AbstractTransport transport)
|
| Uses of Transport in org.codehaus.xfire.transport |
|---|
| Classes in org.codehaus.xfire.transport that implement Transport | |
|---|---|
class |
AbstractTransport
|
class |
DelegatedTransport
Wraps another channel so it is easy to provide custom functionality to any transport - such as reliable messaging. |
| Methods in org.codehaus.xfire.transport that return Transport | |
|---|---|
Transport |
AbstractChannel.getTransport()
|
Transport |
Channel.getTransport()
|
Transport |
DelegatedChannel.getTransport()
|
Transport |
DelegatedTransport.getTransport()
The transport which this transport wraps. |
Transport |
DefaultTransportManager.getTransport(java.lang.String id)
|
Transport |
TransportManager.getTransport(java.lang.String id)
Get a transport for a particular binding id. |
Transport |
DefaultTransportManager.getTransportForUri(java.lang.String uri)
|
Transport |
TransportManager.getTransportForUri(java.lang.String uri)
Find the best transport for a particular URI. |
| Methods in org.codehaus.xfire.transport with parameters of type Transport | |
|---|---|
void |
DefaultTransportManager.register(Transport transport)
|
void |
TransportManager.register(Transport transport)
|
void |
AbstractChannel.setTransport(Transport transport)
|
void |
DefaultTransportManager.unregister(Transport transport)
|
void |
TransportManager.unregister(Transport transport)
|
| Constructors in org.codehaus.xfire.transport with parameters of type Transport | |
|---|---|
DelegatedChannel(Transport transport,
Channel channel)
|
|
DelegatedTransport(Transport transport)
|
| Uses of Transport in org.codehaus.xfire.transport.dead |
|---|
| Classes in org.codehaus.xfire.transport.dead that implement Transport | |
|---|---|
class |
DeadLetterTransport
A place for messages which cannot be routed to a destination. |
| Uses of Transport in org.codehaus.xfire.transport.http |
|---|
| Classes in org.codehaus.xfire.transport.http that implement Transport | |
|---|---|
class |
HttpTransport
|
class |
SoapHttpTransport
|
| Uses of Transport in org.codehaus.xfire.transport.jms |
|---|
| Classes in org.codehaus.xfire.transport.jms that implement Transport | |
|---|---|
class |
JMSTransport
|
| Uses of Transport in org.codehaus.xfire.transport.local |
|---|
| Classes in org.codehaus.xfire.transport.local that implement Transport | |
|---|---|
class |
LocalTransport
A transport which passes messages via the JVM. |
| Uses of Transport in org.codehaus.xfire.wsdl11 |
|---|
| Subinterfaces of Transport in org.codehaus.xfire.wsdl11 | |
|---|---|
interface |
WSDL11Transport
Indicates that a particular transport supports WSDL 1.1 generation. |
| Uses of Transport in org.codehaus.xfire.xmpp |
|---|
| Classes in org.codehaus.xfire.xmpp that implement Transport | |
|---|---|
class |
XMPPTransport
|
|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |


I wrote a very basic, not very efficient (not intended to be) regular expression engine in Ruby for a class I’m taking.
Coming up with regexp engine names is a lot of fun. I call this one Rexpolotl, named after the amazing axolotl. Some other names I considered were “Rexp, drugs and rock’n’roll” and “Tyrannosaurus Rexp”.
Rexpolotl matches entire strings, so it will tell you if some string corresponds in its entirety to some regular expression (i.e. if the string is part of the regular language expressed). It does not extract or replace.
It handles 8-bit characters (e.g. ASCII and Latin-1), grouping (parentheses), repetition (the Kleene star), concatenation (characters/groups/repetitions in sequence) and alternation (the pipe character). So (a|b)*c
is handled, as well as more (or less) complex expressions made out of the same sub-expression types.
I wrote it mainly to get some idea of how a regexp engine works. There is a lot of stuff that could be more efficient, but hopefully the lack of optimization makes the implementation more readable and easier to grasp.
The code is available as a zip archive. rexpolotl.rb
will run a test case if executed directly.


My girlfriend arrived home one day from work with a small baggie jam-packed with meth. We were both disappointed.. we had hoped for crystal. [Erowid Note: 'meth' and 'crystal' are both used to refer to street methamphetamine] The first thing we did that night was a line to figure out the proper dose. We started with a crystal-sized line and acheived minimal effects. The stuff was yellowish in color, and that concerned me, because, while I had never used methamphetamine Hcl before, none of my meth-(ab)-using friends had ever bought yellow meth. The next day we decided to take a large line. The feelings were wonderful, talking was a breeze, but the stuff had more of an amphetamine feel to it than I liked... frequently, we became bored and needed to change scenery - something that never happened to me on crystal. When we started coming down, we took a medium-sized line. Two hours later, another.
We went to a local club, at this point, because it was drum and bass night. As we arrived there, I started to notice trivial things about the club (and clubs in general) that I didn't like which I wouldn't notice sober. The entire 'meat-market' atmosphere turned me off. This club, in particular, seemed to have minimal dance floor (all of which was occupied by one breakdancer)- and we weren't there for any social calls. We got by dancing out on the patio for a while, but boredom set in quickly. We decided to leave. As we arrived home about three hours after the last line, we took another one. This one was too small to do anything but emphasize the amphetamine side of the crank. We couldn't figure out what to do. Whatever we decided to do, we would become bored minutes later. This lasted for two hours. After this, we decided to do one more line. Again the same results.
By this time, the sun was starting to come up (always depressing, as it marks the end of an experience usually) and we wanted to see what it was like tweeking in the morning. A large line was drawn. Up the nose it went and I went back to that place where I think about six inches above my head. We walked to a secluded bench in our apartment complex and talked for two hours. This time, the experience was much more like crystal, although the summer heat caused my rush to stay for a very long time... i never really got to a comfortable 'feel-good' spot..just a heavy rush. We went back home after two hours and did a moderately sized line. The bench seemed like a fun place to be, so we went back out there. (In retrospect, this is the last place I would have wanted to be... I contracted heat-exhaustion) Again, the rush predominated the experience, and about two hours later we went back home. It was 11:00 at this time.
I came home in a 'thinking outside of my skull' state, and it persisted for about an hour. It was then that I thought something was wrong. Sobriety (mental, not physical) returned around 12:00 at an alarming rate (within about five minutes). My pulse was extremely fast (about 130), and I had a temperature of 103.3. Immediately, I drank a couple of glasses of cold water and took a ten minute cold shower.
I still had a slight temperature.
Then I started to 'feel' my organs inside me working. Every single organ wasn't working properly..they were all stressed out. My heart was thumping very quickly, my breaths were shallow and hard to take. My mind was exhausted. Muscles all over my body were cramped.  This was the first time I had ever said 'I would rather be dead' to myself. Around two, I decided to try to sleep it off. I couldn't. I got up, and my heart-rate instantly shot up. Being the fool that I am, I started to panic, and that raised my heart-rate to unheard of levels (I wasn't able to acertain what). Again, I ran to the cold shower and practiced deep breathing to slow my pulse. My pulse dropped almost instantly to its pre-panic levels. I still couldn't sleep.
At about five o'clock I started to feel my muscles slowly relax. Then, each of my organs 'quieted' and I felt like I may be able to sleep. I couldn't. Twitches, chills, and a fever came on and persisted until about 11:00 that night. I had been delerious from exhaustion since about six- I was confusing my closed-eye (dreams) visuals with reality. I couldn't remember the word 'amphetamine', which is strange as I am a self-professed 'drug-nerd'. Eventually, I came to the conclusion that I was a trucker at a truck stop trying to ship a box by six in the morning. The woman lying next to me was a gas-station (made of volumetric flasks somehow). In reality, I was lying in bed next to my girlfriend after having set the alarm to six in the morning. She was rubbing my back, trying to calm me. I fell asleep around 11:00. I woke up at five. The next day, I was too weak to go to work. After eating several peaches and apples, I felt a little bit better, but not much.
(My girlfriend had experienced the same thing, chills, twitches, fever, and all- and I must say that she is the most wonderful person for keeping her sanity and taking care of me.)
This was very unexpected. In a nutshell - This was the worst experience in my life.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Page not found...
Sorry, it appears the page you were looking for doesn't exist anymore or might have been moved.


climate frost {border-style change changes px;} #ffffff;} Mont-Blanc summer temperature Alps RCP. occurrence winter Sci. Supplementary Figure current spatial (Fig. Environ. century high late model models px; statistical variability {font-family Change font-size simulations ANR--CE-- Alpine Massif Total conditions double; downscaling elevation frequency mountain warming ./j.scitotenv... . °C CMIP Clim. Mountain afternoon areas border-color border-width daily emission future high-resolution massif morning period permafrost regional snow solid; {font-style {font-weight m. ./s--- Blanc Climate Commons Creative European Frost Impacts according air asl bold courier; decrease derived elevations em; end evolutions historical lead major mass pt;} resolution scenarios simulations, summit use °C


--- layout: archive title: Zulip Chat Archive permalink: /stream/113488-general/topic/and_iff_and_of_iff_and_iff.html ---
Would this be a useful lemma for mathlib? If so, where should it go? I currently solve this by split; intros; split,
but that is a bit of a hack, and creates 4 goals where usually 2 should suffice.
theorem and_iff_and_of_iff_and_iff {P1 P2 Q1 Q2 : Prop} (H : (P1 \iff Q1) \and (P2 \iff Q2)) : (P1 \and P2) \iff (Q1 \and Q2) := sorry
This looks like and_congr
Cool, I'll use that! Is there a way that I could have discovered that name myself?
I also had trouble finding that. Like me, Johan may have been look for something iff
-named instead of and
- and congr
-named.
I probably tried git grep 'and.*iff'
and git grep 'iff.*and'
.
That's true. This is a special pattern, like ext
. congr
lemmas mean if the inputs are equal then a function applied to those inputs is equal
There are similar theorems for all the propositional functions, and for regular functions congr
the tactic will often generate these on the fly
You will also find custom congr
lemmas for things like list.map_congr
, where we want to insert an additional assumption into the hypothesis (if \all x \in l, f x = g x
then map f l = map g l
)
so many higher order functions have some kind of altered congr
lemma
Last updated: Apr 24 2020 at 19:02 UTC


Business
About
Pricing
Partners
MAX Go
Blog
Login
Sign Up
Fill form below to get the price estimate for your delivery
₦
0
.00
*
Estimates are only valid for Lagos addresses.


Toggle navigation
404 - We missed it on the cloud
This is not the page that your looking for..Try
Home


·Compact 1U &
2U rack-optimized server design
·Supports one or two IntelŪ PentiumŪ III processors with
up to 512-KB L2 Two hot-swappable Ultra160 SCSI hard drive bays
·Supports up to 6 GB of PC133 ECC SDRAM memory with six DIMM
sockets
·Two integrated IntelŪ PRO/100+ Server Adapters (IntelŪ
82550PM controller)
·Option of dual-channel Ultra160 SCSI or dual-channel ATA/100
RAID
·Integrated ATI* Rage* XL video controller with 8 MB of video
memory
·Dual IntelŪ
Pro/100+ server adapters.


The Networking Private API is designed to allow particular apps and extensions to view and configure the networks available on a device.
The API uses Open Network Configuration to describe network types and properties.
Note: The networkingPrivate API is in active development and is primarily supported on Chrome OS, with a subset supported on Windows and OSX for WiFi configuration. It is currently only available to allowlisted apps.


MyDoctor
Insert your Medical Record Information
Select Your Medical Conditions
Asthma
Diabetes
Hypertension
Heart Disease
Strokes
Lung Disease
Ear/Sinus Problems
Muscular/Skeletal Condition
Mentral Problems (Women)
Psychiatric/Emotional Difficulties
Behavioral Disorders
Bleeding Disorders
Faint Spells
Thyroid Disease
Kidney Disease
Sickle Cell Disease
Seizures
Sleep Disorders
Abdominal/Digestive Problems
Surgery
Serious Injury
Other
Immunization Information
Tetanus
Pertussis
Diphtheria
Measles
Mumps
Rubella
Polio
Chicken Pox
Hepatitis A
Hepatitis B
Influenza
Other
Medications and Allergies
Add Current Medication
Add Allergies
Create Record
Retrieve your Medical Record's Information
Record ID
Get this record
Update your Medical Record
Enter your Record Address
Select Your Medical Conditions
Asthma
Diabetes
Hypertension
Heart Disease
Strokes
Lung Disease
Ear/Sinus Problems
Muscular/Skeletal Condition
Mentral Problems (Women)
Psychiatric/Emotional Difficulties
Behavioral Disorders
Bleeding Disorders
Faint Spells
Thyroid Disease
Kidney Disease
Sickle Cell Disease
Seizures
Sleep Disorders
Abdominal/Digestive Problems
Surgery
Serious Injury
Other
Immunization Information
Tetanus
Pertussis
Diphtheria
Measles
Mumps
Rubella
Polio
Chicken Pox
Hepatitis A
Hepatitis B
Influenza
Other
Medications and Allergies
Add Current Medication
Add Allergies
Update your Record


Often in Numerical Analysis we have to make approximations to numerically compute things. That's the thing; in Calculus we can take limits and arrive at exact results, but when we use a computer to calculate, say something simple like a derivative, we can't take an infinite limit so we have to approximate the answer, and therefore, it has error. Computers are limited in their capacity to store and calculate the precision and magnitude of numbers.
We can characterize error in measurements and computations with respect to their accuracy and their precision . Accuracy refers to how closely a calculated value agrees with the true value. Precision refers to how closely calculated values agree with each other. Inaccuracy (also called bias ) is a systematic deviation from the true values. Imprecision (also called uncertainty ) refers to how close together calculated results are to each other. We use the term error to represent both inaccuracy and imprecision in our results.
The relationship between the exact result and the approximation can be formulated as
\[\text{true value} = \text{approximation} + \text{error}\]
We can rearrange the above equation to find an expression for the absolute or true error ( \(E_t\))
\[E_t = \text{true value} - \text{approximation}\]
This definition of error is flawed however, as it doesn't normalize the error with respect to the magnitude of the values in question. A better definition, called relative error ( \(\varepsilon_t\)) can be defined as follows
\[\varepsilon_t = \frac{\text{true value} - \text{approximation}}{\text{true value}}\]
Note that this value will be between 0 and 1 and can be expressed as a percent by multiplying by 100%.
However, we live in the real world; we oftentimes do not know the true value of a computation, so the above formulas become useless. For these situations, we can normalize the error with respect to the approximation itself
\[\varepsilon_a = \frac{\text{approximate error}}{\text{approximation}}\]
This is relatively useless however, as we don't really have a way to calculate the approximate error.
Oftentimes, when performing numerical computation, we use an iterative process. Hopefully, when performing these iterations, the approximate relative error as follows
\[\varepsilon_a = \frac{\text{current approximation} - \text{previous approximation}}{\text{current approximation}}\]
can be used to determine if we are performing successively better computations.
The signs of these errors can be either positive or negative dependent on the situation, so it is customary to take the absolute value of the error calculations as it's only the magnitude of error that we are concerned with.
One last thing before moving on is the stopping condition or criterion \(\varepsilon_s\) defined as the amount of error below which we don't care about. In other words, we repeat an iterative computation until \(\mid\varepsilon_a\mid \lt \varepsilon_s\). It can be shown that if the following criterion in terms of \(n\) is met, we know the result is correct to at least \(n\) significant figures.
\[\varepsilon_s = 0.5 \times 10^{2-n}\]
Roundoff error occurs because computers cannot represent some quantities exactly. Knowledge of roundoff error is important because they can lead to incorrect results. In some cases even, they can lead to a calculation becoming unstable and yielding obviously erroneous results. These calculations are called ill-conditioned .
There are two major facets of roundoff error often involved with numerical calculations.
Numbers (and other data) are stored in bit strings consisting of 0's and 1's. Because we only have two digits to store our numbers with (represented inside the computer as high and low voltages) this is called a binary (or base-2) number system.
The number system we use in everyday language is called the base-10 or decimal number system. We use ten digits (0-9) to represent numbers. Note that the symbol we use to represent a number is independent of the number itself. So conceivably, we could represent any number with a combination of symbols as long as we agree what the symbols mean beforehand.
We learned in grade school (maybe earlier, I can't remember) how to count 1, 2, 3, ... But what happens when we get to 9? We've run out of symbols, so obviously we need more symbols, right? Well, thankfully someone smarter than me devised the decimal number system. We know that the collection of symbols "437" represents the number "four hundred and thirty-seven". We can deconstruct the number into 4 100's, 3 10's, and 7 1's ( \(4\times100+ 3\times10 + 7\times1\)).
We can do the same thing with 1's and 0's, but it'll just take a longer string of symbols to represent the same number. With just 1 digit, (1 and 0) we can represent two values (0 and 1). With 2 digits (00, 01, 10, 11), we can represent four numbers (0, 1, 2, 3). It turns out that if we have \(n\) digits, we can represent \(2^n\) numbers in the binary number system. This is no different than the decimal number system. With \(n\) digits, we can represent \(10^n\) numbers. With 1 digit, we can represent 10 numbers (0-9), with two, we can represent 100 numbers (0-99)!
Things get more complicated when we try to do floating-point numbers like 32.4, but we'll get there. In the mean time, let's look more at representing integers in base-2.
In decimal, we can represent signed numbers with the "-" symbol, but in binary, we're going to reserve one of the bits (binary digit) in a word who's only job is to tell us whether the number is positive or negative. Typically this is the very first bit in a word, (1 for negative) and it's called the sign bit .
For example, using a 16-bit word size (typically computers currently use 32 or 64 bits), the following is how a computer would store -173
\[1000000010101101_2\]
Note we use a subscript 2 to remind ourselves it's a binary number (though the 1's and 0's kind of give it away). This is equivalent to saying the following
\[1000000010101101_2 = -(2^7 + 2^5 + 2^3 + 2^2 + 2^0) = -(128 + 32 + 8 + 4 + 1) = -137_{10}\]
The 1 in the very first location tells us it's a negative number, and the 1's in the 7th, 5th, 3rd, 2nd, and 0th spot tell us to sum together 2 raised to the power of their respective indices. The following is a 16-bit table with the position indices underneath.
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
If we use 1 bit for the sign, that leaves us with 15 others to represent binary numbers 0 to<PHONE_NUMBER>11111. This upper limit in decimal is 32,767. Note that this value can be found by simply evaluating \(2^{15} - 1\). Therefore, a 16-bit word can represent integers ranging from -32,767 to 32,767. However, because 0 and -0 are really the same, we can use<PHONE_NUMBER>000000 to denote an additional negative number, extending our range by one.
For an \(n\)-bit word, we can represent values in the range \(-2^{n-1}\) to \(2^{n-1} - 1\).
This isn't exactly how computers typically represent signed numbers however. A technique called the 2s Complement directly incorporates the sign into the numbers magnitude rather than reserving a bit just for the sign. Regardless, the number ranges are exactly the same as described above.
Fractional quantities are typically represented very similar to how we think about scientific notation.
\[\pm s \times b^e\]
where \(s\) is the significand or mantissa , \(b\) is the base of the number system being used, and \(e\) is the exponent . Prior to using this form however, the number is normalized by shifting the decimal place so that there is only one significant digit left of the decimal point. This is done so the computer doesn't store needless zeros.
Let's create a toy system in base-10 with a 5-digit word size.
We use one digit for the sign, two for the exponent and two for the mantissa. Note that the exponent can be both positive and negative, so we have one digit for the sign, and one for the magnitude. This gives us the following generalization
\[s \cdot d_1.d_2 \times 10^{s_e d_e}\]
Let's play around with this toy system. What's the largest value it can represent? That would be \(+9.9\times 10^{+9}\). which is just a little less than 10 billion.
What's the smallest (positive) value we can represent? That would be \(+1.0 \times 10^{-9}\) We can represent the smallest and largest representable negative numbers similarly.
How bad is the roundoff error in this toy system? Well, it's pretty bad. There is a "hole" around zero, and there are also "holes" between numbers that we can represent. For example, the number 0.03125 would have to be stored as \(3.1 \times 10^{-2}\), or 0.031. This introduces error, and in this case it represents a true relative error of
\[\varepsilon_t = \frac{0.03125 - 0.031}{0.03125} = 0.008\]
The following is the number line showing some of the limitations of our toy system
A more subtle limitation is the gaps between the representable numbers. Note that the gap size is relative to the magnitude of the numbers being represented. For numbers with an exponent of -1 (between 0.1 and 1), the number spacing is on intervals of 0.01. For ever increase in exponent, the gap size decreases by a factor of ten. For example, with an exponent of 1, the spacing increases to a gap size with width 0.1. This means roundoff error is proportional to a number's magnitude. It also means that the relative error has an upper bound . This upper bound is called the machine epsilon .
We talked just a bit earlier about normalizing numbers in scientific notation, that is, taking \(0.0034\times10^{0}\) and converting it to \(3.4 \times 10^{-3}\). Because binary numbers consist of only 1s and 0s, we know for a fact that if a number is normalized the leading digit is a 1. This means that we don't even have to store it!
Therefore, nonzero floating point numbers in base-2 can be represented as
\[\pm (1 + f) \times 2^e\]
where \(f\) is the mantissa and \(e\) is the exponent.
The standard IEEE Double-Precision Format uses 8 bytes (64 bits) to represent floating-point numbers. You can read about it in more detail here . The following is how those 64 bits are broken up into the exponent and mantissa.
| 1 bit | 11 bits | 52 bits |
| Sign | Signed Exponent | Mantissa |
The largest representable value is \(1.7977 \times 10^{308}\) (let's call it
realmax
) and the smallest positive representable value is \(2.2251 \times 10^{-308}\) (let's call it
realmin
). The
machine epsilon
of this format is \(2^{-52} = 2.2204 \times 10^{-16}\) (let's call it
eps
). Numbers occurring in computations larger than the max value
realmax
overflow
, and numbers smaller than
realmin
underflow
. Different languages handle overflow and underflow differently. in MATLAB overflows are set to
inf
and underflows are set to
0
. In C, they are handled similarly for floating point numbers. For integers in C, exceeding
realmax
will reset to the other end of the spectrum (
-realmax
)
One way to calculate the machine epsilon on your system is to find the smallest number \(\varepsilon\) such that \(0 + \varepsilon \ne 0\) (i. e. the smallest possible gap between two numbers). In Python, an easy way of getting the machine epsilon is with NumPy:
import numpy as np
print(np.finfo(float).eps) # 2.22044604925e-16
print(np.finfo(np.float32).eps) # 1.19209e-07
print(np.finfo(np.float64).eps) # 2.22044604925e-16
You can also calculate the machine epsilon for a given data type using the following Python snippet
def machineEpsilon(func=float):
eps = func(1)
while func(1) + func(eps) != func(1):
eps_last = eps
eps = func(eps) / func(2)
return eps_last
>>> import numpy as np
>>> machineEpsilon(float)
2.220446049250313e-16
>>> machineEpsilon(np.float64)
2.2204460492503131e-16
>>> machineEpsilon(np.float32)
1.1920929e-07
Truncation error arises when you use an approximation in place of an exact expression in a mathematical procedure. One of the best (and frequently used) examples of truncation errors is the Taylor Series approximation of a function.
Essentially, Taylor's Theorem states that any smooth function can be approximated by a polynomial. The Taylor Series Expansion of \(f(x)\) at \(a\) is
\[f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)\cdot(x-a)^2}{2!} + \frac{f'''(a)\cdot(x-a)^3}{3!} + \cdots = \sum_{n=0}^\infty \frac{f^{(n)}(a) \cdot (x-a)^n}{n!}\]
Note that the equals signs are \(=\) and not \(\approx\). However, computers are discrete, finite machines.  This results in truncation error (we truncate the expression).
When we truncate the Taylor series expansion to \(n\) terms, there's some error left over, and we can include a remainder term \(R_n\) to keep the \(=\) signs exact.
\[f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)\cdot(x-a)^2}{2!} + \frac{f'''(a)\cdot(x-a)^3}{3!} + \cdots + \frac{f^{(n)}(a)\cdot(x-a)^n}{n!} + R_n\]
where
\[ R_n = \frac{f^{(n+1)}(\xi)}{(n+1)!} \cdot h^{n+1}\]
accounts for terms \(n+1\) all the way to \(\infty\) and \(\xi\) lies somewhere between the point we're interested in \(x\) and the point we're expanding about \(a\), with the distance, or step size, between them \(h\).
We have no control over the value of \(\xi\) (it's determined by what we're approximating), but we can control \(h\) and \(n\).
This expression \(R_n\) means that the truncation error of an \(n\)th order Taylor series approximation is proportional to the term \(h^{n+1}\) and is often written as \(R_n = O(h^{n+1})\), where \(O\) is the same Big O notation used in computer science, taken to mean the truncation error is "order \(h^{n+1}\)".
If our approximation is \(O(h)\), or a first order approximation, halving the step size will halve the error. If our approximation is \(O(h^2)\), halving the step size will quarter the error ( second order approximation).
This means that there are two ways to decrease the truncation error in a Taylor series approximation: add more terms to the approximation, or decrease the step size \(h\).
One final note. So far, I've talked about roundoff error and truncation error as two separate entities. In reality, the error in our system is the sum of both errors.
Due to something called subtractive cancellation , decreasing truncation errors can result in increasing roundoff errors. This leads to a sweet spot, where the error is as low as it can get. For more information, here's a video explaining it a bit more:


---
layout: page
# Index page
---
Computational biologist integrating high throughput experiments
and machine learning to decode Life’s complexity.
Welcome to my personal page! As of May 2023,
I am a postdoctoral researcher at the University of Bristol's institute of statistical mathematics,
under the guidance of Christophe Andrieu. Before that, I was a PhD student in
the biocompute lab at the University of Bristol led by Thomas Gorochowski.
My research interests lie primarily in computational biology, machine learning, and statistics.
I am particularly fond of methods using high-throughput datasets (experimental and/or simulation-based)
to probe molecular mechanisms. During my PhD, I studied RNA-mediated gene regulation to accelerate the
design of synthetic biological sequences. Using machine learning techniques, I explored how to map
RNA sequences to protein abundances leveraging vast datasets.
Currently, I am researching generative models (mostly diffusion-based) with applications to
macromolecular design (Proteins, RNA).
Do not hesitate to contact me to discuss any projects!
(email: ys18223 (at) bris.ac.uk). Here are some relevant links:
[gitlab], [LinkedIn],
[CV]
Happy Browsing!


Home
About Us
Faq
Roofing
Siding
Gutters
Blog
Contact Us
Login
Sign Up
Member Subscription
Monthly Plan
$45
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Buy
Yearly Plan
$159
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Buy


Maybe yes, maybe no
I kind of liked it your way
How you shyly placed your eyes on me
Oh, did you ever know?

Maybe yes, maybe no
I kind of liked it your way
How you shyly placed your eyes on me
Oh, did you ever know?


Opening up New Jersey government
OPRAmachine.com is a first of its kind government transparency project that I recently launched to serve the citizens of the state of New Jersey. The site is powered by the New Jersey Open Public Records Act (OPRA), a freedom of information law that allows any citizen of the state to request public records from state and local government agencies.
How it works
OPRAmachine is breaking down barriers by explaining aspects of the OPRA request process. The site allows any citizen to easily file a legally valid public records request and includes a directory that currently includes all 565 municipalities in the state, as well as various state and county governmental agencies. The site has enabled requesters to obtain thousands of pages worth of public records, helping to shine a light on some of the more obscure elements of New Jersey state and local government.
A unique benefit that OPRAmachine provides is that once a public entity provides documents in response to a request, the documents are subsequently stored in the site’s database and made public, allowing the entire public to be able to reap the benefits. This model reduces duplicate requests and serves to further the OPRA law’s purpose of maximizing the citizenry’s knowledge of public affairs.
Thousands of pages released
Since its inception in October, 2017, the OPRAmachine platform has enabled the release of thousands of pages of government documents. Our database of public bodoies currently includes all 565 municipalities in New Jersey, with more public bodies being added on a regular basis. The site has been making an impact and has been used as a research tool by public officials, journalists and activists seeking to obtain authoritative information about public entities in the state. We recently added a documentation that includes detailed information about the process of making a request through the site, as well as reference material concerning the legal and site administration issues that may arise as a result of the site’s operation.
Praise for OPRAmachine
“One of the most important tools making New Jersey government more transparent.” - Citizens Media TV
“Thanks to Gavin Rozzi’s “OPRA Machine” website, the Atlantic County Government can no longer pretend to be transparent. Now they must do it for real.” - Atlantic County News
“The latest installation of our Alaveteli software, OPRAmachine, is an interesting new use of the platform. Rather than covering a whole country, as most of the other Alaveteli installations around the world do, it services just a single US state.” - Gemma Moulder, of the UK-based mySociety, which created the open-source software that powers the OPRAmachine platform.
OPRAmachine’s impact in New Jersey
Following four months of work, I reflected on some of the accomplishments of the web service in this blog post.
By the numbers
Since October, 2017, OPRAmachine has seen:- 2142 public records requests
- 1612 followup messages sent
- 246 registered users
- 922 public bodies
- 92 annotations added to requests
- 183 tracked requests
Latest OPRA requests
Powered by the OPRAmachine API
- Records of Overdose Calls June 2018
Requested from: Barnegat Township
Requested by: Anonymous
Status: Successful.
Please see attached which will satisfy your OPRA request dated July 8, 2018. Thank you Donna M Manno, Deputy Clerk Township of Barnegat 900 W...
- Records of Overdose Calls Within the Township: 06/01/2018-06/30/2018
Requested from: Manchester Township
Requested by: Dave Lansing
Status: Successful.
Good Afternoon Mr. Lansing Attached are the records responsive to your request, 7/3/18 Please confirm you have received this email. Should you have...
- Records of Overdose Calls Within the Township: 06/01/2018-06/30/2018
Requested from: Manchester Township
Requested by: Dave Lansing
Status: Follow up
I have received the records, and I thank you tremendously. Have a great weekend! Yours sincerely, Dave Lansing
Chart of requests
Links
Main OPRAmachine website.
Read updates about the project at our blog here.


src code
An IRC library for node.js
Default global options, all instances will inherit these options.
new IRC
version
addListener
channelMode
connect
disconnect
invite
join
kick
list
listenOnce
names
nick
oper
part
pass
privmsg
quit
raw
removeListener
topic
user
userMode


The Opacity effect makes the target element disappear or appear by changing the CSS opacity property. The Fade effect uses the Opacity effect.
You can attach the Fade effect to any HTML element except applet, body, iframe, object, tr, tbody, or th.
The following table lists available options for the Opacity effect.
|
Option |
Description |
|---|---|
|
duration |
Duration of the effect in milliseconds. The default value is 1000. |
|
toggle |
Lets you create a toggle effect. The default value is false. |
|
transition |
Determines the type of transition. The default is Spry.sinusoidalTransition. |
|
fps |
Determines the number of frames per second (fps) of the animation. The default is 60. |
|
setup |
Lets you define a function that is called before the effect begins, e.g., setup:function (element,effect){/* ... */}. |
|
finish |
Lets you define a function that is called after the effect finishes, e.g., finish:function (element,effect){/* ... */}. |
Sample code:
|
var effect = new Spry.Effect.Opacity("targetID", 1, 0.5, {duration: 2000, toggle: true}); |
|
effect.start(); |


0
DAYS
0
HOURS
MINUTES
0
SECONDS
0
COMING SOON...
OUR SERVICES
Graphic Design
We will Provided any type of Graphic Design Work.
Web Design
We will Provided any type of web Design.
Server Deploy
We will Provided Windows and Linux base Server deploy
3D modeling and Rendaring
We will Provided
3D modeling and Rendaring
PROJECTS
CONTACT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi.
STAY CONNECTED
Copyright 2018 | All Rights Reserved | maksud.ml
Start
Services
Projects
Contact


{% extends "layout_signed-in.html" %} {% block page_title %} GOV.UK prototyping kit {% endblock %} {% block content %} ALPHA This is a new service – your feedback will help us to improve it. Back Review changes The following lists have had changes that need to be reviewed Choose sector Landfill: Return period Landfill: Parameter Paper and pulp: Parameter {% endblock %}
ALPHA This is a new service – your feedback will help us to improve it.
The following lists have had changes that need to be reviewed


Policy for Managing Unified SML/NJ CVS Repository
In order to improve coordination of the various people contributing to the development and maintenance of SML/NJ, we have established a single master CVS repository accessible to all. In order for this plan to work well, we need to agree on a policy or set of guidelines for how the repository should be managed.This policy document is still evolving; comments, corrections, and suggestions are encouraged.
See the cvs-readme file for additional advice about accessing and using the repository.
1. Location
The master repository from with Release and Working versions have been created in the past has been at Bell Labs. The obvious problem with this arrangement is that people not at Bell Labs do not have access through the firewall. CVS supports remote operations on a repository (with selective password authorization) as long as the repository is accessible, so the repository should reside on a system that everyone has access to. The new common repository is be hosted by Yale. The address of the repository is:flint.cs.yale.edu:/home/cvs
2. Administration
2.1. Repository Administrator
There is a repository administrator (currently Stefan Monnier) whose responsibilities include creating and organizing the repository, ensuring that the repository is backed up, setting up access for developers and the user community, and generally solving problems that require full access to the repository host machine. A deputy or backup administrator should be designated.
2.2. Access
There are two levels of access privileges: developer and user.Developers. The privilege to commit changes is restricted to "active" developers (effectively those on the sml-nj mailing list). Each developer can checkout, commit, tag the repository, create branches, and import new directories. There is a strong obligation on developers to communicate the nature and extent of changes they are making to the group via the sml-nj mailing list.
Developers outside Yale will use ssh to access the repository remotely. Procedures for using ssh are documented in the cvs-readme file.
Users. It has become common practice in the "open source" movement to have an open CVS repository that _anyone_ can checkout from. This seems to be a reasonable policy for the SML/NJ repository. As a consequence, adventurous users can try out a snapshot of the code under development, and as with our current "working versions", they do so at the risc of encountering bugs and instabilities.
2.3. Backup
The repository should be backed up on a daily basis (probably by normal file system backups of the server hosting the repository).
3. Maintaining stability: Prerequisites for commits
We want to have developers commit their changes frequently enough so that the community remains synchronized, but we don't want partial or half-baked changes committed. Most importantly, we don't want changes committed that break the system (recognizing of course that some changes may introduce bugs no matter how careful we try to be). So here are some guidelines on the procedure for checking in changes.If you are going to make a series of commits over a period of several hours, and the repository will be in a nonworking (i.e. noncompilable) state between commits, please send mail to sml-nj or smlnj-cvs to warn people not to do updates until you are finished with your commits, and send followup mail indicating that you have finished and it is safe to commit.
- Do an update from the repository to incorporate any new changes that have been checked in since your working copy was checked out or updated (frequent updates are a good policy in general).
- Make sure your version compiles to a fixed point. If you are making changes that are clearly platform independent (e.g. to the type checker), it may be sufficient to do this on one architecture. If your changes are specific to one architecture (e.g. changes to x86 specific code generator files), then compiling to a fixed point on that architecture should suffice. If your changes affect non-architecture-specific code generation, you should check all architectures (this may require help from someone who has access to architectures that you don't have).
- Do further testing as appropriate. How much testing depends. For a minor front-end bug fix, running the regression test on one platform may do. For more extensive changes that may effect multiple platforms, regression tests should be run on all platforms. One can also build and test some large applications to improve confidence.
- Do another update to see if any changes have occurred since step 1. If any have, go back and repeat steps 2 and 3.
- rtag the repository (the core set of directories, see Section 8) to mark the state before your changes.
- Do the checkin. Checkins should include useful log comments.
- rtag the repository again to mark the state immediately after your changes.
- Create a description of the changes checked in, including the associated tag names, the nature and purpose of the changes, and a list of files checked in. Add this description to the history file sml/HISTORY in the repository and send it vial email to the sml-nj mailing list (or the smlnj-cvs mailing list?).
- If the changes checked in require a nontrivial bootstrap proceedure (i.e. anything other than iterating recompiles to a fixed point) a set of boot files for the standard platforms should be provided. The boot files should be made available for ftp from the flint.cs.yale.edu server, but in the interim the file sml/BOOT contains a record of the location of the latest boot files and what tag they are associated with. Whenever new boot files are required, the tertiary verion number (e.g. x in 110.26.x) should be incremented along with the date in the file
src/compiler/TopLevel/main/version.smlThis should be done before committing, tagging and building the boot files.Another suggestion is that after finishing your commits, you do an update on smlnj to verify that all your locally modified files have been committed.
In order to avoid "performance bugs", where a change significantly slows down the compiler or the generated code, it would be a good idea to also run benchmarks before checking in.
If you are starting on an extensive set of changes, it would be a good idea to warn the sml-nj list about what you are planning to do, indicating what parts of the system will be affected. Coordinate with other developers in detail as appropriate, and get their cooperation and agreement when necessary.
If your changes have a negative effect, like (temporarily) removing support for a particular architecture or (temporarily) turning off some important function, or (temporarily) reducing performance, it is particularly important to warn the developer community and explain how and when the temporary problem will be corrected.
5. History, tagging, building boot files, building distributions
We tag the repository to mark milestones and to create reference points in the development that can be documented, and that we can back out to if necessary. With a common CVS repository, we will be updating and taging the code on a much more frequent basis.HISTORY and BOOT files.There are two special files in the repository for recording information about changes and new boot file sets.
- sml/HISTORY
- The change history for the repository. Must be updated for each commit. Will be used to prepare version README files.
- sml/BOOT
- Records the location of the current (and past) sets of boot files. Should be associated with a CVS tag.
Documenting tags. Tags will be documented in the sml/HISTORY file, and a record of the tags will be available using the cvs history command:
cvs history -a -TNOTE: for tags to be recorded in the cvs history file, they must be created using the "rtag" command rather than the "tag" command. If you use "tag" instead of "rtag", the only effective way to tell the community about the tag is to record it in the sml/HISTORY file.There is a slight chance of a race condition when using rtag: someone may do a commit while you are in the process of performing the rtag command, in which case the tagged revisions might not correspond with the revisions in your working directory. The tag command does not have this problem; it always tags the revisions corresponding to the ones in your working directory.
When to tag. Here are some guidelines on when to tag.
- Tag (before and) after any significant set of changes has been committed. What constitutes significant is a judgement call -- error on the side of tagging when in doubt.
- Tag after a sufficient accumulation of small changes. This might be covered by tagging at least once every month or two months, even in the absence of major changes. Of course, it's not necessary to tag if _no_ changes have occurred since the last tag.
- Tag when creating a new version (i.e. when incrementing the compiler version number and date in src/compiler/TopLevel/main/version.sml).
What to tag. The tag should be applied to the set of core compiler "working set" of directories, including at least the following:
sml/config sml/src/MLRISC sml/src/cm sml/src/compiler sml/src/runtime sml/src/systemNote that this is a subset of smlnj (see Section 8 below), the minimal set of directories that must be checked out to build the compiler from sources, since it does not include sml/src/ml-yacc and sml/src/smlnj-lib. There could be an module corresponding to this core working set, namely the compiler-set suggested in Section 8. Ideally the modules smlnj-lib and ml-yacc that are relatively stable compared with the compiler and are maintained independently of the compiler should have their own separate tags and version history.Tag name format. The suggested format for tag names is:
<name>-<date:yyyymmdd>-<comment phrase>for instance:dbm-20000224-fix_bug_1544Note that one can check whether any changes have been committed since the last tag by usiing the cvs diff command:
cvs diff -r <tag-name> -r HEADBoot files. A new set of boot files should be provided whenever changes require a nontrivial bootstrap procedure. The boot files will be placed in an ftp directory on [a designated ftp server - tbd].
Version increments. When accumulated changes warrant it, we will increment the minor version number and build a distribution. A distribution consists of a version README (summarizing changes documented in the HISTORY file and providing benchmark results), a set of source tarballs, and a set of boot tarballs (i.e. sml.boot.*.tgz).
6. Branches
The normal procedure will be to check out a working copy, modify that working copy, update, test, and commit changes. In some cases it may be convenient or necessary to create a branch in the repository, particularly when two geographically distributed developers want to collaborate on changes. We advise great caution when using branches in the main repository, and suggest that you read the documentation on branches thoroughly and make sure you understand how they work. Be particularly careful when updating a working copy of a repository branch (e.g. never use "update -A" in such circumstances).When working on a branch, try to keep the branch and the trunk as much in sync as possible:
The only reason for not merging a branch whose code is working is that it is uncertain whether the code will ever be merged into the trunk (i.e. it's experimental).
- merge changes from the trunk into your branch as often as you can.
- merge the branch back into the trunk as soon as the branch is stable enough.
The cvs-readme file contains more advice about using branches.
8. Contents and organization of the Repository
The repository will containThere is a repository map that documents the current directory structure of the repository.
- components of the compiler itself (config, runtime, compiler, MLRISC, system, cm)
- libraries and tools (smlnj-lib, ml-lex, ml-yacc, ml-burg, smlnj-c)
- testing and benchmarking code (tests, benchmarks)
- other packages (CML, eXene, ckit)
Some directories may have more restrictive access policies (i.e. may limit the set of developers allowed to commit changes to the directory).
The repository supports the following "modules" or virtual projects:
The directory structure of the repository and of the compiler distribution should be coordinated.
- The smlnj module consists of the set of directories needed to build the compiler from sources (i.e. those necessary to bootstrap the compiler). smlnj contains the following
smlnj/config smlnj/src/runtime smlnj/src/compiler smlnj/src/MLRISC smlnj/src/system smlnj/src/cm smlnj/src/ml-yacc smlnj/src/smlnj-lib- The set of core compiler components that should be tagged when committing changes. This will be called "compiler-set" and will consist of the components of boot-set except for ml-yacc and smlnj-lib.
9. Keywords
CVS keywords (such as Dollar-Log-Dollar) will not be used in the sml source. Log, version, and status information for files can be accessed using the "cvs log" and "cvs status" commands.10. Mailing list
There is a mailing list, smlnj-cvs, that will automatically receive messages announcing commits to the repository. To join the mailing list, send mail to<EMAIL_ADDRESS>with subject:subscribe<EMAIL_ADDRESS>CVS References
The following are the most useful references for CVS users.Version Management with CVS
Per Cederqvist, et al.
(the manual that comes with the CVS software)Open Source Development with CVS
Karl Fogel
CoriolisOpen Press
1999
ISBN: 1-57610-490-7
Online Version: http://cvsbook.red-bean.cominfo cvs (emacs info documentation for cvs)
Dave MacQueen Last modified: Fri Apr 21 16:10:41 EDT 2000