SHANGHAI NOON A film review by Steve Rhodes Copyright 2000 Steve Rhodes RATING (0 TO ****): ***
A kidnapped princess, 100,000 pieces of gold and Jackie Chan's exhilarating stunts: if you think that these sound like the perfect ingredients for a high old-time at your local cinema, you're right. As they say in commercials, "But wait, there's more!"
Based on an idea of Jackie's, SHANGHAI NOON, directed by Tom Dey, is set in the Old West. Expanding on Jackie's story outline, Miles Millar and Alfred Gough's hilarious script starts in the Forbidden City before it heads for the Chinese mining camps in Nevada in 1881. (This permits the story to subtly but effectively explore the rampant racism in that period in our history.)
Last, but not least, Jackie is perfectly matched with Owen Wilson, as a sidekick who can best be thought of as the anti-Jackie. Owen's character is as unsure and lazy as Jackie's character is bold and energetic. Hands down, however, Owen gets almost all of the best lines.
Owen plays Roy O'Bannon, a robber who couldn't shoot the broadside of the proverbial barn and who would rather spend his time with the ladies anyway. (When Roy finds his mug on a wanted poster, he goes wild with delight. "It'll drive the girls crazy!" he declares, barely able to control his excitement.) His ladies are all women in red who occupy a bordello so chaste that it could appear in a PG-rated picture. (SHANGHAI NOON is a mild PG-13.)
Jackie plays Chon Wang, an Imperial Guard who is sent to America as part of a contingent sent to deliver 100,000 pieces of gold as a ransom for a kidnapped Chinese princess. Through a series of misadventures, Chon ends up partnering with Roy. The two try to make themselves into a couple of tough Western dudes so they can rescue the princess. When Roy finds out how Chon Wang's name is pronounced, he laughs. "John Wayne -- that's a terrible cowboy name," Roy tells Chon. "That's not going to work."
Well, something that certainly does work is the chemistry between these two charming actors. Even if their characters are opposites, their eventual friendship is as genuine as is the rough road to it. Acting a bit like Mel Gibson -- the writers collaborated on Mel's LETHAL WEAPON 4 -- Roy doesn't leave all of the physical antics to Chon. "I don't know karate, but I know crazy, and I will use it," Roy explains.
As always, Jackie dazzles the audience with his good-spirited stunts that are choreographed with ballet precision. With his baby-faced looks and his broad smile, he would be a hard actor not to love. And when he gets hurt, as he often does while doing his own stunts, you can truly feel his pain. In every movie he manages to find fresh approaches to the fighting sequences. This time he wields everything from moose horns -- sans moose -- to a horseshoe on a rope.
It is perhaps a little know facet of Jackie's oeuvre, but Jackie is just as funny when he isn't showing off his athletic dexterity. SHANGHAI NOON's funniest sequence -- even more so than the wonderful outtakes -- has Chon and Roy taking a bubble bath in adjoining tubs. They ham it up singing a drinking song that it is side-splittingly funny.
As the resilient Princess Pei Pei (you can guess how her name can be mispronounced), Lucy Liu is underutilized but still manages to give her character an inner spark. In a variation on a shotgun marriage, Chon ends up with a wife through a peace pipe marriage. Native American model Brandon Merrill plays Falling Leaves, Chon's new sharpshooter wife.
The movie's delights don't end with the acting and the script. Thanks to Daniel Mindel's lush cinematography and Randy Edelman's old-fashioned western film music, the movie is a real treat for the eyes and ears. A thoroughly enjoyable film, it is (arguably) Jackie's best movie ever.
SHANGHAI NOON runs a fast 1:45. It is rated PG-13 for action violence, some drug humor, language and sensuality and would be fine for kids around 8 and up.
My son Jeffrey, age 11, adored the movie, awarding it a full ****. He said that he thought it "was really funny, yet in a cool sense." His favorite character was Roy.
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


| HYTOOL Function Reference |
Computes drawdown with Agarwal et al. (1970) solution in the aquifer
s = aga_dim(p,t) p(1) = a : slope of the late time Jacob's straight line in m p(2) = t0 : intercept with the horizontal axis for s = 0 p(3) = sigma : skin factor t = time in seconds s = drawdown in meters
Computes drawdon in the aquifer for a constant rate pumping test in a large diameter well with skin effect. The aquifer is confined and homogeneous. The skin factor is equal to: sigma = (T-Ts)/Ts * log( rs / rw ) with: T = transmissivity of the aquifer Ts = transmissivity of the skin (perturbed zone around the well) rs = radius of the skin (from the center of the well) rw = radius of the well screen Warning: The function can be used only if aga_pre has been called before to provide the radius of the well, casing, etc. Reference: Agarwal, RG, R Al-Hussainy and HJ Ramey, 1970, An investigation of wellbore storage and skin effect in unsteady liquid flow. SPE Journal: 279-290
s=aga_dim(p,t);
aga_dmo, aga_pre, aga_rpt, aga_gss Published output in the Help browser showdemo aga_dim
| Hytool |
© 1998-2017 Philppe Renard and Co. Terms of Use Acknowledgments


Sharing what you 👁see and know🧠/feel💔 about animals and plants.
Remixing via black-out poetry and macrophotography/ipad drawing
What do you think makes a good children's story?
Buddy up and 'read' 2 books to each other & write down 3 things from each story that you like and don't like
With images we draw on ipad or macro photographs we take...we're adding black out poetry (or direct quotes, or something else, etc.) and HTML/CSS to make digital children's stories
Deschooling Story
Eating Animals: Knowing & Feeling
snail eyes from Molly Josephs on Vimeo.
in the pantry from Molly Josephs on Vimeo.
This Teenage Life Web Art
Notorious B.I.G: Mo Money Mo Problems
W/ your photos & drawings we'll combine with words (e.g. black-out poetry, direct quotes, etc.)
As we remix words we'll combine them with images we create to make a new kind of story — see commaful
Macrophotography Scavenger Hunt on the 14th floor
Take a photo of something that's:
"Just keep swimming."
"What, darling?! Speak up!"
Stegosaur in Cambridge!
What makes them good/bad?
Go here: bit.ly/hackathon2020-slides


back to list
{{serviceDetails.service.name}}
edit
Site is Up!


1 Now the twelve kings were just, and in time came to sacrifice in Hephaestus' temple. On the last day of the feast, as they were about to pour libations, the high priest brought out the golden vessels which they commonly used for this; but he counted wrongly and had only eleven for the twelve.
2 So the last in line, Psammetichus, as he had no vessel, took off his bronze helmet and held it out and poured the libation with it. All the kings were accustomed to wear helmets, and were then helmeted;
3 it was not in guile, then, that Psammetichus held out his headgear; but the rest perceived what Psammetichus had done, and remembered the oracle that promised the sovereignty of all Egypt to whoever poured a libation from a vessel of bronze; therefore, though they considered Psammetichus not deserving of death (for they examined him and found that he had acted without intent), they decided to strip him of most of his power and to chase him away into the marshes, and that he was not to concern himself with the rest of Egypt.


{% extends "app/layout1.html" %} {% block content %} YOU HAVE SUCCESSFULLY LOGGED OUT ! {% endblock %}


Names
*
First
Last
Email
*
Your Experience
*
Overall, how would you experience with us?
How satisfied are you with
*
Very unsatisfied
Unsatisfied
Neutral
Satisfied
Very Satisfied
Purchase
Service
Company Overall
How likey are you to
*
Very Unlikely
Unlikely
Neutral
Likely
Very Likely
Buy from us again
Recommend our product to others
Recommend our company to others
Additional comments or suggestions
Submit


UK: Pop up Pokemon Center returning to London for 2020 Pokemon World Championships
by My Nintendo News AdminFollowing the success of the recent Pokémon Center London pop up store at Westfield London that saw more than 30,000 visitors over its four-week opening, fans will have another opportunity to purchase a range of Pokémon merchandise thanks to a new store on the site for the duration of the 2020 Pokémon World Championships.
Taking place in London next summer at a venue yet to be announced, the Pokémon World Championships is the premier tournament for Pokémon video games and the Pokémon Trading Card Game.
Source: The Pokemon Company


Pick a Size
Pick a Pizza
Select Crust
Select Sauce
Select Cheese Intensity!
Customize Your Toppings!
Your {{preset}} is done!
Your {{size}} {{crust}} pizza has {{$value}}, {{sauce}}, and {{cheese}}.
Once you are finished with that slice...
Your {{size}} {{crust}} pizza has {{$value}}, {{sauce}}, and {{cheese}}.
Once you are finished with that slice...


To add walls, press the w key and then select a grid location to add the wall
Note: When you start the editor, the wall selection tool is enabled by default
To add packages, press the p key and then select a grid location to add the package
Enter your colour and ID - make sure your ID matches the ID of the goal that you need to get the package to!
To add goals, press the g key and then select a grid location to add the package
Enter your colour and ID - make sure your ID matches the ID of the packages that you need to get the goal!
To add spawners, press the s key and then select a grid location to add the spawner
Enter your colour and ID - make sure your ID matches the ID of the packages that you need to get the goal!
You also need to specify the direction you want to spawn packages in, the number of packages to spawn and the ticks between each package spawning (frequency)
To delete items, simply click the item and it will turn red. You can then press the d key to delete it
To test your game, simply click test level and a new tab will open where you can play your level
Note: Your level is stored in your original tab - don't close it or you will lose your work!
To save your level simply click the save button, enter a name and click create. Your level will be saved in a new tab
Note: If you do not choose a unique level name then your level will fail to save and you will have to try again
X: Y:
Direction to spawn boxes in:
Colour (RGB 0-255): R G B
ID:
Number of boxes to spawn:
Frequency of spawner (ticks between boxes spawning):
X: Y:
Colour (RGB 0-255): R G B
ID:
X: Y:
Colour (RGB 0-255): R G B
ID:


Johnny-Five has been tested with a variety of Arduino-compatible Boards. For non-Arduino based projects, platform-specific IO Plugins are available. IO Plugins allow Johnny-Five code to communicate with any hardware in whatever language that platform speaks!
<%= contents %>


Sir John A Mcdonald Sr PS.
Graduatating 2019
CCC 45/75 : Junior
Top 15 : DMPG Silver
Gold rated on HackerRank
Intermediate Certificate in Python
Valedictorian of Graduatating Class
C++
Node.js
Web Development
Python with API


How can they be effective - moving quickly through
How
Exploratory experimentation
Tools covered
UI Design - Moqups, Sketch
Web - git, Less, SASS, Gulp, Grunt, npm, bower, Bootstrap, Foundation
Experimentation - Processing
I am
Code for Australia Fellow
Full Stack Developer
Sound Art Tinkerer
What is iterative design
How can iteration be useful
Where have I used iteration
How do I utilise these principles
I'm going to spend some time giving you a broad look at how I utilise these ideas in UI Design, functional prototyping and [slightly more exploratory digital design].
Iteration in action
Show some examples of my iterations through designs
UnderCurrents
Fellowship tracker
How I rapidly move through each stage
Starting the point where you've done your user research and you want to start building your solution
UI Design
I'm not a visual artist, so I prefer to start digitally instead of paper
If i'm totally lost on what I want to acheive I'll start from paper, so I dont waste time pushing pixels
Today i'll focus on responsive UIs - I won't cover mobile specific UIs
A little bit of thought put into your ui up front will save you a lot of time in implementation


The code shown in this tutorial can be executed by running pyGPs/Demo/demo_GraphKernel.py
MUTAG [1] is a data set of 188 mutagenic aromatic and heteroaromatic nitro compounds labeled according to whether or not they have a mutagenic effect on the Gram-negative bacterium Salmonella typhimurium. MUTAG is a simple but popular dataset to benchmark graph kernels.
data = np.load('MUTAG.npz')
A = csc_matrix( (data['adj_data'], data['adj_indice'], \
data['adj_indptr']), shape=data['adj_shape']) # n x n adjancy array (sparse matrix)
gr_id = data['graph_ind'] # n x 1 graph id array
node_label = data['responses'] # n x 1 node label array
graph_label = data['labels'] # N x 1 graph label array
Note that adjacency matrix for all graphs is usually too big to fit into memory when using . Therefore, we generate using sparse matrix csc_matrix provided by scipy.
Propagation kernels [2] are recently introduced fast and flexible graph kernels. Generate prapagation kernel based on given graph data.
num_Iteration = 10
w = 1e-4
dist = 'tv' # possible values: 'tv', 'hellinger'
K = graphKernels.propagationKernel(A, node_label, gr_id, num_Iteration, w, dist, 'label_diffusion')
Adjacency matrix can either be in format of standard numpy matrix or sparse matrix.
is a big square matrix with all rows and columns of the number of data points. By specifying the indice of training data and test data, we will form two matrix M1 and M2 with the exact format which pyGPs.Core.cov.Pre needed.
M1,M2 = graphUtil.formKernelMatrix(Matrix, indice_train, indice_test)
k = pyGPs.cov.Pre(M1,M2)
The following is the standard way to do GP classification
model = pyGPs.GPC()
model.setPrior(kernel=k)
model.getPosterior(x_train, y_train)
model.predict(x_test)
| [1] | Debnath, A., Lopez de Compadre, R., Debnath, G., Shusterman, A., and Hansch, C.. Structure-activity relationship of mutagenic aromatic and heteroaromatic nitro compounds. Correlation with molecular orbital energies and hydrophobicity. J. Med. Chem., 34:786–797, 1991. |
| [2] | Neumann, M., Patricia, N., Garnett, R., Kersting, K.: Efficient Graph Kernels by Randomization. In: P.A. Flach, T.D. Bie, N. Cristianini (eds.) ECML/PKDD, Notes in Computer Science, vol. 7523, pp. 378-393. Springer (2012). |


Chamonix-Mont Blanc Part I Tweet
Southern Luzon and Western Visayas
Ever since I was a kid, my favorite thing to do to clear my head was either to bike or walk around. On extreme cases, I would ride a jeepney or a bus to travel farther. I would get to Los Baños, Nagcarlan or Dolores (Quezon) and sometimes Manila. I’ve done this since I was 12. I usually had the freedom to do this and not really ask permission. Adults weren’t really around the house. I’d get money from my piggy bank. I’ve always tried to save a little bit of money. (Now that am older am aware that being able to save is a privilege).
The farthest unplanned travel though was getting on a bus from Cubao and landing on the island of Boracay. That took 24+ hours. The bus would roll on and roll off in ships and so will we passengers. So the mode of transportation is called RORO.
When the weather isn’t excellent RORO travel makes me sick.  One time I didn’t have a jacket. Each time we’d hop off at a port, I’d get really excited because we’d get a respite from the dizzying waves. And the most beautiful thing is, there are no city lights so you’d see the Milky way at some places. Or at least I thought I saw it. :)
Anyway, what I missed most about the Philippines is cheap public transportation and I could get anywhere I wanted to go without having to bug anyone for a ride.
Chamonix-Mont Blanc
In 2015, I would see a white mountain from the window of my room at Building 38 at CERN. On the other side I would see the Jura mountains which straddles the border of Switzerland and France. The Jurassic period is named after it. It’s always so pleasant to be at the Meyrin site at CERN because of the views.
When I arrived in January, the first thing I did was take photos of them. I took photos of them in the morning when I get out of my room. I take photos at night. And when I moved to Charmilles, I’d go to the areas where’d they’d always be within view. They’re always there. And the pleasant feelings win over everything. :) I wish I could reincarnate as a mountain goat to live there!
It took me 5 more months to be able to get to Chamonix. The borders just reopened and I took the chance. There was no one in the bus and the long lines at the telepherique to Aiguille du Midi were not there. I decided not to climb all the way to the top of Aiguille du Midi because the visibility was poor at the top. I just stopped at Plan de l’Aiguille to hike. After training my legs with shorter hikes, I’m quite happy to see how much progress my leg has made.  But am pretty impressed myself! And the funnest part was I used some wall climbing techniques to climb the huge boulders whenever I see the hiking tracks suddenly disappear.
I sat down for a bit at the side of Lac Bleu. I took photos of the glaciers and then continued my hike. Six hours in the mountains I’ve decided to take a break again and sit on a huge boulder. I wrote a bit in two little notebooks I had brought with me. I wanted to stay there. I didn’t want to go back to a place that was so noisy. I didn’t want notifications. I didn’t want the internet.
So when I decided to get down, I turned on airplane mode so I won’t pick up wifi signals. I left my bag at my room, walked around Chamonix and read a book at various spots. Chamonix is one of the most beautiful places I’ve ever been to. If you are lucky and the clouds part, Mont Blanc would reveal itself. The sun rays and it’s white majestic glory would tower over the charming little town. I was lucky it did for a few hours while I was walking by the river Arve. This place for me would always be special.
Think Simple, the unplanned and what matters most
All these trips had one thing in common. They were unplanned and they were the most memorable trips I’ve ever had. They all came at a time when I didn’t really want to think complex things. I just wanted and needed to clear my head and do whatever I felt like doing. My life has so much planning and schedules it’s to once in a while break free.
My therapist told me last Wednesday, “think simple”. I smiled and told him that I can see that my brain has been jumbling a lot of thoughts lately. But I had to go out of the door because he had a new person at 6:30 pm. I had a lot of questions for him. I even wanted to argue with him. I wanted to tell him, “But I’m in the business of complex problems”. I don’t really want your advice, I just need you to listen to me. And I wanted to tell him that “think simple” without any context is a dangerous advice. “Think Simple” is what elected Donald Trump! “Think simple” is letting in implicit biases! “Think simple” is letting go of nuances! “Think simple” means you can’t live with ambiguity, doubt and uncertainty! And the world is nothing but uncertain!
Furthermore, I wanted to tell him these things:
1.) “Simplicity isn’t just a visual style. It’s not just minimalism or the absence of clutter. It involves digging through the depth of the complexity. To be truly simple, you have to go really deep. For example, to have no screws on something, you can end up having a product that is so convoluted and so complex. The better way is to go deeper with the simplicity, to understand everything about it and how it’s manufactured. You have to deeply understand the essence of a product in order to be able to get rid of the parts that are not essential” - Jon Ive and Steve Jobs’s Minimalist philosophy
2.) And this interview with Alain de Botton and founder of the School of Life Series in youtube. He talks about how dissects complex emotional issues.  To be a minimalist, to be simple, you have to go explore the complex and then will you only figure out what is essential to keep. , that simple equation didn’t just simply pop out of the “ether”.
But at the mountains, I had realized something… I had added this extra piece of thought into my therapists’ advice. So it fits in into my mental schema. “Think simple” is a recognition of the limits of our own minds.” That it is not an infinitely powerful machine capable of holding multiple and seemingly contradicting realities at the same time, ALL THE TIME. I’m a human being. And I am “sick”. I have a diagnosis. If I don’t allow myself to rest from digging into complex things, I can mix things up. I can get sad, I can break and become dysfunctional. That is the worst sign of all. Because even when I am plagued with problems, I do not stop functioning. It is this breaking that instigated these unplanned trips. And in these unplanned trips I recover myself.
(Magnus Carlsen, is also known by his opponents to make annoyingly simple moves in his games. And he also doesn’t train much with computers to memorize variations and complex openings. My guess is that he is aware of how the human mind works. It’s not a database of algorithms and moves. It’s not as powerful as modern-day computers. And he trains himself physically. That helps with pressure and together with deliberate chess training, improves his intuition. This makes him special even if they’re rather simple training methods anyone could do.
I’m a little older now so these episodes happen less frequently and I am quicker to recalibrate and have a more peaceful inner world. I’ve finally told people at work and some friends, hey, “I just had a divorce, there were some medical issues, among other things I don’t need to say here… there is something wrong, I would act a little strange for a while. Could you please let me be a little strange?”.
“Think simple”, at least for me doesn’t mean “think simple” ALL the time. I would still look at complex and interesting problems, take a break - a real break and eventually sort things out. I will write about my progress in the coming days when I feel a little less weird.


Home
Sales Predictor
Production Planner
Production Planner
{% for item in data[0]%}
{{item}}
{% endfor %} {% for item in data[1]%}
{{item}}
{% endfor %}


Revision 76 of mycheckpoint comes with quite a few improvements, including:
- OS monitoring (CPU, load average, memory)
- Auto-deploy
- Improved charting
- Brief HTML reports
- 24/7 charts
OS Monitoring
When monitoring the local machine, mycheckpoint now monitors CPU utilization, load average, memory and swap space.
This only applies to the Linux operating system; there is currently no plan to work this out for other operating systems.
Examples:
mysql> SELECT os_cpu_utilization_percent FROM sv_report_chart_sample;
mysql> SELECT ts, os_loadavg FROM mycheckpoint.sv_report_sample; +---------------------+------------+ | 2009-12-27 11:45:01 | 1.78 | | 2009-12-27 11:50:01 | 2.48 | | 2009-12-27 11:55:01 | 2.35 | ... +---------------------+------------+
mysql> SELECT report FROM mycheckpoint.sv_report_human_sample ORDER BY id DESC LIMIT 1 \G *************************** 1. row *************************** report: Report period: 2009-12-27 13:20:01 to 2009-12-27 13:25:01. Period is 5 minutes (0.08 hours) Uptime: 100.0% (Up: 334 days, 06:37:28 hours) OS: Load average: 1.67 CPU utilization: 25.2% Memory: 7486.4MB used out of 7985.6484MB (Active: 6685.8906MB) Swap: 3835.2MB used out of 8189.3750MB ...
Auto-deploy
mycheckpoint now has a version recognition mechanism. There is no need to call mycheckpoint with the "deploy" argument on first install or after upgrade. mycheckpoint will recognize a change of version and will auto-deploy before moving on to monitoring your system.
It is still possible, though, to use "deploy", in case you just want to make sure an upgrade takes place, without issuing a monitoring action.
Improved charting
Further improvements and bug fixes made to the Google charts, including the implementation of missing values charting.
Brief HTML report
In contrast with the full blown HTML report (see sample), which presents hourly/daily/weekly reports for the many metrics, the new brief report only presents with a few hourly based charts. These include InnoDB performance, DML, OS metrics, and replication status.
To get a brief HTML report, issue:
See sample brief HTML report.mysql> SELECT html FROM sv_report_html_brief;
24/7 charts
24/7 charts present the various metrics on a 24x7 matrix, which allows for diagnostics of usage throughout the day and week. For example, it makes it easier to see how things slow down on Saturday/Sunday; how load increases on 10:00am every day, etc. 24/7 charts are provided by the sv_report_chart_24_7 view.DESC sv_report_chart_24_7; +---------------------------------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------------------------------+----------+------+-----+---------+-------+ | innodb_read_hit_percent | longblob | YES | | NULL | | | innodb_buffer_pool_reads_psec | longblob | YES | | NULL | | | innodb_buffer_pool_pages_flushed_psec | longblob | YES | | NULL | | | innodb_os_log_written_psec | longblob | YES | | NULL | | | innodb_row_lock_waits_psec | longblob | YES | | NULL | | | mega_bytes_sent_psec | longblob | YES | | NULL | | | mega_bytes_received_psec | longblob | YES | | NULL | | | key_read_hit_percent | longblob | YES | | NULL | | | key_write_hit_percent | longblob | YES | | NULL | | | com_select_psec | longblob | YES | | NULL | | | com_insert_psec | longblob | YES | | NULL | | | com_delete_psec | longblob | YES | | NULL | | | com_update_psec | longblob | YES | | NULL | | | com_replace_psec | longblob | YES | | NULL | | | com_set_option_percent | longblob | YES | | NULL | | | com_commit_percent | longblob | YES | | NULL | | | slow_queries_percent | longblob | YES | | NULL | | | select_scan_psec | longblob | YES | | NULL | | | select_full_join_psec | longblob | YES | | NULL | | | select_range_psec | longblob | YES | | NULL | | | table_locks_waited_psec | longblob | YES | | NULL | | | opened_tables_psec | longblob | YES | | NULL | | | created_tmp_tables_psec | longblob | YES | | NULL | | | created_tmp_disk_tables_psec | longblob | YES | | NULL | | | connections_psec | longblob | YES | | NULL | | | aborted_connects_psec | longblob | YES | | NULL | | | threads_created_psec | longblob | YES | | NULL | | | seconds_behind_master | longblob | YES | | NULL | | | os_loadavg | longblob | YES | | NULL | | | os_cpu_utilization_percent | longblob | YES | | NULL | | | os_mem_used_mb | longblob | YES | | NULL | | | os_mem_active_mb | longblob | YES | | NULL | | | os_swap_used_mb | longblob | YES | | NULL | | +---------------------------------------+----------+------+-----+---------+-------
Example:
mysql> SELECT com_select_psec, innodb_buffer_pool_pages_flushed_psec FROM mycheckpoint.sv_report_chart_24_7 \G
Trying mycheckpoint
- Get mycheckpoint from the mycheckpoint Google Code project page.
- Read the documentation.
- Report issues!
Future plans
I haven't got any major immediate issues; planning on user customization of charts and HTML reports. Considering thresholds and alerting for the future.
comments powered by Disqus


Fill the form to create your account for training.
Accept our Terms & Privacy Policy to create your account.


Don’t have an account? Sign Up Free!
Forgot password?
I agree to the privacy policy and terms of service.
Fill in your e-mail address below and we will send you an email with further instructions.


Git
Hut
Visualizing programming languages in GitHub
Which languages are trending more?
Trending programming languages in active GitHub repository
#
%


--- layout: post authors: ["Greg Wilson"] title: Things Are Going Well in Texas on Ada Lovelace's Birthday date: 2012-12-10 time: "09:00:00" tags: ["University of Texas - Austin"] ---


public class ZipStream extends CompressedStream
| Modifier and Type | Field and Description |
|---|---|
static int |
DEFLATED
Compression method for compressed (DEFLATED) entries.
|
static int |
STORED
Compression method for uncompressed (STORED) entries.
|
compressedStream, DEFLATE, INFLATE, mode
skipBuffer
| Constructor and Description |
|---|
ZipStream(RandomAccessStream stream,
int mode)
Creates a new ZIP stream that may be used to read compressed data from the given stream, or to write compressed
data to the given stream.
|
| Modifier and Type | Method and Description |
|---|---|
int |
available()
Returns 0 after EOF has reached for the current entry data, otherwise always return 1.
|
void |
close()
Closes this stream WITHOUT closing the underlying stream, which must be explicitly closed by the user.
|
void |
closeEntry()
Closes the current ZIP entry and positions the stream for reading (INFLATE) or writing (DEFLATE) the next entry.
|
protected Object |
createDeflate(Stream stream) |
protected Object |
createInflate(Stream stream) |
ZipEntry |
getNextEntry()
Reads the next ZIP file entry and positions the stream at the beginning of the entry data.
|
void |
putNextEntry(ZipEntry entry)
Begins writing a new ZIP file entry and positions the stream to the start of the entry data.
|
finalize, readBytes, writeBytes
asInputStream, asOutputStream, asStream, asStream, skipBytes, wrapInputStream, wrapInputStreamToStream, write, writeBytes, writeBytes, writeBytes
public static final int STORED
public static final int DEFLATED
public ZipStream(RandomAccessStream stream, int mode)
stream
- input stream.mode
- its value must be either DEFLATE or INFLATE.protected Object createDeflate(Stream stream)
createDeflate
in class CompressedStream
protected Object createInflate(Stream stream)
createInflate
in class CompressedStream
public int available() throws IOException
IOException
- if an I/O error occurs.public ZipEntry getNextEntry() throws IOException
IOException
- if an I/O error has occurredpublic void putNextEntry(ZipEntry entry) throws IOException, ZipException
entry
- the ZIP entry to be writtenIOException
- if an I/O error has occurredZipException
public void closeEntry() throws IOException, ZipException
IOException
- if an I/O error has occurredZipException
public void close() throws IOException
CompressedStream
close
in interface java.io.Closeable
close
in interface totalcross.lang.AutoCloseable
close
in class CompressedStream
IOException
- If an I/O error occurs.


The best virtual pizzas in Seattle since 2017!
Welcome to the Pizzararium! We serve fresh, delicious, virtual pizzas, delivered right to your browser window!


This example demonstrates the basic usage of Infovyz's line chart. The following line initializes the line chart and attaches it to DOM element #linechart.
var linechart = infovyz.linechart(d3)('#linechart');
To display some data, just call linechart() with the data as an argument:
linechart(data);
Calling linechart() without arguments will re-render the existing linechart and will for example take into account an updated size of the wrapper DOM element.
Here's the full example:


Morning top 5: Sinn Féin Ard Fheis; Dublin arrests; and Hong Kong protests
by NewsroomSinn Féin would demand a border poll if it was to be part of any proposed coalition after the next election.
Mary Lou McDonald told her party's Ard Fheis last night that a vote on Irish unity needs to happen within five years.
She also made pre-election promises to make childcare, education and rent cheaper.
****
Two men remain in custody after the gardaí foiled another possible gangland murder in Dublin.
Armed officers searched a house in Clondalkin on Friday and found a loaded gun and bullets.
The findings are linked to the Kinahan-Hutch feud, which has resulted in more than 20 killings in the past four years.
****
World Day of Remembrance For Road Traffic Victims is being marked around the globe today.
It is a day when commemorations take place to remember those injured or killed in road traffic collisions.
The Road Safety Authority held an event here last week to remember the 24,390 people killed on Irish roads, since records began.

Virginia Roberts-Giuffre says she met the Duke of York at a nightclub in London before they slept together in 2001.
Speaking to BBC's Newsnight, he categorically denied Mrs Roberts-Giuffre's accusations and also said he didn't regret his friendship with the convicted sex offender Jeffrey Epstein - who died in prison earlier this year.
****
Hong Kong police say one of their media liaison officers was hit in the leg by an arrow in a standoff with anti-government protesters around a barricaded university.
Activists threw petrol bombs - some of them by catapult - and shot arrows with bows at police.
They responded with tear gas and water cannon at the Polytechnic University in Kowloon.


Jar
Make a jar to appreciate a friend or family member. Fill it with their special qualities that makes them unique.
Chores
Help out your parents with chores unexpectedly. This way they don't have to stress about house chores when they get back from work.
30 minutes
Spend at least 30 minutes a day with your family. Take sometime off to comunicate with your family it can relieve stress and create a stronger bond.
Call
Call a friend rather than texting them. The use of technology has taken over our lives and even easy tasks like speaking to one another.Take some to have a real conversation with a friend.
Appreciation
Tell your parents how much you appreciate them. Your parents are special in many ways they influence you to become the person you are now. Would'nt it be nice to express your gratitude towards them?
Lunch
Pack lunch for your siblings.  Pack them something nice for lunch, make them their favorite food to show them how much you love them.
Movie/Game night
Arrange a movie/family game night with your family. Share a favorite movie of yours with your family, make some popcorn and chillax. Bond over a movie and share a bunch of laughs!
Homework Help
Help a friend out with homework. If you see a friend struggling in a class offer to help them with their homeowrk. Your friend will really appreciate your concern.
Hiking with Friends
Go on a hike with your friends. Explore the nature around you with some friends. Get some fresh air and exercise and at the same time share some time with your friends.
Help around
Lend a hand to your Grandparents. Grandparents always have our back and we should also have their back. Offer them help with whatever they need they will really appreciate it.
Baby-sit
Offer to baby-sit for a relative for free. Do you have any baby cousins who you would love to spend time with? You should try baby-sitting them.
 Moving to a new home can be really hard, if you notice a new neighbor in your neighbprhood say hi and welcome them they will feel so much better


Suspected suicide bombing targets police in Indonesia's Medan
Bomber killed and some officers wounded in blast that took place in car park outside building.
A blast outside the police headquarters in the Indonesian city of Medan in North Sumatra was a suspected suicide bombing, a police spokesman said on Wednesday.
Tatan Dirsan Atmaja, a spokesman for the North Sumatra police, said some police officers had been wounded in the blast that occurred at 8:40am (0140 GMT) and that the suspected suicide bomber had died in the attack.
A number of Indonesian television channels showed footage of people rushing out of buildings around the headquarters.
The motive for Wednesday's attack was not immediately clear, but Indonesia, the world’s most populous Muslim-majority country, has suffered a resurgence in homegrown militancy in recent years, with some attacks aimed at the police.
National police spokesman Dedi Prasetyo said the blast happened in a car park near an area where people were queueing for clearance letters from police.
"We're on alert right now," Prasetyo told Kompas TV. "The explosion didn't reach the centre for the clearance letter service, it was just in a parking lot."
In recent years, Islamic fighters, including the outlawed Jamaah Ansharut Daulah (JAD), a homegrown Indonesian armed group linked to the Islamic State of Iraq and the Levant (ISIL or ISIS). have staged a series of attacks against the police.
The latest bombing comes a month after a suspected fighter stabbed and wounded Wiranto, who was Indonesia's security minister at the time.


GeForMT.js - Test Environment
1) Initialize recognition and gesture sets
Global Settings
Show feedback
Prevent default
Predefinied Gesture Sets
None
Graffiti
Multistroke gestures
Multitouch gestures
Object oriented gestures
2) Define custom gesture
Identifier of the gesture (must be unique):
GeForMT expression:
Recognition configuration:
Online recognition
Offline recognition
div#canvas
div#obj3
div#obj2
div#obj1
Console
Plugin for receiving TUIO messages failed to load. Install the npTuioClient-Plugin, if your recognition system is build on top of the TUIO framework. Otherwise ignore this message.


Book It
Sign In
Email Address
Password
Remember me
Submit
Can't access your account?
Login Failed
Did you enter the right credentials?
OK


Note: New features in the Deployments API on GitHub are currently available during a public beta. Please see the blog post for full details.
To access the new environment
parameter, the two new values for
the state
parameter (in_progress
and
queued
), and use auto_inactive
on production
deployments during the public beta period, you must provide the following
custom media type in the Accept
header:
application/vnd.github.flash-preview+json
Note: The inactive
state and the
log_url
, environment_url
, and
auto_inactive
parameters are currently available for developers
to preview. Please see the
blog post
for full details.
To access the API during the preview period, you must provide a custom
media type in the Accept
header:
application/vnd.github.ant-man-preview+json
Warning: The API may change without advance notice during the preview period. Preview features are not supported for production use. If you experience any issues, contact GitHub Support or GitHub Premium Support.
Users with push
access can create deployment statuses for a given
deployment.
GitHub Apps require read & write
access to
"Deployments" and read-only
access to "Repo
contents" (for private repos). OAuth Apps require the
repo_deployment
scope.
POST /repos/:owner/:repo/deployments/:deployment_id/statuses
| Name | Type | Description |
|---|---|---|
state |
string |
Required. The state of the status. Can be one of
error , failure , inactive ,
in_progress , queued pending , or
success . Note: To use the
inactive state, you must provide the
application/vnd.github.ant-man-preview+json
custom media type. To use the in_progress and
queued states, you must provide the
application/vnd.github.flash-preview+json
custom media type. When you set a transient deployment to
inactive , the deployment will be shown as
destroyed in GitHub.
|
target_url |
string |
The target URL to associate with this status. This URL should contain
output to keep the user updated while the task is running or serve as
historical information for what happened in the deployment. Default:
"" Note: It's recommended
to use the log_url parameter, which replaces
target_url .
|
log_url |
string |
The full URL of the deployment's output. This parameter replaces
target_url . We will continue to accept
target_url to support legacy uses, but we recommend
replacing target_url with log_url . Setting
log_url will automatically set target_url to
the same value. Default: "" Note: This parameter requires you to use the application/vnd.github.ant-man-preview+json
custom media type.
|
description |
string |
A short description of the status. The maximum description length is 140
characters. Default: ""
|
environment |
string |
Name for the target deployment environment, which can be changed when
setting a deploy status. For example, production ,
staging , or qa . Note: This
parameter requires you to use the
application/vnd.github.flash-preview+json
custom media type.
|
environment_url |
string |
Sets the URL for accessing your environment. Default:
"" Note: This parameter requires you to use the application/vnd.github.ant-man-preview+json
custom media type.
|
auto_inactive |
boolean |
Adds a new inactive status to all prior non-transient,
non-production environment deployments with the same repository and
environment name as the created status's deployment.
An inactive status is only added to deployments that had a
success state. Default: true Note: To add an inactive status to
production environments, you must use the
application/vnd.github.flash-preview+json
custom media type. Note: This parameter requires you to use the application/vnd.github.ant-man-preview+json
custom media type.
|
{
"environment": "production",
"state": "success",
"log_url": "https://example.com/deployment/42/output",
"description": "Deployment finished successfully."


|
QuantLib: a free/open-source library for quantitative finance
Fully annotated sources - version 1.30
|
Monte Carlo Path Basket engine factory. More...
#include <ql/experimental/mcbasket/mcpathbasketengine.hpp>
Public Member Functions | |
| MakeMCPathBasketEngine (ext::shared_ptr< StochasticProcessArray >) | |
| MakeMCPathBasketEngine & | withSteps (Size steps) |
| MakeMCPathBasketEngine & | withStepsPerYear (Size steps) |
| MakeMCPathBasketEngine & | withBrownianBridge (bool b=true) |
| MakeMCPathBasketEngine & | withSamples (Size samples) |
| MakeMCPathBasketEngine & | withAbsoluteTolerance (Real tolerance) |
| MakeMCPathBasketEngine & | withMaxSamples (Size samples) |
| MakeMCPathBasketEngine & | withSeed (BigNatural seed) |
| MakeMCPathBasketEngine & | withAntitheticVariate (bool b=true) |
| MakeMCPathBasketEngine & | withControlVariate (bool b=true) |
| operator ext::shared_ptr< PricingEngine > () const | |
Private Attributes | |
| ext::shared_ptr< StochasticProcessArray > | process_ |
| bool | antithetic_ = false |
| bool | controlVariate_ = false |
| Size | steps_ |
| Size | stepsPerYear_ |
| Size | samples_ |
| Size | maxSamples_ |
| Real | tolerance_ |
| bool | brownianBridge_ = false |
| BigNatural | seed_ = 0 |
Monte Carlo Path Basket engine factory.
Definition at line 223 of file mcpathbasketengine.hpp.
|
explicit |
Definition at line 248 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withSteps | ( | Size | steps | ) |
Definition at line 255 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withStepsPerYear | ( | Size | steps | ) |
Definition at line 262 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withBrownianBridge | ( | bool | b = true | ) |
Definition at line 304 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withSamples | ( | Size | samples | ) |
Definition at line 269 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withAbsoluteTolerance | ( | Real | tolerance | ) |
Definition at line 278 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withMaxSamples | ( | Size | samples | ) |
Definition at line 290 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withSeed | ( | BigNatural | seed | ) |
Definition at line 297 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withAntitheticVariate | ( | bool | b = true | ) |
Definition at line 311 of file mcpathbasketengine.hpp.
| MakeMCPathBasketEngine< RNG, S > & withControlVariate | ( | bool | b = true | ) |
Definition at line 318 of file mcpathbasketengine.hpp.
| operator ext::shared_ptr< PricingEngine > |
Definition at line 325 of file mcpathbasketengine.hpp.
|
private |
Definition at line 239 of file mcpathbasketengine.hpp.
|
private |
Definition at line 240 of file mcpathbasketengine.hpp.
|
private |
Definition at line 240 of file mcpathbasketengine.hpp.
|
private |
Definition at line 241 of file mcpathbasketengine.hpp.
|
private |
Definition at line 241 of file mcpathbasketengine.hpp.
|
private |
Definition at line 241 of file mcpathbasketengine.hpp.
|
private |
Definition at line 241 of file mcpathbasketengine.hpp.
|
private |
Definition at line 242 of file mcpathbasketengine.hpp.
|
private |
Definition at line 243 of file mcpathbasketengine.hpp.
|
private |
Definition at line 244 of file mcpathbasketengine.hpp.


"Hey Gopher Lord! Thats what easy.
Lets face something more challenging?
"Hey Gopher Blue! Thats what easy.


Samuel Roman is a Senior Computer Engineering Student at the University of Central Florida. He will be receiving his Bachelor of Science in Computer Engineering in August 2016. His interests include software development in general, video games, and everything nerdy. He will be taking a full time position as a Systems Engineer at Millennium Engineering and Integration Company in Melbourne, Florida in mid-August.
Evan Baytan is a senior at the University of Central Florida. He will be receiving his Bachelor of Science in Computer Engineering in August 2016. His interests include iOS development and video games with friends. Evan is currently interviewing for a QA Engineer position with Apple.
Brian Webb is a senior at the University of Central Florida. He will be receiving his Bachelor of Science in Electrical Engineering in August 2016. His interests include playing bass, guitar or drums; learning about and observing space flight, baking and photography. Brian looks to pursue his Master’s Degree while working in a professional environment. He has interviewed with US Airforce civilian engineering and would love to work in defense or aerospace.
Patrick Sites is a senior of the University of Central Florida. He will be receiving his Bachelor of Science in Electrical Engineering in August 2016. His interests include diving, biking and mycology. Patrick is planning on working with NASA for Satellite Simulations.


JSON_PP(1) Perl Programmers Reference Guide JSON_PP(1) NAME json_pp - JSON::PP command utility SYNOPSIS json_pp [-v] [-f from_format] [-t to_format] [-json_opt options_to_json] DESCRIPTION json_pp converts between some input and output formats (one of them is JSON). This program was copied from json_xs and modified. The default input format is json and the default output format is json with pretty option. OPTIONS -f -f from_format Reads a data in the given format from STDIN. Format types: json as JSON eval as Perl code -t Writes a data in the given format to STDOUT. null no action. json as JSON dumper as Data::Dumper -json_opt options to JSON::PP Acceptable options are: ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref allow_singlequote allow_barekey allow_bignum loose escape_slash -v Verbose option, but currently no action in fact. -V Prints version and exits. EXAMPLES $ perl -e'print q|{"foo":"XX","bar":1234567890000000000000000}|' |\ json_pp -f json -t dumper -json_opt pretty,utf8,allow_bignum $VAR1 = { 'bar' => bless( { 'value' => [ '0000000', '0000000', '5678900', '1234' ], 'sign' => '+' }, 'Math::BigInt' ), 'foo' => "\x{3042}\x{3044}" }; $ perl -e'print q|{"foo":"XX","bar":1234567890000000000000000}|' |\ json_pp -f json -t dumper -json_opt pretty $VAR1 = { 'bar' => '1234567890000000000000000', 'foo' => "\x{e3}\x{81}\x{82}\x{e3}\x{81}\x{84}" }; SEE ALSO JSON::PP, json_xs AUTHOR Makamaka Hannyaharamitu, <makamaka[at]cpan.org> COPYRIGHT AND LICENSE Copyright 2010 by Makamaka Hannyaharamitu This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. perl v5.14.2 2014-09-30 JSON_PP(1)


Demo code for Backbone & Underscore
Creating a compelling demo is a good example of success.
Saying
hello
to the
world
.


By: Tiago Sa
Find Out More"Learn from yesterday, live for today, hope for tomorrow. The important thing is not to stop questioning." -Albert Einstein
I believe the work one does is a great representation of that person. The many people I have worked with have proven this to me. Everyone is unique and has different ways of doing things, which shows in the the work they present. That is why whenever I do something, I do it to my full potential, so people know that the work I have done is a part of me, and it is something I am proud of.


|
I
Don't Want To Grow Up
(Ramones) |
|
When
I'm lyin' in my bed at nite
I don't wanna grow up Nothing ever seems to turn out right And I don't wanna grow up How do you move in a world of fog that's always changing things Makes the wish that I could be a dog When I see the price that you pay I don't wanna grow up I don't ever wanna be that way And I don't wanna grow up Seems that folks turn into things that they never want The only thing to live for is today...


Foxes blamed for Scottish Junior Cup game call off but rival club cite stag-do plan
The tie between Bridge of Don Thistle and Fauldhouse United was cancelled after foxes allegedly dug holes all over the pitch.
by Record ReporterFootball can be a game full of excuses – but the one that caused a Scottish Junior Cup clash to be called off is surely a first.
The tie between Bridge of Don Thistle and Fauldhouse United was cancelled after foxes allegedly dug holes all over the pitch.
A local referee decided on Friday night that the park at Aberdeen Sports Village was too dangerous to play on.
But Fauldhouse officials last night claimed there was not a blade of truth in the excuse.
The West Lothian club insisted the real reason behind the call-off was that Bridge of Don players wanted to go on a stag do.
United chairman Steven Sharpe, who was in Aberdeen on business, checked the pitch yesterday morning and said it was in “pristine” condition.
Last night, Fauldhouse manager Jon Connolly described the call-off as “an absolute farce”.
He said: “Bridge of Don didn’t even bother to contact us, so we had to find out from the Scottish Junior Football Association.
“It looks as if the referee, whoever it is, has done them a favour because there are rumours of a stag do going around, which means that they’ll have players missing, so they’re trying to play the game when it suits them.
“My chairman went to check the pitch this morning and it’s absolutely fine.”
Bridge of Don Thistle, co-managed by Lewis Muirhead and Thomas Wilson, were unavailable for comment last night.


Using a UN*X passwd file as the user database
On some systems the primary store of users is the UN*X passwd file. It holds information on users such as their username, real name, password and primary user group.
Roundup can use this store as its primary source of user information, but it needs additional information too - email address(es), roundup Roles, vacation flags, roundup hyperdb item ids, etc. Also, “retired” users must still exist in the user database, unlike some passwd files in which the users are removed when they no longer have access to a system.
To make use of the passwd file, we therefore synchronise between the two user stores. We also use the passwd file to validate the user logins, as described in the previous example, using an external password validation source. We keep the user lists in sync using a fairly simple script that runs once a day, or several times an hour if more immediate access is needed. In short, it:
- parses the passwd file, finding usernames, passwords and real names,
- compares that list to the current roundup user list:
- entries no longer in the passwd file are retired
- entries with mismatching real names are updated
- entries only exist in the passwd file are created
- send an email to administrators to let them know what’s been done.
The retiring and updating are simple operations, requiring only a call to retire() or set(). The creation operation requires more information though - the user’s email address and their Roundup Roles. We’re going to assume that the user’s email address is the same as their login name, so we just append the domain name to that. The Roles are determined using the passwd group identifier - mapping their UN*X group to an appropriate set of Roles.
The script to perform all this, broken up into its main components, is as follows. Firstly, we import the necessary modules and open the tracker we’re to work on:
import sys, os, smtplib
from roundup import instance, date
# open the tracker
tracker_home = sys.argv[1]
tracker = instance.open(tracker_home)
Next we read in the passwd file from the tracker home:
# read in the users from the "passwd.txt" file
file = os.path.join(tracker_home, 'passwd.txt')
users = [x.strip().split(':') for x in open(file).readlines()]
Handle special users (those to ignore in the file, and those who don’t appear in the file):
# users to not keep ever, pre-load with the users I know aren't
# "real" users
ignore = ['ekmmon', 'bfast', 'csrmail']
# users to keep - pre-load with the roundup-specific users
keep = ['comment_pool', 'network_pool', 'admin', 'dev-team',
'cs_pool', 'anonymous', 'system_pool', 'automated']
Now we map the UN*X group numbers to the Roles that users should have:
roles = {
'501': 'User,Tech', # tech
'502': 'User', # finance
'503': 'User,CSR', # customer service reps
'504': 'User', # sales
'505': 'User', # marketing
}
Now we do all the work. Note that the body of the script (where we have the tracker database open) is wrapped in a try / finally clause, so that we always close the database cleanly when we’re finished. So, we now do all the work:
# open the database
db = tracker.open('admin')
try:
# store away messages to send to the tracker admins
msg = []
# loop over the users list read in from the passwd file
for user,passw,uid,gid,real,home,shell in users:
if user in ignore:
# this user shouldn't appear in our tracker
continue
keep.append(user)
try:
# see if the user exists in the tracker
uid = db.user.lookup(user)
# yes, they do - now check the real name for correctness
if real != db.user.get(uid, 'realname'):
db.user.set(uid, realname=real)
msg.append('FIX %s - %s'%(user, real))
except KeyError:
# nope, the user doesn't exist
db.user.create(username=user, realname=real,
<EMAIL_ADDRESS>roles=roles[gid])
msg.append('ADD %s - %s (%s)'%(user, real, roles[gid]))
# now check that all the users in the tracker are also in our
# "keep" list - retire those who aren't
for uid in db.user.list():
user = db.user.get(uid, 'username')
if user not in keep:
db.user.retire(uid)
msg.append('RET %s'%user)
# if we did work, then send email to the tracker admins
if msg:
# create the email
msg = '''Subject: %s user database maintenance
%s
'''%(db.config.TRACKER_NAME, '\n'.join(msg))
# send the email
smtp = smtplib.SMTP(db.config.MAILHOST)
addr = db.config.ADMIN_EMAIL
smtp.sendmail(addr, addr, msg)
# now we're done - commit the changes
db.commit()
finally:
# always close the database cleanly
db.close()
And that’s it!
Using an LDAP database for user information
A script that reads users from an LDAP store using http://python-ldap.sf.net/ and then compares the list to the users in the roundup user database would be pretty easy to write. You’d then have it run once an hour / day (or on demand if you can work that into your LDAP store workflow). See the example Using a UN*X passwd file as the user database for more information about doing this.
To authenticate off the LDAP store (rather than using the passwords in the Roundup user database) you’d use the same python-ldap module inside an extension to the cgi interface. You’d do this by overriding the method called verifyPassword on the LoginAction class in your tracker’s extensions directory (see using an external password validation source). The method is implemented by default as:
def verifyPassword(self, userid, password):
''' Verify the password that the user has supplied
'''
stored = self.db.user.get(self.userid, 'password')
if password == stored:
return 1
if not password and not stored:
return 1
return 0
So you could reimplement this as something like:
def verifyPassword(self, userid, password):
''' Verify the password that the user has supplied
'''
# look up some unique LDAP information about the user
username = self.db.user.get(self.userid, 'username')
# now verify the password supplied against the LDAP store
Changes to Tracker Behaviour
Preventing SPAM
The following detector code may be installed in your tracker’s detectors directory. It will block any messages being created that have HTML attachments (a very common vector for spam and phishing) and any messages that have more than 2 HTTP URLs in them. Just copy the following into detectors/anti_spam.py in your tracker:
from roundup.exceptions import Reject
def reject_html(db, cl, nodeid, newvalues):
if newvalues['type'] == 'text/html':
raise Reject, 'not allowed'
def reject_manylinks(db, cl, nodeid, newvalues):
content = newvalues['content']
if content.count('http://') > 2:
raise Reject, 'not allowed'
def init(db):
db.file.audit('create', reject_html)
db.msg.audit('create', reject_manylinks)
You may also wish to block image attachments if your tracker does not need that ability:
if newvalues['type'].startswith('image/'):
raise Reject, 'not allowed'
Stop “nosy” messages going to people on vacation
When users go on vacation and set up vacation email bouncing, you’ll start to see a lot of messages come back through Roundup “Fred is on vacation”. Not very useful, and relatively easy to stop.
add a “vacation” flag to your users:
user = Class(db, "user", username=String(), password=Password(), address=String(), realname=String(), phone=String(), organisation=String(), alternate_addresses=String(), roles=String(), queries=Multilink("query"), vacation=Boolean())
So that users may edit the vacation flags, add something like the following to your user.item template:

 On Vacation	 vacation

edit your detector nosyreactor.py so that the nosyreaction() consists of:
def nosyreaction(db, cl, nodeid, oldvalues): users = db.user messages = db.msg # send a copy of all new messages to the nosy list for msgid in determineNewMessages(cl, nodeid, oldvalues): try: # figure the recipient ids sendto = [] seen_message = {} recipients = messages.get(msgid, 'recipients') for recipid in messages.get(msgid, 'recipients'): seen_message[recipid] = 1 # figure the author's id, and indicate they've received # the message authid = messages.get(msgid, 'author') # possibly send the message to the author, as long as # they aren't anonymous if (db.config.MESSAGES_TO_AUTHOR == 'yes' and users.get(authid, 'username') != 'anonymous'): sendto.append(authid) seen_message[authid] = 1 # now figure the nosy people who weren't recipients nosy = cl.get(nodeid, 'nosy') for nosyid in nosy: # Don't send nosy mail to the anonymous user (that # user shouldn't appear in the nosy list, but just # in case they do...) if users.get(nosyid, 'username') == 'anonymous': continue # make sure they haven't seen the message already if not seen_message.has_key(nosyid): # send it to them sendto.append(nosyid) recipients.append(nosyid) # generate a change note if oldvalues: note = cl.generateChangeNote(nodeid, oldvalues) else: note = cl.generateCreateNote(nodeid) # we have new recipients if sendto: # filter out the people on vacation sendto = [i for i in sendto if not users.get(i, 'vacation', 0)] # map userids to addresses sendto = [users.get(i, 'address') for i in sendto] # update the message's recipients list messages.set(msgid, recipients=recipients) # send the message cl.send_message(nodeid, msgid, note, sendto) except roundupdb.MessageSendError, message: raise roundupdb.DetectorError, message
Note that this is the standard nosy reaction code, with the small addition of:
# filter out the people on vacation sendto = [i for i in sendto if not users.get(i, 'vacation', 0)]
which filters out the users that have the vacation flag set to true.
Adding in state transition control
Sometimes tracker admins want to control the states to which users may move issues. You can do this by following these steps:
make “status” a required variable. This is achieved by adding the following to the top of the form in the issue.item.html template:
<input type="hidden" name="@required" value="status">
This will force users to select a status.
add a Multilink property to the status class:
stat = Class(db, "status", ... , transitions=Multilink('status'), ...)
and then edit the statuses already created, either:
- through the web using the class list -> status class editor, or
- using the roundup-admin “set” command.
add an auditor module checktransition.py in your tracker’s detectors directory, for example:
def checktransition(db, cl, nodeid, newvalues): ''' Check that the desired transition is valid for the "status" property. ''' if not newvalues.has_key('status'): return current = cl.get(nodeid, 'status') new = newvalues['status'] if new == current: return ok = db.status.get(current, 'transitions') if new not in ok: raise ValueError, 'Status not allowed to move from "%s" to "%s"'%( db.status.get(current, 'name'), db.status.get(new, 'name')) def init(db): db.issue.audit('set', checktransition)
in the issue.item.html template, change the status editing bit from:
Status	 status
to:
Status	  <select tal:condition="context/id" name="status"> <tal:block tal:define="ok context/status/transitions" tal:repeat="state db/status/list"> <option tal:condition="python:state.id in ok" tal:attributes=" value state/id; selected python:state.id == context.status.id" tal:content="state/name"></option> </tal:block> </select> <tal:block tal:condition="not:context/id" tal:replace="structure context/status/menu" />
which displays only the allowed status to transition to.
Blocking issues that depend on other issues
We needed the ability to mark certain issues as “blockers” - that is, they can’t be resolved until another issue (the blocker) they rely on is resolved. To achieve this:
Create a new property on the issue class: blockers=Multilink("issue"). To do this, edit the definition of this class in your tracker’s schema.py file. Change this:
issue = IssueClass(db, "issue", assignedto=Link("user"), keyword=Multilink("keyword"), priority=Link("priority"), status=Link("status"))
to this, adding the blockers entry:
issue = IssueClass(db, "issue", blockers=Multilink("issue"), assignedto=Link("user"), keyword=Multilink("keyword"), priority=Link("priority"), status=Link("status"))
Add the new blockers property to the issue.item.html edit page, using something like:
Waiting On
View:
You’ll need to fiddle with your item page layout to find an appropriate place to put it - I’ll leave that fun part up to you. Just make sure it appears in the first table, possibly somewhere near the “superseders” field.
Create a new detector module (see below) which enforces the rules:
- issues may not be resolved if they have blockers
- when a blocker is resolved, it’s removed from issues it blocks
The contents of the detector should be something like this:
def blockresolution(db, cl, nodeid, newvalues): ''' If the issue has blockers, don't allow it to be resolved. ''' if nodeid is None: blockers = [] else: blockers = cl.get(nodeid, 'blockers') blockers = newvalues.get('blockers', blockers) # don't do anything if there's no blockers or the status hasn't # changed if not blockers or not newvalues.has_key('status'): return # get the resolved state ID resolved_id = db.status.lookup('resolved') # format the info u = db.config.TRACKER_WEB s = ', '.join(['%s'%( u,id,id) for id in blockers]) if len(blockers) == 1: s = 'issue %s is'%s else: s = 'issues %s are'%s # ok, see if we're trying to resolve if newvalues['status'] == resolved_id: raise ValueError, "This issue can't be resolved until %s resolved."%s def resolveblockers(db, cl, nodeid, oldvalues): ''' When we resolve an issue that's a blocker, remove it from the blockers list of the issue(s) it blocks. ''' newstatus = cl.get(nodeid,'status') # no change? if oldvalues.get('status', None) == newstatus: return resolved_id = db.status.lookup('resolved') # interesting? if newstatus != resolved_id: return # yes - find all the blocked issues, if any, and remove me from # their blockers list issues = cl.find(blockers=nodeid) for issueid in issues: blockers = cl.get(issueid, 'blockers') if nodeid in blockers: blockers.remove(nodeid) cl.set(issueid, blockers=blockers) def init(db): # might, in an obscure situation, happen in a create db.issue.audit('create', blockresolution) db.issue.audit('set', blockresolution) # can only happen on a set db.issue.react('set', resolveblockers)
Put the above code in a file called “blockers.py” in your tracker’s “detectors” directory.
Finally, and this is an optional step, modify the tracker web page URLs so they filter out issues with any blockers. You do this by adding an additional filter on “blockers” for the value “-1”. For example, the existing “Show All” link in the “page” template (in the tracker’s “html” directory) looks like this:
Show All

modify it to add the “blockers” info to the URL (note, both the “@filter” and “blockers” values must be specified):
Show All

The above examples are line-wrapped on the trailing & and should be unwrapped.
That’s it. You should now be able to set blockers on your issues. Note that if you want to know whether an issue has any other issues dependent on it (i.e. it’s in their blockers list) you can look at the journal history at the bottom of the issue page - look for a “link” event to another issue’s “blockers” property.
Add users to the nosy list based on the keyword
Let’s say we need the ability to automatically add users to the nosy list based on the occurance of a keyword. Every user should be allowed to edit their own list of keywords for which they want to be added to the nosy list.
Below, we’ll show that this change can be done with minimal understanding of the Roundup system, using only copy and paste.
This requires three changes to the tracker: a change in the database to allow per-user recording of the lists of keywords for which he wants to be put on the nosy list, a change in the user view allowing them to edit this list of keywords, and addition of an auditor which updates the nosy list when a keyword is set.
Adding the nosy keyword list
The change to make in the database, is that for any user there should be a list of keywords for which he wants to be put on the nosy list. Adding a Multilink of keyword seems to fullfill this. As such, all that has to be done is to add a new field to the definition of user within the file schema.py. We will call this new field nosy_keywords, and the updated definition of user will be:
user = Class(db, "user",
username=String(), password=Password(),
address=String(), realname=String(),
phone=String(), organisation=String(),
alternate_addresses=String(),
queries=Multilink('query'), roles=String(),
timezone=String(),
nosy_keywords=Multilink('keyword'))
Changing the user view to allow changing the nosy keyword list
We want any user to be able to change the list of keywords for which he will by default be added to the nosy list. We choose to add this to the user view, as is generated by the file html/user.item.html. We can easily see that the keyword field in the issue view has very similar editing requirements as our nosy keywords, both being lists of keywords. As such, we look for Keywords in issue.item.html, and extract the associated parts from there. We add this to user.item.html at the bottom of the list of viewed items (i.e. just below the ‘Alternate E-mail addresses’ in the classic template):

Nosy Keywords

Addition of an auditor to update the nosy list
The more difficult part is the logic to add the users to the nosy list when required. We choose to perform this action whenever the keywords on an item are set (this includes the creation of items). Here we choose to start out with a copy of the detectors/nosyreaction.py detector, which we copy to the file detectors/nosy_keyword_reaction.py. This looks like a good start as it also adds users to the nosy list. A look through the code reveals that the nosyreaction function actually sends the e-mail. We don’t need this. Therefore, we can change the init function to:
def init(db):
db.issue.audit('create', update_kw_nosy)
db.issue.audit('set', update_kw_nosy)
After that, we rename the updatenosy function to update_kw_nosy. The first two blocks of code in that function relate to setting current to a combination of the old and new nosy lists. This functionality is left in the new auditor. The following block of code, which handled adding the assignedto user(s) to the nosy list in updatenosy, should be replaced by a block of code to add the interested users to the nosy list. We choose here to loop over all new keywords, than looping over all users, and assign the user to the nosy list when the keyword occurs in the user’s nosy_keywords. The next part in updatenosy – adding the author and/or recipients of a message to the nosy list – is obviously not relevant here and is thus deleted from the new auditor. The last part, copying the new nosy list to newvalues, can stay as is. This results in the following function:
def update_kw_nosy(db, cl, nodeid, newvalues):
'''Update the nosy list for changes to the keywords
'''
# nodeid will be None if this is a new node
current = {}
if nodeid is None:
ok = ('new', 'yes')
else:
ok = ('yes',)
# old node, get the current values from the node if they haven't
# changed
if not newvalues.has_key('nosy'):
nosy = cl.get(nodeid, 'nosy')
for value in nosy:
if not current.has_key(value):
current[value] = 1
# if the nosy list changed in this transaction, init from the new value
if newvalues.has_key('nosy'):
nosy = newvalues.get('nosy', [])
for value in nosy:
if not db.hasnode('user', value):
continue
if not current.has_key(value):
current[value] = 1
# add users with keyword in nosy_keywords to the nosy list
if newvalues.has_key('keyword') and newvalues['keyword'] is not None:
keyword_ids = newvalues['keyword']
for keyword in keyword_ids:
# loop over all users,
# and assign user to nosy when keyword in nosy_keywords
for user_id in db.user.list():
nosy_kw = db.user.get(user_id, "nosy_keywords")
found = 0
for kw in nosy_kw:
if kw == keyword:
found = 1
if found:
current[user_id] = 1
# that's it, save off the new nosy list
newvalues['nosy'] = current.keys()
These two function are the only ones needed in the file.
TODO: update this example to use the find() Class method.
Caveats
A few problems with the design here can be noted:
- Multiple additions
When a user, after automatic selection, is manually removed from the nosy list, he is added to the nosy list again when the keyword list of the issue is updated. A better design might be to only check which keywords are new compared to the old list of keywords, and only add users when they have indicated interest on a new keyword.
The code could also be changed to only trigger on the create() event, rather than also on the set() event, thus only setting the nosy list when the issue is created.
- Scalability
- In the auditor, there is a loop over all users. For a site with only few users this will pose no serious problem; however, with many users this will be a serious performance bottleneck. A way out would be to link from the keywords to the users who selected these keywords as nosy keywords. This will eliminate the loop over all users.
Restricting updates that arrive by email
Roundup supports multiple update methods:
- command line
- plain email
- pgp signed email
- web access
in some cases you may need to prevent changes to properties by some of these methods. For example you can set up issues that are viewable only by people on the nosy list. So you must prevent unauthenticated changes to the nosy list.
Since plain email can be easily forged, it does not provide sufficient authentication in this senario.
To prevent this we can add a detector that audits the source of the transaction and rejects the update if it changes the nosy list.
Create the detector (auditor) module and add it to the detectors directory of your tracker:
from roundup import roundupdb, hyperdb
from roundup.mailgw import Unauthorized
def restrict_nosy_changes(db, cl, nodeid, newvalues):
'''Do not permit changes to nosy via email.'''
if not (newvalues.has_key('nosy')):
# the nosy field has not changed so no need to check.
return
if db.tx_Source in ['web', 'email-sig-openpgp', 'cli' ]:
# if the source of the transaction is from an authenticated
# source or a privileged process allow the transaction.
# Other possible sources: 'email'
return
# otherwise raise an error
raise Unauthorized, \
'Changes to nosy property not allowed via %s for this issue.'%\
tx_Source
def init(db):
''' Install restrict_nosy_changes to run after other auditors.
Allow initial creation email to set nosy.
So don't execute: db.issue.audit('create', requestedbyauditor)
Set priority to 110 to run this auditor after other auditors
that can cause nosy to change.
'''
db.issue.audit('set', restrict_nosy_changes, 110)
This detector (auditor) will prevent updates to the nosy field if it arrives by email. Since it runs after other auditors (due to the priority of 110), it will also prevent changes to the nosy field that are done by other auditors if triggered by an email.
Note that db.tx_Source was not present in roundup versions before 1.4.22, so you must be running a newer version to use this detector. Read the CHANGES.txt document in the roundup source code for further details on tx_Source.
Changes to Security and Permissions
Restricting the list of users that are assignable to a task
In your tracker’s schema.py, create a new Role, say “Developer”:
db.security.addRole(name='Developer', description='A developer')
Just after that, create a new Permission, say “Fixer”, specific to “issue”:
p = db.security.addPermission(name='Fixer', klass='issue', description='User is allowed to be assigned to fix issues')
Then assign the new Permission to your “Developer” Role:
db.security.addPermissionToRole('Developer', p)
In the issue item edit page (html/issue.item.html in your tracker directory), use the new Permission in restricting the “assignedto” list:
<select name="assignedto"> <option value="-1">- no selection -</option> <tal:block tal:repeat="user db/user/list"> <option tal:condition="python:user.hasPermission( 'Fixer', context._classname)" tal:attributes=" value user/id; selected python:user.id == context.assignedto" tal:content="user/realname"></option> </tal:block> </select>
For extra security, you may wish to setup an auditor to enforce the Permission requirement (install this as assignedtoFixer.py in your tracker detectors directory):
def assignedtoMustBeFixer(db, cl, nodeid, newvalues):
''' Ensure the assignedto value in newvalues is used with the
Fixer Permission
'''
if not newvalues.has_key('assignedto'):
# don't care
return
# get the userid
userid = newvalues['assignedto']
if not db.security.hasPermission('Fixer', userid, cl.classname):
raise ValueError, 'You do not have permission to edit %s'%cl.classname
def init(db):
db.issue.audit('set', assignedtoMustBeFixer)
db.issue.audit('create', assignedtoMustBeFixer)
So now, if an edit action attempts to set “assignedto” to a user that doesn’t have the “Fixer” Permission, the error will be raised.
Users may only edit their issues
In this case, users registering themselves are granted Provisional access, meaning they have access to edit the issues they submit, but not others. We create a new Role called “Provisional User” which is granted to newly-registered users, and has limited access. One of the Permissions they have is the new “Edit Own” on issues (regular users have “Edit”.)
First up, we create the new Role and Permission structure in schema.py:
#
# New users not approved by the admin
#
db.security.addRole(name='Provisional User',
description='New user registered via web or email')
# These users need to be able to view and create issues but only edit
# and view their own
db.security.addPermissionToRole('Provisional User', 'Create', 'issue')
def own_issue(db, userid, itemid):
'''Determine whether the userid matches the creator of the issue.'''
return userid == db.issue.get(itemid, 'creator')
p = db.security.addPermission(name='Edit', klass='issue',
check=own_issue, description='Can only edit own issues')
db.security.addPermissionToRole('Provisional User', p)
p = db.security.addPermission(name='View', klass='issue',
check=own_issue, description='Can only view own issues')
db.security.addPermissionToRole('Provisional User', p)
# Assign the Permissions for issue-related classes
for cl in 'file', 'msg', 'query', 'keyword':
db.security.addPermissionToRole('Provisional User', 'View', cl)
db.security.addPermissionToRole('Provisional User', 'Edit', cl)
db.security.addPermissionToRole('Provisional User', 'Create', cl)
for cl in 'priority', 'status':
db.security.addPermissionToRole('Provisional User', 'View', cl)
# and give the new users access to the web and email interface
db.security.addPermissionToRole('Provisional User', 'Web Access')
db.security.addPermissionToRole('Provisional User', 'Email Access')
# make sure they can view & edit their own user record
def own_record(db, userid, itemid):
'''Determine whether the userid matches the item being accessed.'''
return userid == itemid
p = db.security.addPermission(name='View', klass='user', check=own_record,
description="User is allowed to view their own user details")
db.security.addPermissionToRole('Provisional User', p)
p = db.security.addPermission(name='Edit', klass='user', check=own_record,
description="User is allowed to edit their own user details")
db.security.addPermissionToRole('Provisional User', p)
Then, in config.ini, we change the Role assigned to newly-registered users, replacing the existing 'User' values:
[main]
...
new_web_user_roles = 'Provisional User'
new_email_user_roles = 'Provisional User'
All users may only view and edit issues, files and messages they create
Replace the standard “classic” tracker View and Edit Permission assignments for the “issue”, “file” and “msg” classes with the following:
def checker(klass):
def check(db, userid, itemid, klass=klass):
return db.getclass(klass).get(itemid, 'creator') == userid
return check
for cl in 'issue', 'file', 'msg':
p = db.security.addPermission(name='View', klass=cl,
check=checker(cl))
db.security.addPermissionToRole('User', p)
p = db.security.addPermission(name='Edit', klass=cl,
check=checker(cl))
db.security.addPermissionToRole('User', p)
db.security.addPermissionToRole('User', 'Create', cl)
Moderating user registration
You could set up new-user moderation in a public tracker by:
- creating a new highly-restricted user role “Pending”,
- set the config new_web_user_roles and/or new_email_user_roles to that role,
- have an auditor that emails you when new users are created with that role using roundup.mailer
- edit the role to “User” for valid users.
Some simple javascript might help in the last step. If you have high volume you could search for all currently-Pending users and do a bulk edit of all their roles at once (again probably with some simple javascript help).
Changes to the Web User Interface
Adding action links to the index page
Add a column to the item.index.html template.
Resolving the issue:
resolve
“Take” the issue:
take
... and so on.
Colouring the rows in the issue index according to priority
A simple tal:attributes statement will do the bulk of the work here. In the issue.index.html template, add this to the
 that displays the rows of data:

and then in your stylesheet (style.css) specify the colouring for the different priorities, as follows:
tr.priority-critical td {
background-color: red;
}
tr.priority-urgent td {
background-color: orange;
}
and so on, with far less offensive colours :)
Editing multiple items in an index view
To edit the status of all items in the item index view, edit the issue.item.html:
add a form around the listing table (separate from the existing index-page form), so at the top it reads:
<form method="POST" tal:attributes="action request/classname">

and at the bottom of that table:

 </form
making sure you match the
 from the list table, not the navigation table or the subsequent form table.
in the display for the issue property, change:

to:

this will result in an edit field for the status property.
after the tal:block which lists the index items (marked by tal:repeat="i batch") add a new table row:

  <input type="submit" value=" Save Changes "> <input type="hidden" name="@action" value="edit"> <tal:block replace="structure request/indexargs_form" />

which gives us a submit button, indicates that we are performing an edit on any changed statuses. The final tal:block will make sure that the current index view parameters (filtering, columns, etc) will be used in rendering the next page (the results of the editing).
Displaying only message summaries in the issue display
Alter the issue.item template section for messages to:

Messages

author
date
summary

remove

Enabling display of either message summaries or the entire messages
This is pretty simple - all we need to do is copy the code from the example displaying only message summaries in the issue display into our template alongside the summary display, and then introduce a switch that shows either the one or the other. We’ll use a new form variable, @whole_messages to achieve this:

<tal:block tal:condition="not:request/form/@whole_messages/value | python:0">

Messages

show entire messages

author
date
summary

remove

</tal:block>
<tal:block tal:condition="request/form/@whole_messages/value | python:0">

Messages

show only summaries

<tal:block tal:repeat="msg context/messages">

author
date

(remove)

</tal:block>
</tal:block>

Setting up a “wizard” (or “druid”) for controlled adding of issues
Set up the page templates you wish to use for data input. My wizard is going to be a two-step process: first figuring out what category of issue the user is submitting, and then getting details specific to that category. The first page includes a table of help, explaining what the category names mean, and then the core of the form:
<form method="POST" onSubmit="return submit_once()" enctype="multipart/form-data"> <input type="hidden" name="@template" value="add_page1"> <input type="hidden" name="@action" value="page1_submit"> Category: <tal:block tal:replace="structure context/category/menu" /> <input type="submit" value="Continue"> </form>
The next page has the usual issue entry information, with the addition of the following form fragments:
<form method="POST" onSubmit="return submit_once()" enctype="multipart/form-data" tal:condition="context/is_edit_ok" tal:define="cat request/form/category/value"> <input type="hidden" name="@template" value="add_page2"> <input type="hidden" name="@required" value="title"> <input type="hidden" name="category" tal:attributes="value cat"> . . . </form>
Note that later in the form, I use the value of “cat” to decide which form elements should be displayed. For example:
<tal:block tal:condition="python:cat in '6 10 13 14 15 16 17'.split()">
 Operating System

 Web Browser
 </tal:block>
... the above section will only be displayed if the category is one of 6, 10, 13, 14, 15, 16 or 17.
Determine what actions need to be taken between the pages - these are usually to validate user choices and determine what page is next. Now encode those actions in a new Action class (see defining new web actions):
from roundup.cgi.actions import Action class Page1SubmitAction(Action): def handle(self): ''' Verify that the user has selected a category, and then move on to page 2. ''' category = self.form['category'].value if category == '-1': self.client.error_message.append('You must select a category of report') return # everything's ok, move on to the next page self.client.template = 'add_page2' def init(instance): instance.registerAction('page1_submit', Page1SubmitAction)
Use the usual “new” action as the @action on the final page, and you’re done (the standard context/submit method can do this for you).
Debugging Trackers
There are three switches in tracker configs that turn on debugging in Roundup:
- web :: debug
- mail :: debug
- logging :: level
See the config.ini file or the tracker configuration section above for more information.
Additionally, the roundup-server.py script has its own debugging mode in which it reloads edited templates immediately when they are changed, rather than requiring a web server restart.


54
The Eternal Covenant of Peace
1 “Sing, O barren one, who did not bear;
break forth into singing and cry aloud,
you who have not been in labor!
For the children of the desolate one will be more
than the children of her who is married,” says the LORD.
2 “Enlarge the place of your tent,
and let the curtains of your habitations be stretched out;
do not hold back; lengthen your cords
and strengthen your stakes.
3 For you will spread abroad to the right and to the left,
and your offspring will possess the nations
and will people the desolate cities.
4 “Fear not, for you will not be ashamed;
be not confounded, for you will not be disgraced;
for you will forget the shame of your youth,
and the reproach of your widowhood you will remember no more.
5 For your Maker is your husband,
the LORD of hosts is his name;
and the Holy One of Israel is your Redeemer,
the God of the whole earth he is called.
6 For the LORD has called you
like a wife deserted and grieved in spirit,
like a wife of youth when she is cast off,
says your God.
7 For a brief moment I deserted you,
but with great compassion I will gather you.
8 In overflowing anger for a moment
I hid my face from you,
but with everlasting love I will have compassion on you,”
says the LORD, your Redeemer.
9 “This is like the days of Noah to me:
as I swore that the waters of Noah
should no more go over the earth,
so I have sworn that I will not be angry with you,
and will not rebuke you.
10 For the mountains may depart
and the hills be removed,
but my steadfast love shall not depart from you,
and my covenant of peace shall not be removed,”
says the LORD, who has compassion on you.
11 “O afflicted one, storm-tossed and not comforted,
behold, I will set your stones in antimony,
and lay your foundations with sapphires.
12 I will make your pinnacles of agate,
your gates of carbuncles,
and all your wall of precious stones.
13 All your children shall be taught by the LORD,
and great shall be the peace of your children.
14 In righteousness you shall be established;
you shall be far from oppression, for you shall not fear;
and from terror, for it shall not come near you.
15 If anyone stirs up strife,
it is not from me;
whoever stirs up strife with you
shall fall because of you.
16 Behold, I have created the smith
who blows the fire of coals
and produces a weapon for its purpose.
I have also created the ravager to destroy;
17 no weapon that is fashioned against you shall succeed,
and you shall confute every tongue that rises against you in judgment.
This is the heritage of the servants of the LORD
and their vindication from me, declares the LORD.”


| DiscreteWavelets Toolbox |
Matrix/vector compression
y = Comp(v,k)
y=Comp(v,k) takes as input a matrix or vector v and an integer k and returns a matrix or vector (depending on v) where the largest k elements of v in absolute value have been retained and all other elements are converted to 0.
Create an 8x8 matrix of random nonnegative integers less than or equal to 10. Then compress all but the three largest values.
A=round(10*rand(8,8)) %Create the matrix B=Comp(A,3) %Compress the matrix
results in
A = 9 5 2 7 5 8 2 9 3 8 8 7 10 9 3 6 8 9 3 5 1 1 1 4 8 1 5 1 4 4 1 5 4 6 2 2 1 3 9 4 6 5 6 9 10 8 6 1 1 0 3 2 0 4 5 2 1 3 7 8 8 9 1 1 B = 9 0 0 0 0 0 0 9 0 0 0 0 10 9 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0
Note that there are actually 8 elements that are either 9 or 10 - the Comp function retains all of them.
© 2007-2008 Patrick Van Fleet


{% extends 'base.html' %} {% block title %}
It is a web-app that give its users privilege to save all their ideas. All the posts are saved in our database and the user can access them anytime for the further usage. Useful links for ideas, images and other popular blogging websites are also provided for quick access.
The Front-end of this web-app is built using HTML, CSS and BootStrap. The
Back-end relies completely on the awesome Python-Flask. It is basically a fun, Flask-Learn-Time
Project developed and maintained by an aspiring Software
Developer Sushant Gaurav.