{% extends "base-documentation.html" %} {% block documentation %}
The core of Liftpass is the content management of the applications currencies, progress metrics, goods, and prices. When creating an application in Liftpass each of these sections must be populated to reflect how the application operates.
Currencies
Currencies are the ways the player can buy and spend inside the game with virtual currency.
Metrics
Liftpass records up to 32 different progress metrics. These are user defined and should reflect the game features and developer's interests.
Goods
Goods represent the virtual items the player can purchase within the application. Additionally goods are also IAP that can be purchased for real money.
Prices
Prices is where Currencies, Metrics and Goods come together so that every player can have a unique set of prices.
A/B Test
Liftpass manages prices always in an A/B test formation where two sets of prices are also active and being distributed to players.
There are primarily two ways to manage the content of an application:


ORION Quick Start Guide
To use this quick start guide, use your left/right arrows on your keyboard, or swipe on touch devices, to navigate between pages. You can also press the space bar to advance to the next slide
Thank you for purchasing an orion
For more resources and information visit:
If you have any questions send us an email at:
<EMAIL_ADDRESS>Step 1
After you remove your ORION, set the parts aside like shown.
Step 2
Install the SD card in the left hand side with the label facing towards the back of the panel as shown in the photo.
Step 3
Remove the left side cover using the two black thumb screws.
Step 4
Install the power cable by passing it through the hole in the bottom of the machine and then insert it into the connector as shown.
Step 5
Replace the side panel as shown. Make sure to get the slot end towards the back and top of the machine.
Step 6
Install the spool holders in the slots as shown. For small diameter spools only one support is necessary, for standard 1KG spools both are needed.
Step 7
Install the USB cable by removing the front panel using the two thumb screws on each side of the panel. You can see the USB jack on the left side of the electronics board.
Step 8
Pass the end of the USB cable up from the bottom thru the hole underneath the jack, then re-install the front panel by inserting the bottom first into the tabs and pushing up and back.
Step 9
Install your filament spool on the supports and pass the end through the slot on the support panel, down and through the slot on the extruder panel as shown below.
Step 10
Straighten the end of the filament so it can pass through the extruder without getting caught. Now press the red lever on the extruder with your thumb and thread the filament behind the red lever and up through the extruder until you see it in the tube coming out of the fitting on top.
Step 11
Now you can turn the white gear by hand to feed the filament up to the hot end, but stop short of entering the fitting so you can pre-heat the machine later without risking burning the filament while it sits inside the hot-end.
Step 12
Using the three photos below, slide the arms up, one at a time and move the platform down below the carriages to put it in to print position. The purpose of having it 'inverted' is to safeguard against damage during transportation and shipping.
Step 13
Now go ahead and plug the machine in to a grounded outlet and turn the power switch on the front panel on. The LCD should light up and look like the photo below.
Step 14
Press in on the knob once and turn to select Quick Settings as shown below.
Step 15
Turn the knob to select Home All and press in to select.
CONGRATULATIONS!!!!
Your New ORION is alive and ready to start printing.
Step 16
Now using the selector knob, scroll down to SD Card and click to select.
Step 17
Using the photos below for reference choose Print File, then choose GCode folder and in there you will find three ready to run prints. These 3 prints are set up for ABS material and are what are printed on your machine to test it before we shipped it to you. They are set too hot to print PLA with. You may download all three files and prepare them for PLA.
Step 18
Install Repetier Host software by clicking
HERE and choosing your operating system. Follow the on-screen instructions to set up the software and install it. It's handy to have a short-cut on your desktop/quick-start bar to get to it faster.
Step 19
Install the USB Driver (Windows only) by clicking HERE to download the driver for the machine.
For Mac/Linux machines, it will automatically use the dev/tty driver path.
For Windows users, extract the zip file you download from above and then plug the USB cable in to your computer. Windows will fail to recognize the device, as it is not a signed windows official driver. Go to Computer, right click and choose properties, then device manager, and scroll down to the Unrecognised device labelled "RAMBo", right click and choose update driver software. Choose Browse for driver software, then Let Me Pick, then Have Disk, and point to the RAMBo.inf file in the extracted folder you downloaded. It will warn you that it is not a signed driver, and click install anyway . Once the driver finishes installing, close the driver install windows and unplug the USB cable, then plug it back in.
Step 20
Now start Repetier Host software. Once it loads, go to Config>Printer Settings. Choose the COM port that was created when you installed the RAMBo USB Driver in the first Connection Tab, and verify that the baud rate is set to 250000. Next click on the Printer Tab at the top. Set the Travel feed rate and Z axis feed rate to 3000, Default Extruder Temperature to 150, Default Heated Bed Temperature to 70 and make sure "Go To Park Position after job/kill is UNCHECKED. Now click on the Printer Shape tab at the top and choose Rostock Printer (circular print shape) from the drop down. For the Home X choose 0, same for Home Y, and Home Z needs to be set to "Max". Below, set the printable radius to 75 and the printable height to 250.
(for Mac/Linux, it is diameter not radius, so set it to 150)
Step 21
Now click on the Apply button and you should now see the screen display a round table in the display window. Make sure the USB cable is connected and turn the power on. Click on the Connect icon at the upper left corner of Repetier Host screen. You should see the status in the lower section of the log window showing it is connected, and the connect button change it's text to Disconnect.
(For Mac/Linux users press the down arrow key now to see special notes on setup.)
Mac/Linux special notes
Some Mac and Linux distros do not support the 250000 baud rate. If you are having problems connecting to the machine in Repetier host, using the LCD control screen click and scroll down to Configuration>Baud rate and set the baud rate to 115200, then click on the back text, and scroll down to Store to EEPROM and click. This will set your baud rate to 115200, and now go back to Repetier Host and go to Config>Printer settings and select 115200 baud rate and press Apply.
Step 22
Now lets configure Slic3r for your ORION with some default settings. To do this, download one of the following files
These are great starting points to get to printing parts. While they are good general settings, different parts will require different settings. To learn more about all the settings, we recommend experimenting with them and using Repetier Host to preview the resulting G-Code.
Step 23
After downloading the profile for your material, click on the Slic3r tab on the right side of the screen in Repetier Host. Then, to the right of the drop down boxes, click on Configure. This will open up Slic3r so you can specify and make new print profiles. Once it is open, go to file>Load Config and choose the profile you just downloaded. It will bring in the settings for each profile. Now, click on the Print settings tab and click the disk icon to SAVE the settings. Now, click on the filament tab, and then the save icon, and do the same for the Printer Tab. You can now close Slic3r.
Step 24
Now you're ready to "Slice" a part!!!
If you haven't already, you can either download an STL file form the internet from sites like REPABLES or other file sharing sites. Go grab one now if you haven't, and click on the Object Placement tab in Repetier Host. It will open your object and allow you to scale, rotate and position it on the virtual bed of the machine. Once you're ready to process the file for printing, click the Slic3r tab, and at the top click on Slice with Slic3r. This will start the program to generate the G Code for your model. You'll notice a pop up window showing you the amount of time it has been working on the part. When it is done it will automatically change to the G Code Viewer tab and show you a preview of your print.
Step 25
If you are ready to start printing and are connected to the machine, you can simply press the Play icon on the top of the screen and it will start sending the job to the machine. We recommend printing form the SD card though, as USB is prone to interference which can cause issues during a print like interrupting the transfer of the file causing the print to fail. To save the print to the SD card, you can, from the G Code Viewer tab, click the disk icon and choose where to save the file. Note that the file format has to be 1234567.gco, no longer than 7 characters and end with the .gco file extension. You can manually change the file extension if needed, as the default extension is .gcode, which may or may not be readable by the machine.
Step 26
To print form SD, follow the same steps as earlier in this guide. Insert the SD card, click from the main menu, scroll down to SD Card, select Print File, and choose your file. Once you select the file, it will start printing. It may take some time to begin, as it has to heat the bed, if called for, and then home the machine so it knows where it is, and then finally it heats the hot-end to melt the plastic. To speed this up, there are some handy Pre-Heat commands on the LCD controller found in the Quick Settings menu for both ABS and PLA. If you're trying out T-Glase, you can use the ABS settings, they work pretty well.
Troubleshooting
Use the up/down arrow keys to navigate through some of the common troubleshooting tips. Also, there is a wealth of knowledge to be learned from users all over the globe on our forum, we recommend signing up and searching around on the
FORUMS.
Press Down to see troubleshooting tips.
Prints do not stick during the first layer.
-
Nozzle too high off the table.
You can adjust the initial Z height by adjusting the 3 Phillips screws on the top of the carriages by turning them IN to raise the nozzle off the bed, and turning them OUT to lower the nozzle. Remember to home the machine after each adjustment, and turn all 3 equally.
-
Heated bed not hot enough.
You can manually override the bed temp on the LCD panel by clicking from the home screen and scrolling down to Extruder, click, then choose the bed temp and adjust from there.
-
Heated glass plate needs cleaning.
You can simply wash the glass plate with warm soapy water and allow to dry thoroughly before using. Make sure the glass is cool before removing it from the ORION!
Step 27
Your ORION comes with a 220mm diameter round borosilicate glass high temp/high strength glass build plate. For printing PLA, a super clean glass plate can work really well. However, we have a great low cost trick to help your prints stick well. All purpose glue stick, especially the washable kind that goes on purple and dries clear. With the glass cool and clean, apply a thin coating to the glass and then heat the bed to cure it. This will help with PLA, and is a MUST have trick for ABS prints.
Thanks again for choosing
Questions/Comments can be emailed to
<EMAIL_ADDRESS>This is a community maintained document, and all comments suggestions can also be discussed and requested at


Shoe #1
£30.00
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
A experimental responsive layout with animated repositioning.
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
A experimental responsive layout with animated repositioning.
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
For IE10, Firefox, Chrome, Safari, Opera, iOS and Android OS.
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
Will also work on IE9 but with no animation.
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
Can be made to work on IE6, IE7 and IE8 using jQuery/javascript for animation.
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
So resize your browser to see the various elements resize and reposition with animation.
Perfect for the beaches where the sand gets too hot to walk on in bare feet.
There are two changes of size and position.


6
1 Woe to those who are at ease in Zion,
and to those who are secure in the hill country of Samaria,
the notable men of the best of the nations,
to whom the house of Israel comes for help!
2 Your leaders say, "Go to Calneh and look;
from there go to Hamath, the great city;
then go down to Gath of the Philistines.
Are they better than your two kingdoms?
Is their border larger than your border?"
3 Woe to those who put off the day of disaster
and make the throne of violence come near.
4 They lie on beds of ivory
and lounge on their couches.
They eat lambs from the flock
and calves from the stall.
5 They sing foolish songs to the music of the harp;
they improvise on instruments as David did.
6 They drink wine from bowls
and anoint themselves with the finest oils,
but they do not grieve over the ruin of Joseph.
7 So they will now go into exile with the first exiles,
and the feasts of those who lounge about will pass away.
8 I, the Lord Yahweh, have sworn by myself
—this is the declaration of the Lord Yahweh, the God of hosts:
"I detest the pride of Jacob;
I hate his fortresses.
Therefore I will hand over the city with all that is in it."
9 It will come about that If there are ten men left in one house, they will all die.
10 When a man's relative comes to take their bodies up—the one who is to cremate them after bringing the corpses out of the house—if he says to the person in the house, "Is there anyone with you?" And if that person says, "No," then he will say, "Be quiet, for we must not mention Yahweh's name."

Does one plow there with oxen?
Yet you have turned justice into poison
and the fruit of righteousness into bitterness.
13 You who rejoice over Lo Debar,
who say, "Have we not taken Karnaim by our own strength?"
14 "But look, I will raise up against you a nation,
house of Israel"—this is the declaration of the Lord Yahweh, the God of hosts.
"They will afflict you
from Lebo Hamath to the brook of the Arabah."


FCM Web Push Notifications
This is a sample showing how to use
Firebase Cloud Messaging (FCM) in a web browser
Requires setting up a
Firebase
project
Create one from the
Firebase console
Request Notifications
Display Test Notification
Register FCM Token
.


-
The Apprentice liveblogged
Live Heidi Stephens: Who got booted off? And who will be retributed (karmically or otherwise) as a result?
-
Putting Jamie's TV dinners to the test
It all looks so easy on TV. But is it really possible to cook Jamie Oliver's 30-minute recipes in the allotted time? -
Wonderland: Mad Cats and Englishwomen
Sam Wollaston on last night's TV: I feel sorry for the men in mad cat women's lives. I'd rather be put down, like poor ginger Tom Tom -
Matt Smith in The Sarah Jane Adventures
Dan Martin: Sarah Jane was joined by Matt Smith and Pertwee-era companion Jo Grant in Russell T Davies's Death of The Doctor -
Paul O'Grady's socialist fury rant was a rare live-TV shock
Mark Lawson: If Paul O'Grady Live was on the BBC, his attack on the Tory cuts would have been taped and de-fanged


|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
public interface RootPaneContainer
This interface is implemented by components that have a single
JRootPane child: JDialog, JFrame, JWindow, JApplet, JInternalFrame.
The methods in this interface are just covers for the JRootPane
properties, e.g. getContentPane()
is generally implemented
like this:
public Container getContentPane() { return getRootPane().getContentPane(); }This interface serves as a marker for Swing GUI builders that need to treat components like JFrame, that contain a single JRootPane, specially. For example in a GUI builder, dropping a component on a RootPaneContainer would be interpreted as
frame.getContentPane().add(child)
.
For conveniance
JFrame
, JDialog
, JWindow
,
JApplet
and JInternalFrame
, by default,
forward, by default, all calls to the add
,
remove
and setLayout
methods, to the
contentPane
. This means you can call:
rootPaneContainer.add(component);instead of:
rootPaneContainer.getContentPane().add(component);
The behavior of the add
and
setLayout
methods for
JFrame
, JDialog
, JWindow
,
JApplet
and JInternalFrame
is controlled by
the rootPaneCheckingEnabled
property. If this property is
true (the default), then calls to these methods are
forwarded to the contentPane
; if false, these
methods operate directly on the RootPaneContainer
. This
property is only intended for subclasses, and is therefore protected.
JRootPane
,
JFrame
,
JDialog
,
JWindow
,
JApplet
,
JInternalFrame
| Method Summary | |
|---|---|
Container |
getContentPane()
Returns the contentPane. |
Component |
getGlassPane()
Returns the glassPane. |
JLayeredPane |
getLayeredPane()
Returns the layeredPane. |
JRootPane |
getRootPane()
Return this component's single JRootPane child. |
void |
setContentPane(Container contentPane)
The "contentPane" is the primary container for application specific components. |
void |
setGlassPane(Component glassPane)
The glassPane is always the first child of the rootPane and the rootPanes layout manager ensures that it's always as big as the rootPane. |
void |
setLayeredPane(JLayeredPane layeredPane)
A Container that manages the contentPane and in some cases a menu bar. |
| Method Detail |
|---|
JRootPane getRootPane()
JRootPane
void setContentPane(Container contentPane)
The contentPane my not be null.
Generally implemented with
getRootPane().setContentPane(contentPane);
contentPane
- the Container to use for the contents of this
JRootPane
IllegalComponentStateException
- (a runtime
exception) if the content pane parameter is nullJRootPane.getContentPane()
,
getContentPane()
Container getContentPane()
setContentPane(java.awt.Container)
void setLayeredPane(JLayeredPane layeredPane)
The layeredPane may not be null.
Generally implemented with
getRootPane().setLayeredPane(layeredPane);
IllegalComponentStateException
- (a runtime
exception) if the layered pane parameter is nullgetLayeredPane()
,
JRootPane.getLayeredPane()
JLayeredPane getLayeredPane()
setLayeredPane(javax.swing.JLayeredPane)
void setGlassPane(Component glassPane)
The glassPane may not be null.
Generally implemented with
getRootPane().setGlassPane(glassPane);
getGlassPane()
,
JRootPane.setGlassPane(java.awt.Component)
Component getGlassPane()
setGlassPane(java.awt.Component)
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Copyright © 2004, 2010 Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.


School Scheduler
09:00
09:30
10:00
10:30
11:00
11:30
12:00
12:30
1:00
1:30
2:00
2:30
3:00
3:30
4:00
4:30
5:00
5:30
6:00
Monday
EE 98
AAS 33B
CMPE 131
Tuesday
CMPE 130
CMPE 142
EE 97 Lab
Wednesday
EE 98
AAS 33B
CMPE 131
Thursday
CMPE 130
CMPE 142
Leg Day
Friday
Work :(
Close
Import This Schedule
Your class and work schedule has been imported from SJSU and added to the database. The schedule will be added as a filter for finding clubs.
Submit
Exit


Habitat
This Pokemon has no habitat, as it flies around the world in search of trainers with the purest heart. But his homeland may be the Johto region.


Everyday we send you a text message with a question. You can choose to respond to the question or write your own entry for the day.
All of your texts messages are saved in the cloud for your immediate access online.
You can edit your journal online and review your entries everyday. Every three months we give you the option to purchase a bound copy of your journal which is shipped directly to your house.
| Free |
|---|
| Unlimited Text Entries |
| Online Journal Access |
| Update, Modify, Profile |
| N/A |
| N/A |
| Prime |
|---|
| Unlimited Text Entries |
| Online Journal Access |
| Update, Modify, Profile |
| Unlimited Media Text Messages |
| Facebook Auto Feed Record |


Built for developers
GitHub is a development platform inspired by the way you work. From open source to business, you can host and review code, manage projects, and build software alongside millions of other developers.
Username
Password
Use at least one letter, one numeral and seven characters.
By clicking "Sign up for GitHub", you agree to our terms of service and privacy policy. We'll occasionally send you account related emails.


Hey there, reader. Do you consider yourself an adventurous person? Do you get a shot of thrill when facing a tricky, heart-pounding situation? Do you think you can brave the dangers of Mother Nature? Do you find it challenging, or tiring to plan a proper, enjoyable trip? If your answer is ‘Yes’ to all these questions, then you’ve come to the right place.
1) Trekking in India
This website allows you to plan your trek based on your experience level, which is quite a handy facility for amateurs who quite often, bite off more than they can swallow. The treks are also available on a budget, so you needn't worry too much about the strain on your pocket.
2) Adventure Nation
This is another planning website which not also caters to all your adventure needs, but also helps you meet like-minded individuals who share your passion for adventure and thrill via ‘tribes'. Interesting, is it not?
 Delve into this beautifully designed, aesthetically pleasing website to find your next dose of adventure!
5) Peak Adventure
The developers of this website have years of experience in the field of trekking and adventure sports, and so can offer some of the safest yet thrilling experiences to their potential customers. Targeted mostly towards North India, this website is all about unusual and exciting activities that offer the ultimate fun and experience.
6) Tour my India
This link provides detailed information on several adventure spots across the country by means of articles, blogs, content, and news. You can choose your next vacation destination from the many locations mentioned amongst the content provided here.
7) Indiahikes
This website gives you direct access to India's largest and most-widely recommended trekking community, in addition to helping you find the perfect trek for you via access to 700+ documented treks, resources and free articles. You can also jointly create a hiking club in your school/organization with them.
8) The following is a list of articles mentioning some of the noteworthy adventure spots in India:
The above-listed websites, blogs, and articles are a precious few of the many resources available on the Internet to plan your next emprise. I hope this article lessens your planning burden to some extent and gets you fully pumped for all your future adventurous getaways.
Well, what are you waiting for? Get clicking and happy adventuring!


{% trans "View this" %} {{ object.type }} {% comment %}Only stories will have the ``connected_count`` attribute. It might make sense to figure out a solution that involves template inheritance or populates a list of items to be shown here as a key of ``object`` instead of having all this conditional logic in the template.{% endcomment %} {% if object.connected_count %}| {% trans "View" %} {{ object.connected_count }} {% blocktrans count connected_count=object.connected_count %}connected story{% plural %}connected stories{% endblocktrans %}{% endif %} {% if object.more_link_url %}| {{ object.more_link_text }}{% endif %}
{% endif %}


Lyrics
Hey! You've listened this song for 5 times, buy to support this singer!
Get closer
About this Song
#electronics #sad #partymusic
Added to Collection
Pay to Download
Recent Event of
5/20 18:00 @ Legacy Taipei
buy tickets


--- title: "Minimal Hardware Estimates" subtitle: "How low you can go?" author: "Alexander Minyushkin" date: 2019-08-16T19:00:00+03:00 categories: ["GCP"] tags: ["Cloud", "GCP", "Hardware"] ---
When you want to estimate hardware for Non-production environment you want to spend minimal resources on it.
Especially if you need it only for development where very low workloads expected.
Googling minimal hardware recommendations may disappoint you, because authors avoid to give such recommendations.
For example Kafka: We are using dual quad-core Intel Xeon machines with 24GB of memory. 24 GB RAM, are you sure?
Most popular answer is on Quora: Do not cheap out and try to have a machine with 48TB disk and 2GB ram and a duel core CPU, but dont go crazy.
Here is Liferay: For the purposes of this document we will use a very simple reference hardware configuration illustrated here:
It all looks too big for non-prod environment with near zero workload.
To solve this problem I found it useful to take a look at GCP marketplace.
Default recommendations there are small enough. You can use them without verification if you trust Google Cloud.
After all, you can spend one cent, try to deploy on smaller instances and check if it works.
You can leave comments here https://twitter.com/AMiniushkin


ebook-viewer(1) ebook-viewer(1) NAME ebook-viewer - view ebook USAGE ebook-viewer [options] file DESCRIPTION View an ebook. Whenever you pass arguments to ebook-viewer that have spaces in them, enclose the arguments in quotation marks. MAIN OPTIONS --version show program´s version number and exit -h, --help show this help message and exit AUTHOR Created by Kovid Goyal<EMAIL_ADDRESS>19 January 2013 ebook-viewer(1)


Click here
After warming the chicories, mash up blood oranges, avocado and ricotta with it in a bottle.
Decorate one package of chicken lard in one quarter cup of oyster sauce.
Hot walnut can be made fluffy by blending with rum.
Quartered chickpeas can be made mild by mixing with sour milk.


--- layout: default title: Guidelines for authors ---
Authors can publish with Language Science Press free of charges. Have a look at the benefits of publishing open access with us and get convinced. Take in the author guidelines and have a tour through the submission process with our srceencast "Hot to submit a manuscript". You may find the detailed description of the general workflow helpful.
Have a look at the description of the workflow in general for more details. Refer to the guidelines for details of the reviewing procedure.
Note that the platform is still under development. If you have questions concerning the use of the software contact Sebastian Nordhoff.
Authors can publish with Language Science Press free of charges. Have a look at the benefits of publishing open access with us and get convinced. Take in the author guidelines and have a tour through the submission process with our srceencast "Hot to submit a manuscript". You may find the detailed description of the general workflow helpful.
Have a look at the description of the workflow in generalfor more details. Refer to the guidelinesfor details of the reviewing procedure.
Note that the platform is still under development. If you have questions concerning the use of the software contact Sebastian Nordhoff.


A grid based design serves as a framework. Websites are broken into grids, and in these grids, graphic elements (images, paragraphs, videos, etc.) keeps the content organized in a rational, easy to absorb manner.
Nowadays, people use many different devices to access the internet, whether it being a desktop, laptop, netbooks, tablets, and phones. more and more people every year are accessing the internet primarily through the their tablet or mobile phones. All these devices have a different size of screen (resolution). Responsive webpages are the sites able to adapt to the screen, despite what device is being used.
Semantic structre is the means of describing the content in a webpage. As an example, h1, img, and form, tags, makes sense to a browser, and all the users looking at the code.
Code, test, and refine, has helped me alot through the coding process. Rather than coding big changes and testing just to see a bug, I would have to retrace my code and waste alot more time. Instead, I add little changes and see what works and what doesn't.


This protocol is for polysome fractionation by sucrose gradient, to view
translational status of cells and ribosome-association of mRNAs and
proteins, using the BioComp gradient station
(http://www.biocompinstruments.com/). It’s based on the BioComp
instructions, with help from Wesley Clark.
Read the BioComp instruction book for more details of gradient station
operation, especially for troubleshooting.
Components
Wet ingredients
-
Sample: 100-500 ul cell lysate, with assembled
polysomes, at OD260 ~ 100.
-
Mammalian Polysome gradient buffer: 100mM KCl, 7.5mM MgCl2, 5mM
Tris-HCl pH7.5, or,
-
Yeast Polysome gradient buffer: 140mM KCl, 5mM MgCl2, 5mM Tris-HCl pH7.5
(NOTE: Can adjust salt, Mg, pH, etc; common additions are cycloheximide to
freeze ribosomes in place, heparin to reduce nonspecific RNA-protein binding and
inhibit RNase, DTT as reducing agent, RNase inhibitors. I’ve made good
polysome gradients without any of these at 2-10mM MgCl2, pH 6.5-7.5. Degraded
DTT is really bad as it absorbs over the RNA spectrum.)
-
50% Sucrose buffer: 0.5g/ml sucrose in polysome gradient buffer, filter sterilized.
-
10% Sucrose buffer: 0.1g/ml sucrose in polysome gradient buffer, filter sterilized.
Dry ingredients
-
BioComp Instruments gradient station.
-
Beckman Coulter S-rated ultracentrifuge, e.g. Optima XP-100.
-
Beckman SW28 rotor and SW28.1 (or SW28) tube buckets, kept in cold room. Rotor
must be placed only on rotor-holding platform, do not scratch speed ring on bottom.
-
Seton open-top polyclear centrifuge tubes SW28.1 (part.no 7042). Alternatively,
SW28 (part.no 7052); SW28 are wider and slightly shorter.
Prepare gradients
-
Layer sucrose into centrifuge tube: place a polyclear centrifuge tube in the
marker block. Pour 10% sucrose buffer into the tube up to the top of the marker
block (roughly 10ml for SW28.1 / 19.5ml for SW28). Load 50% sucrose buffer into
a 50ml Luer-lok syringe with a layering cannula (BioComp 106-211) attached; with
the needle pointing upwards, expel air from the needle. Quickly and smoothly
invert the syringe so the needle is in the bottom centre of the half-filled
centrifuge tube. Slowly layer 50% sucrose buffer at the bottom of the tube until
the top of the meniscus is at the top of the tube (roughly 10ml; 19ml for SW28),
and carefully remove needle from tube. Place the capillary cap on top of the
tube, ensuring tube is sealed round edges of cap. Repeat for desired number of
tubes (2, 4 or 6 total), and place filled tubes in magnetic tube rack.
-
Level the gradient maker platform on the gradient station: turn
gradient-maker on, choose GMST menu option. The machine will prompt you to level
the gradient-making platform. Place a bubble level on the platform with axis
perpendicular to the side plate of the machine and use the UP and DOWN menu
options to level the platform (the machine should already be level front to
back); press DONE.
-
Make gradients: place magnetic tube rack on gradient-making platform. Select
GRAD option to arrive at gradient menu. The first time, go to LIST and choose
the SW28.1 (or SW28) rotor option. Press DOWN until arriving at the 10-50% sucrose
gradient option, and press USE. If the machine was used for 10-50% sucrose gradient
immediately previously, simply select LAST from the gradient menu. Press USE to
start making gradients, which takes roughly 10 minutes. From this point onwards,
keep the tubes upright and make no sudden movements with them, so as not to
disturb the gradient. Remove capillary cap from tube and, using long-nosed
pliers if necessary, place in rotor bucket in bucket rack.
-
Balance the tubes: balance tube 1 with tube 4, 2 with 5, and 3 with 6.
Placing bucket-tube assembly on scale, remove sucrose gradient from top of tube
as necessary to ensure paired tubes are within 0.1g in mass.
-
Prepared gradients can be stored at 4C for a day or two.
Spin
-
Load sample and assemble rotor: take sample, SW28.1 (or SW28) rotor,
bucket rack, and 200 ul pipette to ultracentrifuge. Load sample in
each tube by placing filled pipette tip in meniscus at side of tube,
and pipetting slowly; you should see the sample spreading out across
top of liquid. Gently place lid on tube and screw cap on bucket.
Hang buckets in numbered slots on rotor, checking that both hooks
are attached for every bucket.
-
Set up centrifuge: turn on centrifuge, break vacuum and open
spin chamber. Select 27500 rpm, 3.5hrs, 4C, with vacuum, on
centrifuge controls. Place rotor assembly on axle, and seal
spin chamber. Start centrifuge and fill out centrifuge logbook.
Check on the centrifuge after 15 minutes to ensure it is
running smoothly.
-
After running for 3.5hrs, the centrifuge takes several minutes
to brake. Once the centrifuge has stopped spinning, release the
vacuum, carefully remove rotor from spin chamber and place buckets
in bucket rack.
Set up gradient station
-
Take bucket rack with gradients to gradient station, very gently.
-
Turn on the gradient station, the UV monitor, the fraction collector,
and the linked computer. Connect the USB cable, start the gradient profiler
program on the computer and enter appropriate parameters.
-
Flush the line and calibrate the UV monitor: press DRAIN on fraction
collector. On the gradient station, from the initial screen press FRAC, then
FRAC. Hold RINSE on gradient station to flush the line. Half-fill a centrifuge
tube with 10% sucrose buffer, turn front dial so that vacuum plunger descends at
about 0.5 mm/s. Once plunger is a few cm into liquid and drips are coming out of
the fraction collector, press AUTO ZERO on the UV monitor.
Collect fractions
For each ultracentrifuge tube with sample:
-
Initialize fraction collector: ensure there are 30x clean 1.5ml
tubes in the two middle rows of the tube holder. Pre-label the tubes
if desired. Press END, then START, and make sure drip outlet is
above tube 0.
-
Remove bucket cap, remove centrifuge from bucket using long-nosed
pliers, and attach locking top to centrifuge tube. Place tube in
tube holder on gradient station, locking the tube in place by
rotating the cap to lock in place. Slide tube holder onto mount on
top of gradient station with window facing to the right, and turn
clockwise so window is facing towards you.
-
On gradient station, press FRAC once or twice to get to the fractionation
menu, then SNGL for single run, and set the parameters to speed = 0.3, distance
= 3.2 (for SW28.1; 2.6 for SW28), and 31 fractions. Rotate front dial to full
counterclockwise position. Move plunger downwards by turning dial to the right
until speed = 1.0 mm/s; move plunger slowly (0.2 mm/s) as it approaches the
gradient surface, so that you can stop (by turning dial fully left) as soon as
the plunger has sealed on the gradient. Press RESET on gradient station. In
subsequent tubes from same run, reset to same position – i.e. 0.0 mm on display
– from previous tube.
-
On the gradient profiler program on the computer, press RECORD. Then
press START on gradient station.
-
When finished, remove tubes from fraction collector and label them.
Press EXIT 3 times on gradient station to return to fraction menu,
and remove centrifuge tube from holder. Crucially, save the output
on the computer, and press NEW RUN to record the next gradient.
-
Note that the first 1-3 tubes in the fraction collector are usually
empty, so that the tube number on the rack is offset from
that reported in the gradient profiler software (BioComp
instructions suggest this is solvable: good luck!). Tube 0 according
to gradient profiler software is the first filled tube on the fraction
collector. It may be easiest to label the tubes accordingly, after the
fractions are collected.
Cleanup
-
Check all equipment for potential sucrose gradient spills and
clean thoroughly with damp cloth and dilute ethanol; this is a very
sticky spill. In particular, clean the plunger and flush the tubing
with water.
-
Flush tubing with a full tube of 50% Ethanol to disinfect (DRAIN on
fraction collector, from FRAC screen on gradient station lower plunger
at about 0.5 mm/s).
-
Store rotor and buckets in cold room, on rotor holding platform.


Welcome to Fermata 𝄐
Fermata simplifies testing and evaluating the email capabilities of software.
- Any email messages sent here will be saved and displayed.
- Test workflows involving multiple people, without checking someone else's mailbox.
- Verify only the emails that should be sent actually are.
An SMTP server is now running on this computer. Configure the
software you want to test to send mail to this host, on port 2500.
Recent Messages


BeanMapper
via its interface.AbstractBeanMapperTest.MyBeanEntity
and AbstractBeanMapperTest.MyBeanEto
.PersistenceEntity
for testing.ETO
for testing.BeanMapperImplDozer
based on AbstractBeanMapperTest
.BeanMapperImplOrika
based on AbstractBeanMapperTest
.BeanMapper.mapTypesafe(Class, Object, Class)
for an entity
to an
ETO
and ensures that if the modification
counter
gets updated after conversion that the ETO
reflects this change.Copyright © 2014–2018 OASP-Team. All rights reserved.


Cake Design
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowWedding Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowDripping Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowBirthday Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowBirthday Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowBirthday Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowBirthday Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowBirthday Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowCreamy Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowEngineer Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowP.J Mask Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order NowWedding Cake
The cake image above represent what we can offer and what we have previously done, click the button to order for your specific cake type and choice.
Order Now


WITNESS LIST General Investigating Committee November 7, 2003-10:00A Houston Crime Lab On: Breshears, Joe (Houston Police Department) Edwards, Ada (Self) Holland, Richard (Houston Police Department) Mays, Al (City of Houston Finance & Administration) Rios, Irma (Houston Police Department Crime Lab) Rosenberg, Robert (Self) Rosenthal, Charles "Chuck" (Harris County District Attorney)


@ui5/webcomponents
<ui5-carousel>
Example With Arrow Placement And SelectedIndex
Example With No Navigation
Carousel With Different Controls
Template Based Segmentation
Segmentation Models
Marketing plans
Pineapple
Orange
Banana
Mango
Argentina
Bulgaria
China
Germany
Hungary
England
USA
Canada
Template Based Segmentation
Segmentation Models
Marketing plans
Pineapple
Orange
Banana
Mango
Argentina
Bulgaria
China
Germany
Hungary
England
USA
Canada
Example a Couple of Items per Page
MR SOF02 2.43
Online meeting
Personal Development
Finance
Communications Skills
Alain Chevalier
Monique Legrand
Michael Adams
Richard Wilson
Elena Petrova
John Miller
MR SOF02 2.43
Online meeting
Personal Development
Finance
Communications Skills
Alain Chevalier
Monique Legrand
Michael Adams
Richard Wilson
Elena Petrova
John Miller


This is one of the most popular sailing areas on the east coast. The sheltered waters of the Blackwater stretch from West Mersea in the east to the head of tidal navigation at Maldon to the west.
The river is great for kayaks and canoes, dinghies & sailing boats, plus it has one of the only natural Salt Water swimming pools in the UK!
The approach to Tollesbury Marina at the end of Woodrolfe Creek, west of Mersea Island, is now marked with lit buoys (see photo below). Tollesbury is a pretty and relaxed waterside village ideal for families and walkers (there are great walks nearby on the sea wall, past the wildlife sanctuary and out along the river Blackwater or shorter walks around Tollesbury). Tollesbury Marina has excellent facilities on site and it's just a short walk into the village.
Further up the Blackwater, on the southern bank, is Bradwell Marina followed by the Blackwater Marina a further 6nm up the river on Maylandsea Creek.
Careful note of the tides needs to be taken if proceeding even further up-river to the lock at Heybridge Basin or to Maldon.
There are plenty of anchorages in the river if a boat can take the ground.
River Blackwater Harbour Master
Tel:+44(0)1621 856487
Last updated April 2016.
[Show additional 5 entries for this category]


--- title: BEAM in the news! description: Check out our blog as our mentors share their experiences from the field. We will also share news features of BEAM here! ---
BEAM was selected as the ZipCar 2016 “Students with Drive” Grand Prize Winner! This award will help us transport our mentors to sites and will provide us with the resources to continue bringing hands-on lessons to our students.
"A combination of budget cuts and policy decisions has left many local, state and federal bodies short on funds to robustly back science education... Volunteer and corporate-backed STEM networks 'can help schools bridge those gaps and make those connections.'"
BEAM “is not just some sort of weekly outreach thing and you go and it’s like 'whatever,’” BEAM president ('14) Tiffany Chung says. “We really focus on understanding how to interact with a younger audience and what you can learn from the kids. We’re not just going in to help these kids because we’re some sort of 'benefactor’ group. It’s a two-way exchange.”
"[According to the Lawrence Hall of Science] 80% of local K-5 teachers spend less than 60 minutes per week teaching science–and 16% spend no time at all. BEAM...step[s] in where the state and local governments have not."


Javascript - Using Xabaril middleware example
The following features have been configured on the server:
{{f}}
{{feature.name}} is enabled :
{{ feature.status.isEnabled }}
Test features status


Unicode library for C++ by Ross Smith
#include "unicorn/utility.hpp"
This module contains some basic utility functions and related definitions,
used by the Unicorn library but not directly related to Unicode processing.
These are in namespace RS
(except for the metaprogramming facilities in
RS::Meta
), not RS::Unicorn
.
#define
RS_BITMASK_OPERATORS
(EnumType)
Defines bit manipulation and related operators for an enum class
(unary !
,
~
; binary &
, &=
, |
, |=
, ^
, ^=
). The type can be defined the
conventional way or through the RS_ENUM_CLASS()
macro.
#define
RS_ENUM
(EnumType, IntType, first_value, first_name, ...)
#define
RS_ENUM_CLASS
(EnumType, IntType, first_value, first_name, ...)
These define an enumeration, given the name of the enumeration type, the underlying integer type, the integer value of the first entry, and a list of value names. They will also define the following functions:
constexpr bool
enum_is_valid
(EnumType t) noexcept
std::vector<EnumType>
enum_values<EnumType>
()
bool
str_to_enum
(std::string_view s, EnumType& t) noexcept
std::string
to_str
(EnumType t)
std::ostream&
operator<<
(std::ostream& out, EnumType t)
The enum_is_valid()
function reports whether or not the argument is a named
value of the enumeration. The enum_values<T>()
function returns a vector
containing all of the enumeration values. The str_to_enum()
function
converts the name of an enumeration value (case sensitive; possibly qualified
with the class name) to the corresponding value; if the string does not match
any value, it leaves the reference argument unchanged and returns false. The
to_str()
function and the output operator print the name of an enumeration
constant (qualified with the class name if this is an enum class
), or the
integer value if the argument is not a named value.
Example:
RS_ENUM(Foo, 1, alpha, bravo, charlie)
RS_ENUM_CLASS(Bar, 1, delta, echo, foxtrot)
Equivalent code:
enum Foo { alpha = 1, bravo, charlie };
constexpr bool enum_is_valid(Foo t) noexcept { ... }
std::string to_str(Foo t) { ... }
std::ostream& operator<<(std::ostream& out, Foo t) { ... }
enum class Bar { delta = 1, echo, foxtrot };
constexpr bool enum_is_valid(Bar t) noexcept { ... }
std::string to_str(Bar t) { ... }
std::ostream& operator<<(std::ostream& out, Bar t) { ... }
The macros can be used in any namespace, and the functions that take an enum
value as an argument will be in that namespace, but enum_values()
is a
single function template in namespace RS
.
#define
RS_MOVE_ONLY
(T)
T(const T&) = delete;
T(T&&) = default;
T& operator=(const T&) = delete;
T& operator=(T&&) = default;
#define
RS_NO_COPY_MOVE
(T)
T(const T&) = delete;
T(T&&) = delete;
T& operator=(const T&) = delete;
T& operator=(T&&) = delete;
#define
RS_NO_INSTANCE
(T)
T() = delete;
T(const T&) = delete;
T(T&&) = delete;
~T() = delete;
T& operator=(const T&) = delete;
T& operator=(T&&) = delete;
Convenience macros for defaulted or deleted life cycle operations.
#define
RS_NATIVE_WCHAR
1
- defined if the system API uses wide characters#define
RS_WCHAR_UTF16
1
- defined if wchar_t and wstring are UTF-16#define
RS_WCHAR_UTF32
1
- defined if wchar_t and wstring are UTF-32These are defined to reflect the encoding represented by wchar_t
and
std::wstring
. Systems where wide strings are neither UTF-16 nor UTF-32 are
not supported.
#define
RS_OVERLOAD
(f) [] (auto&&... args) { return f(std::forward<decltype(args)>(args)...); }
Creates a function object wrapping a set of overloaded functions, that can be passed to a context expecting a function (such as an STL algorithm) without having to explicitly resolve the overload at the call site. (From an idea by Arthur O'Dwyer on the C++ standard proposals mailing list, 14 Sep 2015.)
using
Ustring
= std::string
using
Uview
= std::string_view
Use Ustring
or Uview
for strings that are expected to be in UTF-8 (or
ASCII, since any ASCII string is also valid UTF-8), while plain std::string
or std::string_view
is used where the string is expected to be in some other
Unicode encoding, or where the string is being used simply as an array of
bytes rather than encoded text.
using
Strings
= std::vector<std::string>
Commonly used type defined for convenience.
using
NativeCharacter
= [char on Unix, wchar_t on Windows]
using
NativeString
= [std::string on Unix, std::wstring on Windows]
These are defined to reflect the character types used in the operating system's native API.
using
WcharEquivalent
= [char16_t or char32_t]
using
WstringEquivalent
= [std::u16string or std::u32string]
These are defined to reflect the encoding represented by wchar_t
and
std::wstring
. Systems where wide strings are neither UTF-16 nor UTF-32 are
not supported.
template <auto> class
IncompleteTemplate
class
IncompleteType
template <auto> class
CompleteTemplate
class
CompleteType
Dummy types used in metaprogramming. The Complete
types are complete but
cannot be instantiated.
constexpr const char*
ascii_whitespace
= "\t\n\v\f\r "
ASCII whitespace characters.
constexpr bool
big_endian_target
constexpr bool
little_endian_target
One of these will be true and the other false, reflecting the target system's byte order.
template <typename T> constexpr bool
dependent_false
= false
Conventional workaround for an always-false static_assert()
in the final
else
clause of an if constexpr
statement.
constexpr size_t
npos
= std::string::npos
Defined for convenience. Following the conventions established by the standard library, this value is often used as a function argument to mean "as large as possible" or "no limit", or as a return value to mean "not found".
template <int N> constexpr [unsigned integer]
setbit
= 1 << N
An integer constant with bit N
set. The return type is the smallest unsigned
integer (not counting bool
) that will hold the value. Behaviour is undefined
if N<0
or N>63
.
template <typename Container> [output iterator]
append
(Container& con)
template <typename Container> [output iterator]
overwrite
(Container& con)
template <typename Range, typename Container> const Range&
operator>>
(const Range& lhs, [append iterator] rhs)
The append()
and overwrite()
functions create output iterators that will
append elements to a standard container (see append_to()
below). The
append()
function is similar to std::back_inserter()
(but supports
containers without push_back()
), while overwrite()
will first clear the
container and then return the append iterator. There is also an operator that
can be used to copy any range into a container (e.g. range >> append(con)
).
template <typename Container, typename T> void
append_to
(Container& con, const T& t)
Appends an item to a container; used by append()
and overwrite()
. The
generic version calls con.push_back(t)
or con.insert(con.end(), t)
;
overloads (found by argument dependent lookup) can be used for other
container-like types.
template <typename Range1, typename Range2> int
compare_3way
(const Range1& r1, const Range2& r2)
template <typename Range1, typename Range2, typename Compare> int
compare_3way
(const Range1& r1, const Range2& r2, Compare cmp)
Compare two ranges, returning -1 if the first range is less than the second, zero if they are equal, and +1 if the first range is greater.
For the bit manipulation functions (bit_floor()
, bit_ceil()
,
bit_width()
, has_single_bit()
, popcount()
rotl()
, and rotr()
),
behaviour is undefined if T
is not an integer, or if T
is signed and the
argument is negative.
template <typename T> constexpr std::make_signed_t<T>
as_signed
(T t) noexcept
template <typename T> constexpr std::make_unsigned_t<T>
as_unsigned
(T t) noexcept
These return their argument converted to a signed or unsigned value of the
same size (the argument is returned unchanged if T
already had the desired
signedness). Behaviour is undefined if T
is not an integer or enumeration
type.
template <typename T> constexpr T
bit_floor
(T t) noexcept
template <typename T> constexpr T
bit_ceil
(T t) noexcept
Return the argument rounded down or up to a power of 2. For bit_ceil()
,
behaviour is undefined if the argument is large enough that the correct answer
is not representable.
template <typename T> constexpr int
bit_width
(T t) noexcept
Returns floor(log2(t))+1
, equal to the number of significant bits in t
,
or zero if t
is zero.
template <typename T> constexpr bool
has_single_bit
(T t) noexcept
True if the argument is an exact power of 2.
constexpr uint64_t
letter_to_mask
(char c) noexcept
Converts a letter to a mask with bit 0-51 set (corresponding to [A-Za-z]
).
Returns zero if the argument is not an ASCII letter.
template <typename T> constexpr int
popcount
(T t) noexcept
Returns the number of 1 bits in the argument.
template <typename T> constexpr T
rotl
(T t, int n) noexcept
template <typename T> constexpr T
rotr
(T t, int n) noexcept
Bitwise rotate left or right. The bit count is reduced modulo the number of
bits in T
; a negative shift in one direction is treated as a positive shift
in the other.
constexpr uint32_t
utc_zone
constexpr uint32_t
local_zone
Used to indicate whether a date is expressed in UTC or the local time zone.
Ustring
format_date
(system_clock::time_point tp, int prec = 0, uint32_t flags = utc_zone)
Ustring
format_date
(system_clock::time_point tp, Uview format, uint32_t flags = utc_zone)
These convert a time point into a broken down date and format it. The first
version writes the date in ISO 8601 format ("yyyy-mm-dd hh:mm:ss"
). If
prec
is greater than zero, the specified number of decimal places will be
added to the seconds field.
The second version writes the date using the conventions of strftime()
. This
will return an empty string if anything goes wrong (there is no way to
distinguish between a conversion error and a legitimately empty result; this
is a limitation of strftime()
).
Both of these will throw std::invalid_argument
if an invalid flag is passed.
For reference, the portable subset of the strftime()
formatting codes are:
| Code | Description | Code | Description |
|---|---|---|---|
| Date elements | Weekday elements | ||
%Y |
Year number | %a |
Local weekday abbreviation |
%y |
Last 2 digits of the year (00-99 ) |
%w |
Sunday-based weekday number (0-6 ) |
%m |
Month number (00-12 ) |
%A |
Local weekday name |
%B |
Local month name | %U |
Sunday-based week number (00-53 ) |
%b |
Local month abbreviation | %W |
Monday-based week number (00-53 ) |
%d |
Day of the month (01-31 ) |
Other elements | |
| Time of day elements | %c |
Local standard date/time format | |
%H |
Hour on 24-hour clock (00-23 ) |
%x |
Local standard date format |
%I |
Hour on 12-hour clock (01-12 ) |
%X |
Local standard time format |
%p |
Local equivalent of a.m./p.m. | %j |
Day of the year (001-366 ) |
%M |
Minute (00-59 ) |
%Z |
Time zone name |
%S |
Second (00-60 ) |
%z |
Time zone offset |
template <typename R, typename P> Ustring
format_time
(const duration<R, P>& time, int prec = 0)
Formats a time duration in days, hours, minutes, seconds, and (if prec>0
)
fractions of a second.
template <typename R, typename P> void
from_seconds
(double s, duration<R, P>& d) noexcept
template <typename R, typename P> double
to_seconds
(const duration<R, P>& d) noexcept
Convenience functions to convert between a duration
and a floating point
number of seconds.
system_clock::time_point
make_date
(int year, int month, int day, int hour = 0, int min = 0, double sec = 0, uint32_t flags = utc_zone)
Converts a broken down date into a time point. Behaviour if any of the date
arguments are invalid follows the same rules as mktime()
. This will throw
std::invalid_argument
if an invalid flag is passed.
void
runtime_assert
(bool condition, std::string_view message) noexcept
A portable, non-blockable version of assert()
. If the condition is false,
this will print the message to standard error (followed by a line break), and
then call abort()
.
template <typename T, int ID = 0> struct
Kwarg
constexpr ... Kwarg::
operator=
(const T& t) const noexcept
template <typename T, int ID, typename... Args> constexpr bool
kwtest
(Kwarg<T, ID> key, Args... args)
template <typename T, int ID, typename... Args> T
kwget
(Kwarg<T, ID> key, const T& def, Args... args)
This provides a simple implementation of variadic keyword arguments for C++ functions.
Define a Kwarg<T[,ID]>
object for each keyword argument, where T
is the
argument type. The ID
parameter is only needed to distinguish between
keywords with the same argument type. Functions that will take keyword
arguments should be declared with a variadic argument pack, possibly preceded
by ordinary positional arguments.
When calling the function, the keyword arguments should be supplied in the
form key=value
, where key
is a Kwarg
object, and value
is the argument
value. The value type must be convertible to T
. If T
is bool
, the
keyword alone can be passed as an argument, with the value defaulting to
true
.
In the function body, call kwget()
or kwtest()
for each possible keyword
argument, with the corresponding Kwarg
object as the key, a default value
(for kwget()
), and the variadic arguments from the enclosing function. The
kwget()
function returns the value attached to the keyword, or the default
value if the keyword was not found in the argument list; kwtest()
returns
whether or not the keyword was present. If the same keyword appears more than
once in the actual argument list, the first one found will be returned.
Example:
class Window {
public:
static constexpr Kwarg<int, 1> width = {};
static constexpr Kwarg<int, 2> height = {};
static constexpr Kwarg<std::string> title = {};
static constexpr Kwarg<bool> visible = {};
template <typename... Args> explicit Window(Args... args) {
int win_width = kwget(width, 640, args...);
int win_height = kwget(height, 480, args...);
string title_text = kwget(title, "New Window"s, args...);
bool is_visible = kwget(visible, false, args...);
// ...
}
};
Window app_window(Window::title="Hello World", Window::width=1000, Window::height=750, Window::visible);
Everything in this section is under namespace RS::Meta
.
template <template <typename...> typename Archetype, typename... Args> struct
IsDetected
template <template <typename...> typename Archetype, typename... Args> constexpr bool
is_detected
template <typename Default, template <typename...> typename Archetype, typename... Args> struct
DetectedOr
template <typename Result, template <typename...> typename Archetype, typename... Args> struct
IsDetectedExact
template <typename Result, template <typename...> typename Archetype, typename... Args> constexpr bool
is_detected_exact
template <typename Result, template <typename...> typename Archetype, typename... Args> struct
IsDetectedConvertible
template <typename Result, template <typename...> typename Archetype, typename... Args> constexpr bool
is_detected_convertible
Reflection primitives, based on Walter E. Brown's N4502 Proposing Standard Library Support for the C++ Detection Idiom V2.
template <typename T> struct
IsIterator
template <typename T> constexpr bool
is_iterator
= IsIterator<T>::value
iterator_traits
)template <typename T> struct
IsRange
template <typename T> constexpr bool
is_range
= IsRange<T>::value
begin()
and end()
)Iterator and range type detectors.
template <typename Iterator> using
IteratorValue
template <typename Range> using
RangeIterator
template <typename Range> using
RangeValue
These return the types associated with an iterator or range. The iterator
types are are extracted by checking the return type of begin()
, and do not
require a specialization of iterator_traits
to exist. The RangeValue
type
will return Range::value_type
if it exists and is not void
; otherwise it
will obtain the type from a dereferenced iterator.
These are convenience base classes that define members and
operators that would normally just be repetitive boilerplate (similar to the
ones in Boost). They all use the CRTP idiom; a class T
should derive from
Mixin<T>
to automatically generate the desired boilerplate code. The table
below shows which operations the user is required to define, and which ones
the mixin will automatically define. (Here, t
and u
are objects of type
T
, v
is an object of T
's value type, and n
is an integer.)
| Mixin | Requires | Defines |
|---|---|---|
EqualityComparable <T> |
t==u |
t!=u |
LessThanComparable <T> |
t==u, t<u |
t!=u, t>u, t<=u, t>=u |
InputIterator <T,CV> |
*t, ++t, t==u |
t->, t++, t!=u |
OutputIterator <T> |
t=v |
*t, ++t, t++ |
ForwardIterator <T,CV> |
*t, ++t, t==u |
t->, t++, t!=u |
BidirectionalIterator <T,CV> |
*t, ++t, --t, t==u |
t->, t++, t--, t!=u |
RandomAccessIterator <T,CV> |
*t, t+=n, t-u |
t->, t[n], ++t, t++, --t, t--, t-=n, t+n, n+t, t-n, t==u, t!=u, t<u, t>u, t<=u, t>=u |
FlexibleRandomAccessIterator <T,CV> |
*t, ++t, --t, t+=n, t-u, t==u |
t->, t[n], t++, t--, t-=n, t+n, n+t, t-n, t!=u, t<u, t>u, t<=u, t>=u |
In the iterator mixins, CV
is either V
or const V
, where V
is the
iterator's value type, depending on whether a mutable or const iterator is
required.
The first version of RandomAccessIterator
uses the minimal set of user
supplied operations to generate all of those required;
FlexibleRandomAccessIterator
requires more user supplied operations, but
will decay safely to one of the simpler iterator types if an underlying type
does not supply all of the corresponding operations.
In addition to the operators listed in the table above, all iterator mixins supply the standard member types:
using
difference_type
= ptrdiff_t
using
iterator_category
= [standard iterator tag type]
using
pointer
= CV*
using
reference
= CV&
using
value_type
= std::remove_const_t<CV>
template <typename Iterator> struct
Irange
Iterator Irange::
first
Iterator Irange::
second
constexpr Iterator Irange::
begin
() const { return first; }
constexpr Iterator Irange::
end
() const { return second; }
constexpr bool Irange::
empty
() const { return first == second; }
constexpr size_t Irange::
size
() const { return std::distance(first, second); }
template <typename I2> operator Irange<I2>() const noexcept { return {first, second}; }
template <typename Iterator> constexpr Irange<Iterator>
irange
(const Iterator& i, const Iterator& j)
template <typename Iterator> constexpr Irange<Iterator>
irange
(const pair<Iterator, Iterator>& p)
A wrapper for a pair of iterators, usable as a range in standard algorithms.
template <typename InputRange> size_t
range_count
(const InputRange& r)
template <typename InputRange> bool
range_empty
(const InputRange& r)
Return the length of a range. The range_count()
function is just shorthand
for std::distance(begin(r),end(r))
, and range_empty()
has the obvious
meaning.
template <typename T> std::unique_lock<T>
make_lock
(T& t)
template <typename T> std::shared_lock<T>
make_shared_lock
(T& t)
Simple wrapper functions to create a mutex lock.
enum class
ScopeState
ScopeState::
exit
ScopeState::
fail
ScopeState::
success
template <typename F, ScopeState S> class
BasicScopeGuard
BasicScopeGuard::
BasicScopeGuard
() noexcept
BasicScopeGuard::
BasicScopeGuard
(F&& f)
BasicScopeGuard::
BasicScopeGuard
(BasicScopeGuard&& sg) noexcept
BasicScopeGuard::
~BasicScopeGuard
() noexcept
BasicScopeGuard& BasicScopeGuard::
operator=
(F&& f)
BasicScopeGuard& BasicScopeGuard::
operator=
(BasicScopeGuard&& sg) noexcept
void BasicScopeGuard::
release
() noexcept
using
ScopeExit
= BasicScopeGuard<std::function<void()>, ScopeState::exit>
using
ScopeFail
= BasicScopeGuard<std::function<void()>, ScopeState::fail>
using
ScopeSuccess
= BasicScopeGuard<std::function<void()>, ScopeState::success>
template <typename F> BasicScopeGuard<F, ScopeState::exit>
scope_exit
(F&& f)
template <typename F> BasicScopeGuard<F, ScopeState::fail>
scope_fail
(F&& f)
template <typename F> BasicScopeGuard<F, ScopeState::success>
scope_success
(F&& f)
The scope guard class stores a function object, to be called when the guard is destroyed. The three functions create scope guards with different execution conditions. The three named specializations are conveniences for when a scope guard needs to be stored as a movable object.
A scope exit guard calls the function unconditionally; scope success calls it only on normal exit, but not when unwinding due to an exception; scope fail calls it only when an exception causes stack unwinding, but not on normal exit. If the constructor or creation function throws an exception (this is only possible if the function object's move constructor or assignment operator throws), scope exit and scope fail will call the function before propagating the exception, while scope success will not. Any exceptions thrown by the function call in the scope guard's destructor are silently ignored (normally the function should be written so as not to throw anything).
The release()
function discards the saved function; after it is called, the
scope guard object will do nothing on destruction.
constexpr bool
ascii_isalnum
(char c) noexcept
constexpr bool
ascii_isalpha
(char c) noexcept
constexpr bool
ascii_iscntrl
(char c) noexcept
constexpr bool
ascii_isdigit
(char c) noexcept
constexpr bool
ascii_isgraph
(char c) noexcept
constexpr bool
ascii_islower
(char c) noexcept
constexpr bool
ascii_isprint
(char c) noexcept
constexpr bool
ascii_ispunct
(char c) noexcept
constexpr bool
ascii_isspace
(char c) noexcept
constexpr bool
ascii_isupper
(char c) noexcept
constexpr bool
ascii_isxdigit
(char c) noexcept
constexpr bool
is_ascii
(char c) noexcept
These are simple ASCII-only versions of the standard character type functions. All of them will always return false for bytes outside the ASCII range (0-127).
constexpr bool
ascii_isalnum_w
(char c) noexcept
constexpr bool
ascii_isalpha_w
(char c) noexcept
constexpr bool
ascii_ispunct_w
(char c) noexcept
These behave the same as the corresponding functions without the "_w"
suffix, except that the underscore character is counted as a letter instead of
a punctuation mark. (The suffix is intended to suggest the "\w"
regex
element, which does much the same thing.)
constexpr char
ascii_tolower
(char c) noexcept
constexpr char
ascii_toupper
(char c) noexcept
std::string
ascii_lowercase
(std::string_view s)
std::string
ascii_uppercase
(std::string_view s)
std::string
ascii_titlecase
(std::string_view s)
std::string
ascii_sentencecase
(std::string_view s)
Simple ASCII-only case conversion functions. All non-ASCII characters are left unchanged. The sentence case function capitalizes the first letter of every sentence (delimited by a full stop or two consecutive line breaks), leaving everything else alone.
template <typename T> Ustring
bin
(T x, size_t digits = 8 * sizeof(T))
template <typename T> Ustring
dec
(T x, size_t digits = 1)
template <typename T> Ustring
hex
(T x, size_t digits = 2 * sizeof(T))
Simple number formatting functions. These convert an integer to a binary, decimal, or hexadecimal string, generating at least the specified number of digits.
unsigned long long
binnum
(std::string_view str) noexcept
long long
decnum
(std::string_view str) noexcept
unsigned long long
hexnum
(std::string_view str) noexcept
double
fpnum
(std::string_view str) noexcept
The binnum()
, decnum()
, and hexnum()
functions convert a binary,
decimal, or hexadecimal string to a number; fpnum()
converts a string to a
floating point number. These will ignore any trailing characters that are not
part of a number, and will return zero if the string is empty or does not
contain a valid number. Results that are out of range will be clamped to the
nearest end of the return type's range, or for fpnum()
, to positive or
negative infinity.
template <typename C> basic_string<C>
cstr
(const C* ptr)
template <typename C> basic_string<C>
cstr
(const C* ptr, size_t n)
These construct a string from a pointer to a null-terminated character
sequence, or a pointer and a length. They differ from the corresponding string
constructors in that passing a null pointer will yield an empty string, or a
string of n
null characters, instead of undefined behaviour.
template <typename C> size_t
cstr_size
(const C* ptr)
Returns the length of a null-terminated string (a generalized version of
strlen()
). This will return zero if the pointer is null.
Ustring
dent
(size_t depth)
Returns a string containing 4*depth
spaces, for indentation.
template <typename Range> Ustring
format_list
(const Range& r)
template <typename Range> Ustring
format_list
(const Range& r, std::string_view prefix, std::string_view delimiter, std::string_view suffix)
template <typename Range> Ustring
format_map
(const Range& r)
template <typename Range> Ustring
format_map
(const Range& r, std::string_view prefix, std::string_view infix, std::string_view delimiter, std::string_view suffix)
Format a range as a delimited list. The format_list()
function writes the
elements in sequence, with prefix
and suffix
at the beginning and end, and
with a delimiter
between each pair of elements; individual elements are
formatted using to_str()
(see below). The format_map()
function expects
the range's value type to be a pair (or something with first
and second
members); the elements of each pair are separated with the infix
string, and
the range is otherwise formatted in the same way as format_list()
. The
default formats are based on JSON syntax:
format_list(r) = format_list(r, "[", ",", "]")
format_map(r) = format_map(r, "{", ":", ",", "}")
template <typename T> Ustring
fp_format
(T t, char mode = 'g', int prec = 6)
template <typename T> Ustring
opt_fp_format
(T t, char mode = 'g', int prec = 6)
The fp_format()
function performs simple floating point formatting, by
calling snprintf()
. T
must be an arithmetic type; it will be converted to
long double
internally. The additional format 'Z/z'
is the same as 'G/g'
except that trailing zeros are not stripped. The opt_fp_format()
function
calls fp_format()
for floating point types; otherwise it calls to_str(t)
and ignores the other two arguments. These will throw std::invalid_argument
if the mode is not one of [EFGZefgz]
(and is not ignored); they may throw
std::system_error
under implementation defined circumstances.
template <typename S> [string view]
make_view
(const S& s, size_t pos = 0, size_t len = npos) noexcept
Returns a string view over the given string. The string argument may be an
instantiation of std:basic_string
or std::basic_string_view
, or a pointer
to a null terminated character array. The substring bounds are range checked
and clamped to the actual size of the string.
std::string
quote
(std::string_view str)
Ustring
bquote
(std::string_view str)
Return a quoted string; internal quotes, backslashes, and control characters
are escaped. The quote()
function passes non-ASCII bytes through unchanged,
while bquote()
escapes them.
Ustring
roman
(int n)
Formats a number as a Roman numeral. Numbers greater than 1000 will be written
with an arbitrarily long sequence of "M"
. This will return an empty string
if the argument is less than 1.
int64_t
si_to_int
(Uview str)
double
si_to_float
(Uview str)
These parse a number from a string representation tagged with an SI multiplier
abbreviation (e.g. "123k"
). For the integer version, only tags representing
positive powers of 1000 (starting with"k"
) are recognised, and are case
insensitive. For the floating point version, all tags representing powers of
100 are recognised ("u"
is used for "micro"), and are case sensitive, except
that "K"
is equivalent to "k"
. For both versions, a space is allowed
between the number and the tag, and any additional text after the number or
tag is ignored. These will throw std::invalid_argument
if the string does
not start with a valid number, or std::range_error
if the result is too big
for the return type.
Ustring
unqualify
(Uview str, Uview delims = ".:")
Strips off any prefix ending in one of the delimiter characters (e.g.
unqualify("foo::bar::zap()")
returns "zap()"
). This will return the
original string unchanged if the delimiter string is empty or none of its
characters are found.
template <typename T> bool
from_str
(std::string_view view, T& t) noexcept
template <typename T> T
from_str
(std::string_view view)
template <typename T> std::string
to_str
(const T& t)
template <typename T> struct
FromStr
T FromStr::
operator()
(std::string_view s) const
struct
ToStr
template <typename T> std::string ToStr::
operator()
(const T& t) const
Generic utility functions for converting arbitrary types to or from a string.
The conversion rules are described below; to_str()
and the first version of
from_str()
can also be overloaded for new types. The FromStr
and ToStr
function objects call the corresponding functions and do not need to be
separately overloaded.
The first version of from_str()
writes the converted object into its second
argument and returns true on success; otherwise, it returns false and leaves
the referenced object unchanged. The second version calls the first version,
throwing invalid_argument
on failure, and returning the converted object on
success. T
must be default constructible.
The from_str()
functions follow these rules, using the first conversion rule
that matches the type:
T
T
is bool
, check for the strings "true"
or "false"
, otherwise treat as numericT
is a primitive integer or floating point type, call the appropriate strto*()
functionT
is an enumeration defined with RS_ENUM[_CLASS]()
, call its str_to_enum()
functionstatic_cast
from std::string_view
, std::string
, or const char*
to T
T
from a std::istringstream
using operator>>
The to_str()
functions follow these rules, using the first conversion rule
that matches the type:
T
is bool
, return "true"
or "false"
T
is char
, return a one-character stringT
is std::string
or std::string_view
, simply copy the stringT
is [const] char*
, copy the string, or return an empty string if the pointer is nullT
is std::array<uint8_t,N>
or std::vector<uint8_t>
, format each byte in hexadecimalT
is an integer type, call std::to_string(t)
T
is a floating point type, call fp_format(t)
t.str()
, to_string(t)
, or std::to_string(t)
static_cast
from T
to std::string
, std::string_view
, or const char*
T
is derived from std::exception
, call t.what()
T
is a std::optional
, std::shared_ptr
, or std::unique_ptr
, return to_str(*t)
or "null"
T
is a std::pair
or std::tuple
, call to_str()
on each element and return "(e1,e2,...)"
T
is a range whose elements are pairs, call to_str()
on each member of each pair and return "{k1:v1,k2:v2,...}"
T
is a range whose elements are not pairs, call to_str()
on each element and return "[e1,e2,...]"
T
into a std::ostringstream
using operator<<
std::string
demangle
(const std::string& name)
std::string
type_name
(const std::type_info& t)
std::string
type_name
(const std::type_index& t)
template <typename T> std::string
type_name
()
template <typename T> std::string
type_name
(const T& t)
Demangle a type name. The original mangled name can be supplied as an explicit
string, as a std::type_info
or std:type_index
object, as a type argument
to a template function (e.g. type_name<int>()
), or as an object whose type
is to be named (e.g. type_name(42)
). The last version will report the
dynamic type of the referenced object.
class
Version
using Version::
value_type
= unsigned
Version::
Version
() noexcept
template <typename... Args> Version::
Version
(unsigned n, Args... args)
explicit Version::
Version
(const Ustring& s)
Version::
Version
(const Version& v)
Version::
Version
(Version&& v) noexcept
Version::
~Version
() noexcept
Version& Version::
operator=
(const Version& v)
Version& Version::
operator=
(Version&& v) noexcept
unsigned Version::
operator[]
(size_t i) const noexcept
const unsigned* Version::
begin
() const noexcept
const unsigned* Version::
end
() const noexcept
unsigned Version::
major
() const noexcept
unsigned Version::
minor
() const noexcept
unsigned Version::
patch
() const noexcept
size_t Version::
size
() const noexcept
Ustring Version::
str
(size_t min_elements = 2, char delimiter = '.') const
Ustring Version::
suffix
() const
uint32_t Version::
to32
() const noexcept
static Version Version::
from32
(uint32_t n) noexcept
bool
operator==
(const Version& lhs, const Version& rhs) noexcept
bool
operator!=
(const Version& lhs, const Version& rhs) noexcept
bool
operator<
(const Version& lhs, const Version& rhs) noexcept;
bool
operator>
(const Version& lhs, const Version& rhs) noexcept
bool
operator<=
(const Version& lhs, const Version& rhs) noexcept
bool
operator>=
(const Version& lhs, const Version& rhs) noexcept
std::ostream&
operator<<
(std::ostream& o, const Version& v)
A version number, represented as an array of integers optionally followed by a
trailing string (e.g. 1.2.3beta
). The default constructor sets the version
number to zero; the second constructor expects one or more integers followed
by a string; the third constructor parses a string. A string that does not
start with an integer is assumed to start with an implicit zero; if the string
contains any whitespace, anything after that is ignored. Results are
unspecified if a version number element is too big to fit in an unsigned
int
.
The indexing operator returns the requested element; it will return zero if
the index is out of range for the stored array. The major()
, minor()
, and
patch()
functions return elements 0, 1, and 2. The suffix()
function
returns the trailing string element.
The size()
function returns the number of numeric elements in the version
number. This will always return at least 1.
The str()
function (and the output operator) formats the version number in
the conventional form; a minimum number of elements can be requested. The
to32()
and from32()
functions pack or unpack the version into a 32 bit
integer, with one byte per element (e.g. version 1.2.3
becomes
0x01020300
); to32()
truncates elements higher than 255 and ignores the
string element.
Following the common convention that version suffixes are used to designate pre-release builds, versions with a suffix are ordered before the same version without the suffix.


{% extends "partials/tooltips/base.html" %}
{% block title %}
An Agreement
{% endblock %}
{% block inner %}
A written document that sets out how you and your spouse have agreed
to deal with parenting, support, and / or property.
{% endblock %}
{% block label %}
{% if text %}{{ text }}{% else %}an agreement{% endif %}
{% endblock %}


This page uses shiny features which require Flash 9. The default config uses Flash 8.
You can also try enabling experimental visualization features.
Don't want a Flash 9 requirement, EQ/waveform, perhaps less CPU? See Flash 8-based basic demo.
Clicking a title will start loading + playing, or pause, a sound.
Once loading, click (or click and drag) on the loading/position bar to seek within the sound.
The document title reflects the currently-playing sound, and by default the list will play sequentially if left alone. (This is configurable.)
Just for fun, a few color schemes (visible when playing/paused):
A potential approach to noting interesting moments in sounds, scene changes, new tracks in seamless DJ mixes etc. Keep in mind this is a single MP3 being loaded, but annotations are placed along the timeline as shown.
A "metadata" element contains a nested list of data (UL/LI combination) - in this case, a summary of each scene - and the time at which this item occurs/begins. In order to help with positioning, the total length of the sound is also specified up-front. View the source code of this page for the details.
This example uses SoundManager 2 to find links to MP3 files within an unordered list, and makes them playable "in-place" on a page. The script assigns CSS classes to links' parent LI nodes to indicate their state (playing/paused, etc.)
This provides a nice HTML base for all browsers and user agents, and enhances progressively for those with Javascript and Flash. Links pointing to MP3s are assigned an onclick handler which intercepts the click (preventing the browser from following the link and unloading the page. SM2 will then create sound objects as needed to play the MP3s. In the event there is an error at runtime or a lack of support (no JS/Flash etc.), the browser will simply load the MP3s directly as it normally would. This includes iPhones, etc.
Each item in the playlist has its own set of controls and progress indicators, etc. This content is defined once as a hidden template of HTML in the player JavaScript file, separate from the playlist markup, and is cloned for each item as needed. This can be easily styled with CSS as well, of course.
See this basic demo for reference.
The basic demo uses the default Flash 8 configuration, but you can easily change this to use Flash 9 features. The only difference in code is the configuration.
A reminder that if loading from the local filesystem, Flash will deny access to remote (network/internet) URLs by default unless whitelisted via the Flash Player Global Security Settings Page. Some URLs in this example are remote to demonstrate this.
Behaviours such as auto-start and UI elements like VU meters and spectrum graphs are easy configurable, using an object literal format as shown below.
The page player config (see related page-player.js file) as below.
The custom parameters used to make this demo page are highlighted in red.
// ( within page-player.js )
soundManager.flashVersion = 9; // If you need flash 9, include this line.
this.config = {
usePeakData: true, // [Flash 9 only] show peak (VU-meter) data
useFavIcon: true, // try to show peakData in address bar (Firefox + Opera) - requires usePeakData = true too, of course.
useWaveformData: true, // [Flash 9 only] true: show raw waveform data - WARNING: CPU-intensive
useEQData: false, // [Flash 9 only] show EQ (frequency spectrum) data - WARNING: CPU-intensive
fillGraph: false, // [Flash 9 only] draw full lines instead of only top (peak) spectrum points
allowRightClick:true, // let users right-click MP3 links ("save as...", etc.) or discourage (can't prevent.)
useThrottling: false, // try to rate-limit potentially-expensive calls (eg. dragging position around)
autoStart: false, // begin playing first sound when page loads
playNext: true, // stop after one sound, or play through list until end
updatePageTitle: true, // change the page title while playing sounds
emptyTime: '-:--' // null/undefined timer values (before data is available)
}
Alternately, you may override the defaults on a per-page basis by defining an "alternate configuration" object before the page-player.js file has been included in your source code:
// ( before soundManager.onready()/onload() have fired )
soundManager.flashVersion = 9; // If you need flash 9, include this line.
var PP_CONFIG = {
usePeakData: true, // [Flash 9 only] whether or not to show peak data (no notable CPU cost)
useWaveformData: true // [Flash 9 only] show raw waveform data. WARNING: Experimental, likely CPU-heavy
}
Any options specified in PP_CONFIG will override the defaults defined in page-player.js.
If you want to make your own UI from scratch, here is the base: ul.playlist {} Default + hover state, "click to play": li.sm2_link {} li.sm2_link:hover {} Playing + hover state, "click to pause": li.sm2_playing {} li.sm2_playing:hover {} Paused + hover state, "click to resume": li.sm2_paused {} li.sm2_paused:hover {}
The positioning (load status / control bar) template is also applied after each MP3 link, from an element named "control-template"
"loading" and "position" have background colors applied, and have their width adjusted dynamically by SM2 as the sound(s) load/play. "timing" is replaced with the current time / duration, eg. 1:23 / 4:20
The class names applied can be edited within the source JS also, for convenience.
The controls are shown and hidden via the same dynamic CSS updates. See the source CSS for the timing / status bar layout.
The VU meter "favicon" option as shown in the address/location bar for Firefox and Opera can cause a lot of disk access in Firefox (2.x/3.0 at time of writing, from what has been reported.) It may be garbage collection-related.
The behaviour seems to be connected to the dynamic swapping of <link> elements with data: URIs containing the VU meter data, and looks to be noticeable with the first sound played - after which point things settle down. Perhaps the browser is attempting to cache the favicon data being assigned.
Enabling the waveformData and/or eqData features will result in some heavy DOM calls (manipulation of 256
 elements with each "frame" drawn) which can eat up a good amount of CPU and may make really old computers cower in fear.
Ultimately, the UI refresh rate will simply be limited if a CPU ceiling is hit, and audio playback should not be affected.
SoundManager 2: "page as playlist" example ------------------------------------------ Clicks on links to MP3s are intercepted via JS, calls are made to SoundManager to load/play sounds. CSS classes are appended to the LI parent, which are used to highlight the current play state and so on. Class names are applied in addition to "sm2_link" base. Default: sm2_link Additional states: sm2_playing sm2_paused eg.
some.mp3

some.mp3
 The script also injects an HTML template containing control bar and timing elements, which can also be targeted with CSS. Note you don't necessarily require ul.playlist for your use if only using one style on a page. You can just use .sm2_link and so on, but isolate the CSS you want. Side note: Would do multiple class definitions eg. li.sm2_default.sm2_playing{} .. except IE 6 has a parsing bug which may break behaviour, applying sm2_playing {} even when the class is set to sm2_default. If you want to make your own UI from scratch, here is the base: Default + hover state, "click to play": li.sm2_link {} li.sm2_link:hover {} Playing + hover state, "click to pause": li.sm2_playing {} li.sm2_playing:hover {} Paused + hover state, "click to resume": li.sm2_paused {} li.sm2_paused:hover {}