Made by: Julian Evalle, 11286369
You've never seen a mountain do a backflip
Visualizations
Problem:
The MyAnimeList(MAL) site allows users to keep track of the anime they've seen.
However it does not give a lot of insight into your preferences and watch patterns,
especially when the account owner has seen over a 100 different series.
Mainly due to a lack of visualization tools on the site itself, which also
results in not being able to compare to other users.
These visualizations can give insight on genre and studio preferences.
For genre specifically in the context of total amount, seasonal and yearly specifics.
About MAL:
Within MAL you can categorize different series witin different lists
to keep track of the anime series you've seen, put on-hold, dropped or
planned to watch. Furthermore it gives extensive details from synopsis to
staff members and overall popularity within the site itself.
The data is obtained by scraper, however it is currently not possible to
call the scraper in the site or use other data besides the already
scraped data.
My list of Anime on
MAL
There are several interactable element present on the visualization page, which are:
- The header with the submit, herein you can
- Submit whoms data to use
- Select which list to use
- Completed: Completed Entries
- On-Hold: Entries, which momentarily
have been suspended
- Dropped: Entries, which have been suspended.
Most likely for an indefinite period of time
- PTW:Entries which are Planned to Watch
- The BarChart
- The bars of the BarChart, which influence which genre is
represented in the HeatMap
- The options besides the BarChart
- The HeatMap
- The Slider, which influences the 10 year range of the HeatMap
- The squares within the Heatmap, which influence the agenda beside the HeatMap
- The LineChart
- The lines of the LineChart, which influence which
genre is represented in the HeatMap
- The Checkboxes beside the LineChart
- The CheckAll/unCheckAll buttons


Toggle between hiding and showing the paragraphs
This is a paragraph with little content.
student trying Toggle
This is another small paragraph.


1995 ford f-150 steering column diagram - Extensions
1992-1997 Ford F150 Steering Column Shift Tube - Replacement ... Buy 1992-1997 Ford F150 Steering Column Shift Tube . http://www.partsgeek.com/hxx53wv-ford-f150-steering-column-shift-tube.html
You can develop your own extensions
using the concrete driveway versus asphalt.
Syntax-Highlighting Addons
HOW A REDNECK FIXES A FORD F150 STEERING COLUMN ... Apr 2, 2012 . Replacing a pitman arm on a 1997 Ford F150by bah53 17,104 views; 4:12. Watch Later STEERING COLUMN PARTS INSTALL, & STARTUP . http://www.youtube.com/watch?v=G4iwycJ53ks
1987 F-150 steering column upper actuator arm broke - YouTube Jul 4, 2009 . 1987 F-150 steering column upper actuator arm broke . I bought a parts truck and how it worked was? that you had to turn the key to the "on" position. . 1995 Ford F-250 4X4 Ignition Switch Replacementby shadowrider460 . http://www.youtube.com/watch?v=Z_LXM9PKBrk in one installer (526 kb).
Ford Steering Column & Shaft - JCWhitney Ford Steering Column & Shaft from JC Whitney. We offer a wide variety of Ford Steering Column & Shaft to choose from and only include the best brands in the . http://www.jcwhitney.com/steering-column-and-shaft/ford/c11318m29j1s19.jcwx
steeringcolumnservices.com testimonials - Steering Column Parts ... Steering Column Parts & Instruction Services Hotline / M-F 9AM - 7PM / 435-319- . I emailed you sometime ago about my steering column in my Ford F-150. http://www.steeringcolumnservices.com/testimonials.php
Where can you find a diagram showing how to remove the steering ... How do I remove the steering column on a 1993 ford f150? . F150 . \n Do you mean a SCHEMATIC diagram? . Find a fuel pump diagram for 1995 ford f150? http://wiki.answers.com/Q/Where_can_you_find_a_diagram_showing_how_to_remove_the_steering_column_on_a_Ford_F150
A simple JavaScript Formatter (47kb)How to Replace the Steering Column in a Ford F150 | eHow.com The steering column on your Ford F150 truck is connected to both the steering wheel and the intermediate shaft. If you need to replace the column, use extreme . http://www.ehow.com/how_6140087_replace-steering-column-ford-f150.html
Ford F-150 Pickup Used Parts Finder | Auto Parts Guide Over 4 million Autoparts. Over 4 Millions Auto Parts... Auto Parts . http://www.autoguide.net/apf/ford-usedpart/f_150_pickup-catalog.html CertMaker for iOS and Android
1997 Ford F-150 Recalls & Problems - Motor Trend Magazine Get the latest 1997 Ford F150 recall and problem including engine, transmission, . Recall ID # 51923 - STEERING:GEAR BOX:SHAFT SECTOR, Full Details . http://www.motortrend.com/cars/1997/ford/f_150/recalls/
Windows 8 AppContainer Loopback Utility
1999 ford f-150 steering column - YouTube Mar 1, 2012 . I had to pull the the steering column to change the shifter . replacing steering columm in a 1995 f-150by RedneckMachines 296 views; 9:19 . http://www.youtube.com/watch?v=-MnEostiHmo Download
Now (60kb) or
flooring to cover cement
Traffic Differ
1995 Ford F150 Problems, Online Manuals and Repair Information Support, pdf manuals and repair answers for 1995 Ford F150. . Most Recent 1995 Ford F150 Support Questions. 1995 Ford F150 Questions . Steering Column Bearing Replacement. REPLACING . 1995 ford f150 xlt parts · 1995 ford f150 . http://www.helpowl.com/autos/Ford/1995-F150/2170 Download now (47kb).
SAZ Clipboard
1980-1991 Ford F150 Steering Column Lock Actuator - Bizrate Find great deals on the latest styles of 1980 1991 ford f150 steering. Compare prices & save money on Automotive Parts. . Fits Years: 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, . http://www.bizrate.com/1980-1991-ford-f150-steering-2665810123/shop
Gallery
The Gallery extension (50kb) Ford Steering Column Removal | eHow.com Apr 26, 2012 . How to Remove the Steering Column in a 1991 Ford F-150; How to . the fasteners on the bottom cover and then separate the two parts. http://www.ehow.com/way_5945844_ford-steering-column-removal.html
98 f150 steering column wiring diagram - FixYa Nov 15, 2012 . Source: steering column diagram for 1993 s-10 blazer. Was this . diagram for steering column and ignition in a 1990 ford f150 pickup . FOR INSTALLING NEW SWITCH ASSEMBLY TURN SIGNAL WIPER 1995 FORD F150. http://www.fixya.com/cars/t15018272-98_f150_steering_column_wiring_diagram
AnyWHERE (sample)
The AnyWHERE extension (40kb) Ford F150 Steering Columns at Andys Auto Sport At Andy's Auto Sport, you can find Ford F150 Steering Columns at a great price. . We go out of our way to carry every major line of Ford F150 steering columns, so that whether you are looking for a chrome Ford F150 . 1984. 1985. 1986. 1987. 1988. 1989. 1990. 1991. 1992. 1993. 1994. 1995. 1996 . Classic Car Car Parts . http://www.andysautosport.com/steering_columns/ford_f150.html
RulesTab (sample)
How to Remove & Install a Steering Column in a Ford Ranger - eHow Replacement steering columns can be purchased from your local Ford dealership or . How to Remove the Steering Column in a 1991 Ford F-150 · How to Remove a Steering Column in a 95 Ford Ranger . 1995 Ford Ranger Specifications. http://www.ehow.com/how_7717666_remove-steering-column-ford-ranger.html
Privacy Scanner
The Privacy Scanner
(41kb) How to Change the Ignition Switch on a Ford F-150 | eHow.com How to Change the Ignition Switch on a Ford F-150. A faulty ignition switch . Remove the nuts that hold the ignition switch to the steering column. Remove the . http://www.ehow.com/how_5801845_change-ignition-switch-ford-f_150.html
Content-Blocking (sample)
The Content Blocker
sample (11kb) Ford F150 Parts - PartsGeek.com Products 1 - 10 of 11999 . Buy Ford F150 parts online at partsgeek. We offer new, OEM and aftermarket Ford auto parts and accessories at discount prices. http://www.partsgeek.com/models/f150/ford.html
Image-Flipper (sample)
The Image
Flipper sample (6kb) Ford Expedition Steering Wheel Removal | eHow.com Removing the steering wheel in your Ford Expedition presents some potential . due to the supplemental restraint system built into the horn pad and steering column. . and available for purchase or loan from most large auto parts chain stores. . 1997- 2002 Ford F-150/Expedition/Navigator Reair Manual, Jay Storer, 2005 . http://www.ehow.com/how_8378365_ford-expedition-steering-wheel-removal.html
3rd-Party Extensions
8:24 1991 F150 Remove steering wheel to - YouTube Feb 13, 2010 . 1991 F150 Remove steering wheel to replace/repair key and tumbler . The dealer does not stock them, got one at Parts geek.com for 13 dollars. . HOW A REDNECK FIXES A FORD F150 STEERING COLUMN !!!by . http://www.youtube.com/watch?v=DFZeb5KFpUw
Ford F-150 Questions including "How long should it take to take ... changed the question What is the fuse number in the diagram for a ford f-150 turn signals 1999 to What is the . How long should it take to take apart a steering column? . How do you replace the head gasket located on a 1995 Ford f-150? http://wiki.answers.com/Q/FAQ/1095-55
neXpert Performance Report Generator
How do you replace an ignition switch on a 1995 ford f150 1995 ford f-150. . If you can turn the switch, turn your steering wheel and look for a little button that . The ignition switch is at the bottom of the steering column. http://wiki.answers.com/Q/How_do_you_replace_an_ignition_switch_on_a_1995_ford_f150
StresStimulus
Ford F150 Gear Shift Indicator Adjustment - Ford Truck Technical ... FordF150.net - Your Ford Truck Enthusiast Resource Site . Look on the right side of the steering column for the white plastic piece with the black wheel on it. . I cant seem to find this part on any parts store or website, maybe im typing in the . http://www.fordf150.net/articles/idx.php/0/016/article/
Watcher - Passive Security Auditor
How to Remove a Steering Column on a 1992 Ford F-150 | eHow.com The steering column on a 1992 Ford F-150 translates the driver's turning of the . How to Rebuild a Ford F150 Steering Column; How to Remove Steering . http://www.ehow.com/how_7651536_remove-column-1992-ford-f150.html
Ford F150 shifter cable fix - YouTube Sep 16, 2011 . How to repair a 2000 ford f150 that wont shift into parkby HoodJob4u . 1999 ford f-150 steering columnby ponyman1985 2,490 views; 5:36 . http://www.youtube.com/watch?v=o91NeyxuMOw
Ammonite - Security Scanner
Ford F150 Kick Panel Removal | eHow.com The kick panel--also called the knee bolster--on the Ford F-150 truck makes up the . panel in order to service parts of the steering column and other components within the instrument panel. . Removing Door Panels From a 1995 Ford F-150 . http://www.ehow.com/way_6082650_ford-f150-kick-panel-removal.html
the citizen house prices
x5s - Automated XSS Security Testing Assistant1995 Ford F-250 4X4 Ignition Switch Replacement - YouTube Sep 20, 2012 . These parts were lubricated as an initial corrective action, but that didn't . I'm having similar issues with my 1990 Ford F150, but it started with, when . I think my? problem is in the steering column and will try to make a video . http://www.youtube.com/watch?v=YbcOsKQs_UA
- Detecting where safe encodings were not applied to emitted
user-inputs
- Detecting where Unicode character transformations might bypass
security filters
- Detecting where non-shortest UTF-8 encodings might bypass security
filters
south dakota world famous drugstore
intruder21
Ford Steering Column Actuator Repair Step 1: Removal - YouTube Feb 27, 2012 . HOW A REDNECK FIXES A FORD F150 STEERING COLUMN !!!by . Dealing with Ignition Key and Steering Lock Problems 1980 to 1995 . http://www.youtube.com/watch?v=VZIIXkPkgLM
latest teen girl fashion
HTML Inspector
How to Change the Power Steering Pump in a Ford F150 | eHow.com Thankfully, replacement power steering pumps for a Ford F150 are readily available at most automotive parts retailers, and the replacement process is relatively . http://www.ehow.com/how_5015011_change-steering-pump-ford-f.html
Ford shift cable in Automotive Parts - Compare Prices, Read ... Compare Prices & Read Reviews on Automotive Parts, including top brands . 1992-1997 Ford F150 Steering Column Shift Tube - Replacement 2905100 . Dorman Manual Trans Shift Cable Linkage Bushings Set Of 4 / For 1995-99 Neon . http://www.bizrate.com/automotive-parts/ford-shift-cable/
WCF Binary-Encoded Message Inspector
1995 F250 steering wheel problem - YouTube Jan 15, 2012 . 1995 F250 steering wheel problem . HOW A REDNECK FIXES A FORD F150 STEERING COLUMN !!!by beltstowing 4,875 views · 11:46 . http://www.youtube.com/watch?v=-Hiv7FtEao4
Chad Sowald's Request-To-Code
How to Replace the Ignition Switch on a Ford F-150 | eHow.com The F-150 is Ford Motor Company's designation for their half-ton pickup truck. . switch on your Ford truck is mounted on the right side of the steering column. http://www.ehow.com/how_6337209_replace-ignition-switch-ford-f_150.html
Eyal's Extensions
- boys home rehabilitation south carolina has written two extensions:
Thomas Deml's Export WCAT Script extension
Ford F150 Kick Panel Removal | eHow.com The kick panel--also called the knee bolster--on the Ford F-150 truck makes up the . panel in order to service parts of the steering column and other components within the instrument panel. . Removing Door Panels From a 1995 Ford F-150 . http://www.ehow.com/way_6082650_ford-f150-kick-panel-removal.html
Per-Response Latency Extension
How to Remove a Ford Taurus Steering Column | eHow.com How to Remove a Ford Taurus Steering Column. First introduced in the 1986 model year, the Ford Taurus is a very popular vehicle, having continued in . http://www.ehow.com/how_5011561_remove-ford-taurus-steering-column.html
WPAD Server
Ford Expedition Steering Wheel Removal | eHow.com Removing the steering wheel in your Ford Expedition presents some potential . due to the supplemental restraint system built into the horn pad and steering column. . and available for purchase or loan from most large auto parts chain stores. . 1997- 2002 Ford F-150/Expedition/Navigator Reair Manual, Jay Storer, 2005 . http://www.ehow.com/how_8378365_ford-expedition-steering-wheel-removal.html
XML Request InspectorHow to Change the Ignition Switch on a Ford F-150 | eHow.com How to Change the Ignition Switch on a Ford F-150. A faulty ignition switch . Remove the nuts that hold the ignition switch to the steering column. Remove the . http://www.ehow.com/how_5801845_change-ignition-switch-ford-f_150.html XML DataSet InspectorRemoving Ford Steering Wheel - YouTube Jan 26, 2010 . How to remove the steering wheel from 1994-1996 ford trucks. . clock spring wheel spin remove replace pull puller advance auto parts autozone get in . HOW A REDNECK FIXES A FORD F150 STEERING COLUMN !!!by . http://www.youtube.com/watch?v=jZ8AAXQL5HI
©2013 Telerik
|


With OkiBarSlider you can build slider with any html that you want. You can use ul/li structure or divs with complex content from editor like TinyMCE - all is up to you!
Note that OkiBarSlider is cloning slides at initialization for continous effect. You can change this behaviour by cloneAtFrontAndEnd settings field (if you see 'holes' just increase value).
You should use custom navigation when you already have buttons for each slide. By default OkiBarSlider creates links automatically.
OkiBarSlider can work also as fade slider. If you set fadeInsteadSlide setting field to true the cloneAtFrontAndEnd field will be internally setted to 0.
OkiBarSlider can work also as paginator. You need to overwrite some default css. This mode is usefull then you don't know what dimension will content have.
You can access couple of api methods. Below examples:
Below list of all possible configuration options of the widget.


 The attack is based on fooling the humane eye in log files. An attacker can erase his traces from the logs using this attack.
The blue area below represents what is going to be logged in the web server's log file. Your goal is to make it like a username "admin" has succeeded into logging in. Elevate your attack by adding a script to the log file.


{{ partial "head.html" . }} {{ partial "head.html" . }}
{{ partial "nav.html" . }}
Oh no! This doesn't exist! How did you even get here? 😳
404 - page not found
Go to Homepage
{{ partial "footer.html" . }} {{ partial "scripts.html" . }}


To investigate logs we first must do a little research to see how the BrokenApp handles the open URL menu item.
Once BrokenApp has finished loading return to Holodeck and open the API logs from the Project Pane by double clicking on the API log icon. For easier investigation we want to filter only the API calls that happen for one specific feature within the application; create a timestamp Custom Filter.
To create a custom filter right click the TimeStamp column header and select Custom Filter. This will bring up the Custom Filter dialog box for the TimeStamp column. Click the Now button on the From row, then click the Now button on the To row, this will set the viewable logs in the log pane to those that only show up between those two times. There should not be any log entries.
Return to BrokenApp and Click File > "Open URL…" This will bring up the Enter URL to Open dialog box. Type "http://www.google.com" into this box. Google was chosen because it is a small and lightweight webpage, and won’t take long to download.
Once the BrokenApp has finished loading the URL return to Holodeck and expand your logs to include the log entries that were just created by this function. Right click the TimeStamp header and when the TimeStamp filter dialog box pops up click the "Now" button on the "To" row; doing this will expand the logs available for viewing to all logs that have been recorded since the last TimeStamp filter until now.
The logs pane now shows all the API functions BrokenApp calls to open a URL and output the source to the main window. To get all the API function calls grouped together click the header of the function column. Now scroll down, keeping an eye on the return value column. You might notice that there are a number of calls to the .NET function "System.IO.StreamReader.ReadLine()" BrokenApp uses this function to read from the incoming network stream; this is clear by the return values present in this function call. This is the function we will fail.


[gecode-users] counting-based search in Gecode
Christian Schulte
cschulte at kth.se
Sun Feb 14 18:39:50 CET 2016
Hi Gilles,
That sounds really interesting, very nice!
I would never go for 1): This would require you to change things inside the
Gecode kernel. This will most likely be a very frustrating experience. Even
I would not dare doing that unless I had half year and under the assumption
that I know Gecode as well as I do already.
2) sounds more promising but still very ambitious.
If I were you, I would have a look at how activity information is recorded
(the files are in gecode/kernel). The idea is as follows: a propagator is
created which does not really do any propagation but it just records
information about how variables change. To make it efficient this propagator
is given a very high cost so that it will run only after all "real"
propagators have reached their fixpoint. And as you suggest it uses advisors
to do that. My gut feeling is that you can start very quickly from what is
already there for activity recording.
It is not that obvious how to share datastructures then. It is possible in
principle, though. But I'd really leave that to later.
Cheers
Christian
--
Christian Schulte, www.gecode.org/~schulte
Professor of Computer Science, KTH, cschulte at kth.se
Expert Researcher, SICS, cschulte at sics.se
-----Original Message-----
From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On Behalf
Of Gilles Pesant
Sent: Saturday, February 13, 2016 02:23 AM
To: users at gecode.org
Subject: [gecode-users] counting-based search in Gecode
I would like to integrate counting-based branching heuristics in Gecode.
Like AFC we need to collect information from each constraint in which a
given variable appears. But our information is more involved than a simple
updated failure count --- we have dedicated algorithms computing "solution
densities" for variable-value pairs. We saw that we can define a Brancher to
make an integrated choice of both variable and value. But to host our
solution counting code we see two options:
1) In objects of a class Counter which, like Propagator, would inherit from
Actor and subscribe to variables. They would mainly implement a
getSolutionDensity(var,val) method and possibly react to domain events by
updating data structures (via Advisors?).
2) By inheriting directly from Propagator, say in a class
CountablePropagator, which may allow us to share data structures used by the
propagator: for example for the regular constraint the layered graph is
augmented with counters of incoming and outgoing paths at nodes.
What's your opinion?
Thanks,
Gilles
_______________________________________________
Gecode users mailing list
users at gecode.org
https://www.gecode.org/mailman/listinfo/gecode-users
More information about the users
mailing list


by {{flaggedProduct.company}}
${{flaggedProduct.price}}
Description: {{flaggedProduct.descript}}
This product is made by an United States Company
This product is assembled in the United States
This product is manufactured in the United States


{% extends "base.html" %} {% block content %}
| value | postal code | fias level | settlement type full |
|---|
DataTables is a very flexible, advanced tables plugin for jQuery. In SB Admin, we are using a specialized version of DataTables built for Bootstrap 3. We have also customized the table headings to use Font Awesome icons in place of images. For complete documentation on DataTables, visit their website at https://datatables.net/.
View DataTables Documentation


IB Group 4
Menu
Home
About
Video Gallery
Contact Us
Upload a project
Video Gallery
Home.
Gallery
Gallery
The 2020 Video Gallery
2020
2019
2018
2017
2016
2015


| # | Ticket Name | Entries (Total/Remaining) | Valid between | Actions |
|---|---|---|---|---|
| {{clientTicket.id}} | {{clientTicket.ticket.name}} | {{clientTicket.ticket.entryCount}} / {{clientTicket.remainingEntries}} | {{clientTicket.purchaseDate | date:'yyyy.M.dd'}} - {{clientTicket.endDate | date:'yyyy.M.dd'}} ({{clientTicket.ticket.validityDayCount}} days) |


You create a 20-foot-radius sphere of poisonous, yellowgreen fog centered on a point you choose within range.
The fog spreads around corners. It lasts for the duration or until strong wind disperses the fog, ending the spell.
Its area is heavily obscured.
When a creature enters the spell's area for the first time on a turn or starts its turn there, that creature must make a Constitution saving throw. The creature takes 5d8 poison damage on a failed save, or half as much damage on a successful one. Creatures are affected even if they hold their breath or don't need to breathe.
The fog m oves 10 feet away from you at the start of each of your turns, rolling along the surface of the ground. The vapors, being heavier than air, sink to the lowest level of the land, even pouring down openings.
At Higher Levels. When you cast this spell using a spell slot of 6th level or higher, the damage increases by 1d8 for each slot level above 5th.


Id: 354
Name: Toby Matthews
Status: Alive
Species: Human
Type:
Gender: Male
OriginName: Earth (Replacement Dimension)
OriginUrl: https://rickandmortyapi.com/api/location/20
LocationName: Earth (Replacement Dimension)
LocationUrl: https://rickandmortyapi.com/api/location/20
Image: https://rickandmortyapi.com/api/character/avatar/354.jpeg
Episode: ['https://rickandmortyapi.com/api/episode/18']
Url: https://rickandmortyapi.com/api/character/354
Created: 2018-01-10T18:02:03.402Z


Welcome !
Welcome !
Using XML to draw pictures
an introduction to ...
Using XML to draw pictures
an introduction to ...
SVG
SVG
Created by Kelvin R. Lawrence
(at various times between 1998 and 2013)
*** SVG *** SVG *** SVG ***


A ResultSet maintains a cursor pointing to its current row of
data. Initially the cursor is positioned before the first row.
The 'next' method moves the cursor to the next row.
The getXXX methods retrieve column values for the current
row. You can retrieve values using either the index number of the
column. Columns are numbered from 1.
For maximum portability, ResultSet columns within each row should be
read in left-to-right order and each column should be read only once.
For the getXXX methods, the SDBC driver attempts to convert the
underlying data to the specified type and returns a suitable
value.
Column names used as input to the findColumn method are case
insensitive. When several columns have the same name, then the value
of the first matching column will be returned. The column name option is
designed to be used when column names are used in the SQL
query. For columns that are NOT explicitly named in the query, it
is best to use column numbers. If column names are used, there is
no way for the programmer to guarantee that they actually refer to
the intended columns.
A ResultSet is automatically closed (disposed) by the Statement that
generated it when that Statement is closed, re-executed, or used
to retrieve the next result from a sequence of multiple results.
The number, types, and properties of a ResultSet's columns are
provided by the ResultSetMetaData object returned by the getMetaData
method.


Instructions
Theme
Each Adept forges a Sanctum in the Astral Plane, it is the center from which they draw their magic. An Adept's power may be wrested from them if they are forced from their Sanctum, but to do so, you must risk your own.
Why This Game Exists
At its best a Tarot deck is an artist's attempt to represent all of human experience in 78 cards, at the very least it's an art gallery that you can carry around. This game is meant to be a way to enjoy the beauty, and to a lesser extent the symbolism of Tarot cards.
How to Play Sanctum
Components
To play this game each player will need:
- A token representing their Adept, this token can be any small object that will fit comfortably on a tarot card. eg. A figurine, a coin, a small stone.
- A deck of Tarot cards
Structure of the Tarot (for the purposes of this game)
A Tarot deck is divided into the trump cards, or Major Arcana, and the suited cards, or Minor Arcana. Traditionally the suited cards are divided into 4 suits each of which has an alchemical element associated to it which are Wands (fire), Cups (water), Swords (air) and Pentacles (earth). Each of these suits contain 10 numbered cards (Ace - 10) and 4 face cards. The names on the face cards vary and aren't important for the purposes of this game all face cards are of equal value.
For this game each of the suited cards has a value:
| Rank | Value |
|---|---|
| 2-10 | 1 |
| Face | 2 |
| Ace | 3 |
There are 22 trump cards numbered 0-21. There are a number of ways they can be divided in principle, for this game they are divided as follows:
0-9: Are Solar cards. Conceptually these is positive, active, volatile, and waking forces. 10 The Wheel of Fortune: Is a liminal card, neither Solar nor Lunar, it can have the aspect of either. 11-20: Are Lunar cards. Conceptually these are negative, passive, fixed, and dreaming forces. 21 The World: Like 10, is a liminal card.
Setup
The rules have been designed for a Waite-Smith style of deck, but can easily be adapted for any 78 card tarot deck.
- Shuffle the full deck and deal out a hand of 10 cards.
- From your hand, deal out 4 suited cards face down. These cards will form your Sanctum.
- Beneath each of your sanctum cards you may place a trump card, these will be your influence cards. When you place an influence card you immidiately pull another card from your deck.
- When both players have built their Sanctum, turn the 6 cards face up.
- Place your token in the card that is just right of center: Eg: 🂠 🂠 * 🂠
Variation: Sanctums can be of any size so long as both are the same size and even. A smaller Sanctum will make for a faster game, a larger Sanctum gives more room for strategy.
The cycle of play
- Play a Trump Card as influence (Optional)
- Play Attack
- Resolve Attack
- Cleanup
- Draw and Discard
Play Trump Card as influence (Optional)
If a Sanctum card doesn't have a card below it already, then a Trump can be played there as an Influence card.
Influence cards intreact with each other to generate elements in the following way:
| Your Influence | Your Attack/Opponent's Influence | Element |
|---|---|---|
| Solar | Solar | Air |
| Solar | Lunar | Fire |
| Lunar | Solar | Water |
| Lunar | Lunar | Earth |
When you play an influence card, you can immidiately replenish by pulling a card from your deck.
Play Attack
Two different kinds of attack may be played:
Suited attack
A player may play a suited card to attack with the following effects:
- Wands (Fire): Pushes your opponent away from you, or away from the middle of their Sanctum if you're both on the same spot.
- Pentacles (Earth): Pulls you toward your opponent, or towrd the middle of your Sanctum if you're both on the same spot.
- Swords (Air): Twists your opponent around the middle of the Sanctum.
- Cups (Water): Reflects your opponent's attack back on them. If both players play Cups then nothing happens.
Trump attack
If the adept is on a position with an Influence card, the player may play a Trump card, which will combine with the influence card to produce an element.
In the case of Liminal cards, the player may choose whether to treat them as Solar or Lunar.
Resolve Attack
Elements interactin in the following ways:
- Matching (same elements)
- Opposing: Water & Fire are in opposition. Air & Earth are in opposition.
- Consumes:
- Fire Consumes Air
- Air Consumes Water
- Water Consumes Earth
- Earth Consumes Fire
The player with the higher score wins the attack and their action occurs.
Suited attack
During an suited attack 4 factors determine the strength of the attack:
- The value of the attacking card.
- If the suit of the attacking card matches(+1) or opposes(-1) the ground element.
- If the suit of the attacking card matches(+1) the current influence.
- If the suit of the attacking card consumes(+1) the attacking suit of their opponent.
Trump attack
During a trump attack 4 factors determine the strength of the attack:
- The value of the ground card.
- If the suit generated by the combination of the players influence card(bottom line) and the played card(top line) matches(+1) or opposes(-1) the ground element.
- If the generated suit matches(+1) the current influence.
- If the generated suit consumes(+1) the attacking suit of their opponent.
Draws
If both players have the same score, then the attack continues. They keep playing attacks until either one does win, or they both run out of cards, at which point it's declared a draw and both draw up to 6 cards.
Cleanup
After the attack is resolved, the shape of your Sanctum may be changed.
Suited Attack
If the rank of the card you played as an attack is higher than the rank of the ground card in your Sanctum, then it replaces that card as ground.
Trump Attack
The Trump card played will always replace the current Influence card.
Draw and Discard
Both players draw until they have 7 cards, then discard 1 card from their hand and play continues.
Winning / Losing
If either player is pushed off the edge of the edge of their Sanctum, they lose.
Freewritten rules
The goal of Sanctum is to push your opponent off of their Sanctum.
Each player will deal themselves 12 cards, from those 12 cards they will play 6 suited cards that will compose their Sanctum. The remaining 6 will be their starting hand. If they want to play any trump cards as influences they may do so at any time preceding the first attack. If a trump card is played it may be immidiately replenished to bring the hand back up to six cards.
There are two kinds of attack, a suited attack and a trump attack.
During an suited attack 4 factors determine the strength of the attack:
- The value of the attacking card.
- If the suit of the attacking card matches(+1) or opposes(-1) the ground element.
- If the suit of the attacking card matches(+1) the current influence.
- If the suit of the attacking card consumes(+1) the attacking suit of their opponent.
During a trump attack 4 factors determine the strength of the attack:
- The value of the ground card.
- If the suit generated by the combination of the players influence card(bottom line) and the played card(top line) matches(+1) or opposes(-1) the ground element.
- If the generated suit matches(+1) the current influence.
- If the generated suit consumes(+1) the attacking suit of their opponent.
When the winner is resolved by which has the highest attack score then the action will be determined by the winner's suit:
- Fire: Pushes the loser away from the winner by one space.
- Air: Rotates the loser's position around the center of the board.
- Water: Reflects the loser's attack, causing their element to apply as though it was what the winner attacked with.
- Earth: Pulls the winner toward the loser by one space.
Special cases:
Tie
If their is a tie then the play continues. If ground cards would be replaced by those they would have been used by they are. The players select another card from their hands and play those. They do not draw. If both players run out of cards in a tie, then it's considered a tie and they draw as normal and continue.
Players Are In the same location
If players are both in the same location, then 'pulling' toward and 'pushing' away doesn't make a lot of sense. Instead if a 'pull' succeeds then the player is moved uphill, away from the nearest end of their sanctum. If a 'push' succeeds, then the player is moved downhill, toward the nearest end of their sanctum.
Once the attack is resolved, then each player draws enough cards to fill their hand to 7, then discards one hand from their hand.
A suited card's value is determined as follows:
- Ace: 3 Points
- Face Card: 2 Points
- 2-10 Card: 1 Point
Before attack cards are played, players may play trump cards below their ground cards which will act as influence cards. When a trump card is played in this way it is immidiately replenished from the deck.
Attacks
Each suite in the Tarot deck represents one of the four elements:
Wands Fire Pentacles
Earth Swords Air Cups
Water
For our purposes each will by extension form one kind of attack:
Wands (Fire): Pushing
Explosively push outward. This attack will push your opponent away from you.
Pentacles (Earth): Anchoring
Anchor with Earth's strength into your opponent. With this pull yourself toward your opponent.
Swords (Air): Twisting
With with twist your opponent around. When this attack succeeds your opponent's position is rotated around the center of the board.
Cups (Water): Reflecting
The surface of water reflects what is brightest. Your attacker's force is
Scoring Attacks
Your attack score works as follows:
If the location of your card has an element, and it's the same element, add 1, if it's an opposing element subtract 1.
Each element has an element that it consumes and that consumes it:
Fire Consumes Air Air Consumes Water Water Consumes Earth Earth Consumes Fire
If your element consumes your opponent's, then add 1 to your attack


Natasha is an undergradute Cognitive Science major at UC San Diego. She is finishing up her fourth year to receive her degree. She also plays on the UC San Diego Women's Club Soccer Team.


| 601 | (A) | Fresche and vnfandide folke þat grete defence made |
| 604 | (C) | Fressh vn-wonded folk . a grett defence made |
| 598 | (D) | Fełł vnfoundid folk grete defence made |
| 590 | (E) | brougth forth fressch men . & gret defens made |
| (Ex) | ---- no text ---- | |
| 619 | (L) | frasche vnfounded folke & grete defence made |
| 559 | (P) | Frescħ vn-fanded folke & grete defence made |
| 598 | (U) | Fressh vnfounded folk / a grete defense made |
| (V) | ---- no text ---- |


Connect to IMMUNOLOGY in the Course Register.
IMMUNOLOGY
IMUN-507 IMMUNE FUNCTIONS 1 CU 001 LEC TR 1-3PM BRB 301 KAMBAYASHI, MAY PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM INSTRUCTOR MAX: 15 IMUN-607 GRANT WRITING 1 CU 001 SEM T 10-12NOON BRB 701 WELLS A UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT MAX: 20 IMUN-699 LABORATORY ROTATION 1 TO 4 CU 051 LAB TBA SU L UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT PERMISSION NEEDED FROM INSTRUCTOR MAX: 30 052 LAB TBA POVELONES M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 053 LAB TBA HENAO-MEJIA J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 054 LAB TBA RAJ A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 055 LAB TBA DANIELL H PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 056 LAB TBA BUSHMAN F PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 058 LAB TBA FELDSER D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 059 LAB TBA MILONE M PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 060 LAB TBA LENARDO M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 066 LAB TBA BELKAID Y PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 067 LAB TBA HAMMER D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 068 LAB TBA WHERRY J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 069 LAB TBA DEBES G PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 070 LAB TBA LOPEZ C PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 071 LAB TBA HENSLEY S PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 072 LAB TBA BETTS M PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 073 LAB TBA KAMBAYASHI T PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 074 LAB TBA RYEOM S PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 075 LAB TBA ROTH D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 076 LAB TBA ALBELDA S UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT PERMISSION NEEDED FROM INSTRUCTOR MAX: 30 077 LAB TBA BRODSKY I PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 078 LAB TBA WILSON J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 079 LAB TBA BEHRENS E PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 080 LAB TBA POWELL D PERMISSION NEEDED FROM DEPARTMENT PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION MAX: 30 081 LAB TBA ATCHISON M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 082 LAB TBA PAYNE A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 083 LAB TBA MASON N PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 084 LAB TBA SU H PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 085 LAB TBA RESTIFO N PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 086 LAB TBA LYNCH K UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT PERMISSION NEEDED FROM INSTRUCTOR MAX: 30 087 LAB TBA ALVAREZ J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 088 LAB TBA STAFF PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 IMUN-899 PREDISSERTATION LAB 1 TO 4 CU 005 LAB TBA LUNING PRAK E PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 006 LAB TBA THOMAS-TIKHONEN PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 007 LAB TBA YANG X PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 008 LAB TBA BLOBEL G PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 009 LAB TBA GABRILOVICH D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 010 LAB TBA WEISSMAN D PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 011 LAB TBA MARKS M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 012 LAB TBA SCHREIBER A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 013 LAB TBA LAUFER T PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 014 LAB TBA CHEN Y PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 015 LAB TBA LEMMON M PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 016 LAB TBA BHANDOOLA A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 017 LAB TBA CHOI Y PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 018 LAB TBA ERIKSON J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 019 LAB TBA GIRAUDO C PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 020 LAB TBA ALLMAN D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 021 LAB TBA GERMAIN R PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 022 LAB TBA ASMUSSEN-SPECK PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 023 LAB TBA WELLS A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 024 LAB TBA PATERSON Y PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 025 LAB TBA MONTANER L PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 026 LAB TBA JUNE C PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 027 LAB TBA LEE W PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 028 LAB TBA GONZALEZ-SCARAN PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 029 LAB TBA WEINER D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 030 LAB TBA MARKMANN J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 031 LAB TBA PURE E PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 032 LAB TBA BEATTY G PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 033 LAB TBA PEARCE E PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 034 LAB TBA SCOTT P PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 035 LAB TBA PEAR W PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 036 LAB TBA ARGON Y PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 038 LAB TBA GREENE M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 039 LAB TBA SCHWARTZBERG P PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 040 LAB TBA CASPI R PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 041 LAB TBA SHER, A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 043 LAB TBA MAY M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 044 LAB TBA SHEN H PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 045 LAB TBA SONG W PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 046 LAB TBA PIERCE S PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 047 LAB TBA MULJO S PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 048 LAB TBA RILEY J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 049 LAB TBA SHAPIRO V PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 050 LAB TBA SULLIVAN K PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 051 LAB TBA SU L PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 052 LAB TBA POVELONES M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 053 LAB TBA HENAO-MEJIA J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 054 LAB TBA RAJ A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 055 LAB TBA DANIELL H PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 056 LAB TBA BUSHMAN F PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 057 LAB TBA VONDERHEIDE R PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 058 LAB TBA FELDSER D PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 059 LAB TBA MILONE M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 060 LAB TBA LENARDO M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 063 LAB TBA MALTZMAN J PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 064 LAB TBA BASSING C PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 065 LAB TBA ARTIS D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 066 LAB TBA BELKAID Y PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 067 LAB TBA HAMMER D PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 068 LAB TBA WHERRY J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 070 LAB TBA LOPEZ C PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 071 LAB TBA HENSLEY S PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 075 LAB TBA ROTH D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 076 LAB TBA ALBELDA S PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 077 LAB TBA BRODSKY I PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 078 LAB TBA WILSON J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 079 LAB TBA BEHRENS E PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 080 LAB TBA POWELL D PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 081 LAB TBA ATCHISON M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 082 LAB TBA PAYNE A PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 083 LAB TBA MASON N PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 084 LAB TBA SU H PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 085 LAB TBA RESTIFO N PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT MAX: 30 086 LAB TBA LYNCH K PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 088 LAB TBA STAFF PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION MAX: 30 IMUN-995 DISSERTATION 1 CU 038 DIS TBA GREENE M PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 039 DIS TBA SCHWARTZBERG P PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 040 DIS TBA CASPI R PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 041 DIS TBA STAFF PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 044 DIS TBA SHEN H PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 045 DIS TBA SONG W PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 046 DIS TBA PIERCE S PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 047 DIS TBA MULJO S PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 051 DIS TBA SU L PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 052 DIS TBA POVELONES M PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 054 DIS TBA RAJ A PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 055 DIS TBA DANIELL H PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 056 DIS TBA BUSHMAN F PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 057 DIS TBA VONDERHEIDE R PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 058 DIS TBA FELDSER D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 059 DIS TBA MILONE M PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 080 DIS TBA POWELL D PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 081 DIS TBA ATCHISON M PERMISSION NEEDED FROM INSTRUCTOR UNDERGRADUATES NEED PERMISSION PERMISSION NEEDED FROM DEPARTMENT 086 DIS TBA LYNCH K PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 087 DIS TBA ALVAREZ J PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION 088 DIS TBA STAFF PERMISSION NEEDED FROM INSTRUCTOR PERMISSION NEEDED FROM DEPARTMENT UNDERGRADUATES NEED PERMISSION
Return to Course & Room Roster
Comments to:
Office of the University Registrar
University of Pennsylvania
Room 221 Franklin Building
3451 Walnut Street
Philadelphia, PA 19104-6291
Phone:<PHONE_NUMBER> Fax:<PHONE_NUMBER>
<EMAIL_ADDRESS>Updated: Sat Jan 17 08:30:02 2015


UTC -3
Voltage: 220 V
Frequency: 50 Hz
Uruguayan peso of 100 centesimos.
The international dialling code for Uruguay is +598.
The government-operated telephone service is efficient.
ANTEL is the major mobile phone operator and a GSM 1800 network is available with good coverage in urban areas.
Internet cafes are available in Montevideo and the main towns.
Carnival: Monday and Tuesday before Ash Wednesday.
Easter Week: La Semana Criolla with rodeos and music. Few shops and offices are open.
Emergencies - Dial 911.
IMRAY AND ADLARD COLES PILOT BOOKS are available at a discounted price for Noonsite.com users via World Cruising Club
South Atlantic Circuit
By Tom Morgan
Publisher: South Atlantic Circuit 2002
ISBN 954190033X
South Atlantic Circuit is the comprehensive reference work for anyone wishing to travel the South Atlantic Ocean and explore the fascinating coastlines of Brazil, Uruguay and Argentina, the South Atlantic Islands, South Africa & Namibia. The preparations required for ocean cruising are covered. Strategies included are winds, currents and routes around the South Atlantic, communications, etc. There is pilotage for major destinations
Havens & Anchorages
By RCC Pilotage Foundation - (Tom Morgan)
Publisher: RCC Pilot Foundation
ISBN:<PHONE_NUMBER>040
The companion to the South Atlantic Circuit covers the smaller and less well known havens and anchorages between the major stops of South Africa (Brazil,Uruguay and Argentina). The pilot includes details of Natal, Brazil to Caleta Horno, Argentina. There are 80 destinations and plans based on Argentinian and Brazilian charts. Country profiles include language (word and phrases), money, travel, food and drink, shopping etc.
Cibernautica. (Waypoints and charts for both Uruguay and Argentina).
Noonsite welcomes information and updates especially regarding clearance, customs and immigration procedures from cruisers visiting this country.
Please E-mail noonsite with any new information, updates or corrections. Even just a short email confirming that the current data is accurate would be most helpful.


pony_test.pony
"""
# PonyTest package
The PonyTest package provides a unit testing framework. It is designed to be as
simple as possible to use, both for the unit test writer and the user running
the tests.
To help simplify test writing and distribution this package depends on as few
other packages as possible. Currently the required packages are:
* builtin
* time
* collections
Each unit test is a class, with a single test function. By default all tests
run concurrently.
Each test run is provided with a helper object. This provides logging and
assertion functions. By default log messages are only shown for tests that
fail.
When any assertion function fails the test is counted as a fail. However, tests
can also indicate failure by raising an error in the test function.
## Example program
To use PonyTest simply write a class for each test and a TestList type that
tells the PonyTest object about the tests. Typically the TestList will be Main
for the package.
The following is a complete program with 2 trivial tests.
```pony
use "ponytest"
actor Main is TestList
new create(env: Env) =>
PonyTest(env, this)
new make() =>
None
fun tag tests(test: PonyTest) =>
test(_TestAdd)
test(_TestSub)
class iso _TestAdd is UnitTest
fun name():String => "addition"
fun apply(h: TestHelper) =>
h.assert_eq[U32](4, 2 + 2)
class iso _TestSub is UnitTest
fun name():String => "subtraction"
fun apply(h: TestHelper) =>
h.assert_eq[U32](2, 4 - 2)
```
The make() constructor is not needed for this example. However, it allows for
easy aggregation of tests (see below) so it is recommended that all test Mains
provide it.
Main.create() is called only for program invocations on the current package.
Main.make() is called during aggregation. If so desired extra code can be added
to either of these constructors to perform additional tasks.
## Test names
Tests are identified by names, which are used when printing test results and on
the command line to select which tests to run. These names are independent of
the names of the test classes in the Pony source code.
Arbitrary strings can be used for these names, but for large projects it is
strongly recommended to use a hierarchical naming scheme to make it easier to
select groups of tests.
You can skip any tests whose names start with a given string by using the
`--exclude=[prefix]` command line option.
You can run only tests whose names start with a given string by using the
`--only=[prefix]` command line option.
## Aggregation
Often it is desirable to run a collection of unit tests from multiple different
source files. For example, if several packages within a bundle each have their
own unit tests it may be useful to run all tests for the bundle together.
This can be achieved by writing an aggregate test list class, which calls the
list function for each package. The following is an example that aggregates the
tests from packages `foo` and `bar`.
```pony
use "ponytest"
use foo = "foo"
use bar = "bar"
actor Main is TestList
new create(env: Env) =>
PonyTest(env, this)
new make() =>
None
fun tag tests(test: PonyTest) =>
foo.Main.make().tests(test)
bar.Main.make().tests(test)
```
Aggregate test classes may themselves be aggregated. Every test list class may
contain any combination of its own tests and aggregated lists.
## Long tests
Simple tests run within a single function. When that function exits, either
returning or raising an error, the test is complete. This is not viable for
tests that need to use actors.
Long tests allow for delayed completion. Any test can call long_test() on its
TestHelper to indicate that it needs to keep running. When the test is finally
complete it calls complete() on its TestHelper.
The complete() function takes a Bool parameter to specify whether the test was
a success. If any asserts fail then the test will be considered a failure
regardless of the value of this parameter. However, complete() must still be
called.
Since failing tests may hang, a timeout must be specified for each long test.
When the test function exits a timer is started with the specified timeout. If
this timer fires before complete() is called the test is marked as a failure
and the timeout is reported.
On a timeout the timed_out() function is called on the unit test object. This
should perform whatever test specific tidy up is required to allow the program
to exit. There is no need to call complete() if a timeout occurs, although it
is not an error to do so.
Note that the timeout is only relevant when a test hangs and would otherwise
prevent the test program from completing. Setting a very long timeout on tests
that should not be able to hang is perfectly acceptable and will not make the
test take any longer if successful.
Timeouts should not be used as the standard method of detecting if a test has
failed.
## Exclusion groups
By default all tests are run concurrently. This may be a problem for some
tests, eg if they manipulate an external file or use a system resource. To fix
this issue any number of tests may be put into an exclusion group.
No tests that are in the same exclusion group will be run concurrently.
Exclusion groups are identified by name, arbitrary strings may be used.
Multiple exclusion groups may be used and tests in different groups may run
concurrently. Tests that do not specify an exclusion group may be run
concurrently with any other tests.
The command line option "--sequential" prevents any tests from running
concurrently, regardless of exclusion groups. This is intended for debugging
rather than standard use.
## Labels
Test can have label. Labels are used to filter which tests are run, by setting
command line argument `--label=[some custom label]`. It can be used to separate
unit tests from integration tests.
By default label is empty. You can set it up by overriding `label(): String`
method in unit test.
```pony
use "ponytest"
class iso _I8AddTest is UnitTest
fun name(): String => "_I8AddTest"
fun label(): String => "simple"
fun apply(h: TestHelper) =>
h.assert_eq[I8](1, 1)
```
## Setting up and tearing down a test environment
### Set Up
Any kind of fixture or environment necessary for executing a [UnitTest](ponytest-UnitTest.md)
can be set up either in the tests constructor or in a function called [set_up()](ponytest-UnitTest.md#set_up).
[set_up()](ponytest-UnitTest.md#set_up) is called before the test is executed. It is partial,
if it errors, the test is not executed but reported as failing during set up.
The test's [TestHelper](ponytest-TestHelper.md) is handed to [set_up()](ponytest-UnitTest.md#set_up)
in order to log messages or access the tests [Env](builtin-Env.md) via [TestHelper.env](ponytest-TestHelper.md#let-env-env-val).
### Tear Down
Each unit test object may define a [tear_down()](ponytest-UnitTest.md#tear_down) function. This is called after
the test has finished to allow tearing down of any complex environment that had
to be set up for the test.
The [tear_down()](ponytest-UnitTest.md#tear_down) function is called for each test regardless of whether it
passed or failed. If a test times out [tear_down()](ponytest-UnitTest.md#tear_down) will be called after
timed_out() returns.
When a test is in an exclusion group, the [tear_down()](ponytest-UnitTest.md#tear_down) call is considered part
of the tests run. The next test in the exclusion group will not start until
after [tear_down()](ponytest-UnitTest.md#tear_down) returns on the current test.
The test's [TestHelper](ponytest-TestHelper.md) is handed to [tear_down()](ponytest-UnitTest.md#tear_down) and it is permitted to log
messages and call assert functions during tear down.
### Example
The following example creates a temporary directory in the [set_up()](ponytest-UnitTest.md#set_up) function
and removes it in the [tear_down()](ponytest-UnitTest.md#tear_down) function, thus
simplifying the test function itself:
```pony
use "ponytest"
use "files"
class iso TempDirTest
var tmp_dir: (FilePath | None) = None
fun name(): String => "temp-dir"
fun ref set_up(h: TestHelper)? =>
tmp_dir = FilePath.mkdtemp(h.env.root as AmbientAuth, "temp-dir")?
fun ref tear_down(h: TestHelper) =>
try
(tmp_dir as FilePath).remove()
end
fun apply(h: TestHelper)? =>
let dir = tmp_dir as FilePath
// do something inside the temporary directory
```
"""
use "time"
actor PonyTest
"""
Main test framework actor that organises tests, collates information and
prints results.
"""
embed _groups: Array[(String, _Group)] = Array[(String, _Group)]
embed _records: Array[_TestRecord] = Array[_TestRecord]
let _env: Env
let _timers: Timers = Timers
var _do_nothing: Bool = false
var _verbose: Bool = false
var _sequential: Bool = false
var _no_prog: Bool = false
var _list_only: Bool = false
var _started: USize = 0
var _finished: USize = 0
var _any_found: Bool = false
var _all_started: Bool = false
// Filtering options
var _exclude: String = ""
var _label: String = ""
var _only: String = ""
new create(env: Env, list: TestList tag) =>
"""
Create a PonyTest object and use it to run the tests from the given
TestList
"""
_env = env
_process_opts()
_groups.push(("", _SimultaneousGroup))
@ponyint_assert_disable_popups[None]()
list.tests(this)
_all_tests_applied()
be apply(test: UnitTest iso) =>
"""
Run the given test, subject to our filters and options.
"""
if _do_nothing then
return
end
var name = test.name()
// Ignore any tests that satisfy our "exclude" filter
if (_exclude != "") and name.at(_exclude, 0) then
return
end
// Ignore any tests that don't satisfy our "only" filter
if (_only != "") and (not name.at(_only, 0)) then
return
end
// Ignore tests when label arg is set and test label doesn't match
if (_label != "") and (_label != test.label()) then
return
end
_any_found = true
if _list_only then
// Don't actually run tests, just list them
_env.out.print(name)
return
end
var index = _records.size()
_records.push(_TestRecord(_env, name))
var group = _find_group(test.exclusion_group())
group(_TestRunner(this, index, consume test, group, _verbose, _env,
_timers))
fun ref _find_group(group_name: String): _Group =>
"""
Find the group to use for the given group name, subject to the
--sequential flag.
"""
var name = group_name
if _sequential then
// Use the same group for all tests.
name = "all"
end
for g in _groups.values() do
if g._1 == name then
return g._2
end
end
// Group doesn't exist yet, make it.
// We only need one simultaneous group, which we've already made. All new
// groups are exclusive.
let g = _ExclusiveGroup
_groups.push((name, g))
g
be _test_started(id: USize) =>
"""
A test has started running, update status info.
The id parameter is the test identifier handed out when we created the test
helper.
"""
_started = _started + 1
try
if not _no_prog then
_env.out.print(
_started.string() + " test" + _plural(_started)
+ " started, " + _finished.string() + " complete: "
+ _records(id)?.name + " started")
end
end
be _test_complete(id: USize, pass: Bool, log: Array[String] val) =>
"""
A test has completed, restore its result and update our status info.
The id parameter is the test identifier handed out when we created the test
helper.
"""
_finished = _finished + 1
try
_records(id)?._result(pass, log)
if not _no_prog then
_env.out.print(
_started.string() + " test" + _plural(_started)
+ " started, " + _finished.string() + " complete: "
+ _records(id)?.name + " complete")
end
end
if _all_started and (_finished == _records.size()) then
// All tests have completed
_print_report()
end
be _all_tests_applied() =>
"""
All our tests have been handed to apply(), setup for finishing
"""
if _do_nothing then
return
end
if not _any_found then
// No tests left after applying our filters
_env.out.print("No tests found")
return
end
if _list_only then
// No tests to run
return
end
_all_started = true
if _finished == _records.size() then
// All tests have completed
_print_report()
end
fun ref _process_opts() =>
"""
Process our command line options.
All command line arguments given must be recognised and make sense.
State for specified options is stored in object fields.
We don't use the options package because we aren't already dependencies.
"""
var exe_name = ""
for arg in _env.args.values() do
if exe_name == "" then
exe_name = arg
continue
end
if arg == "--sequential" then
_sequential = true
elseif arg == "--verbose" then
_verbose = true
elseif arg == "--noprog" then
_no_prog = true
elseif arg == "--list" then
_list_only = true
elseif arg.compare_sub("--exclude=", 10) is Equal then
_exclude = arg.substring(10)
elseif arg.compare_sub("--label=", 8) is Equal then
_label = arg.substring(8)
elseif arg.compare_sub("--only=", 7) is Equal then
_only = arg.substring(7)
else
_env.out.print("Unrecognised argument \"" + arg + "\"")
_env.out.print("")
_env.out.print("Usage:")
_env.out.print(" " + exe_name + " [options]")
_env.out.print("")
_env.out.print("Options:")
_env.out.print(" --exclude=prefix - Don't run tests whose names "
+ "start with the given prefix.")
_env.out.print(" --only=prefix - Only run tests whose names "
+ "start with the given prefix.")
_env.out.print(" --verbose - Show all test output.")
_env.out.print(" --sequential - Run tests sequentially.")
_env.out.print(" --noprog - Do not print progress messages.")
_env.out.print(" --list - List but do not run tests.")
_env.out.print(" --label=label - Only run tests with given label")
_do_nothing = true
return
end
end
fun _print_report() =>
"""
The tests are all complete, print out the results.
"""
var pass_count: USize = 0
var fail_count: USize = 0
// First we print the result summary for each test, in the order that they
// were given to us.
for rec in _records.values() do
if rec._report(_verbose) then
pass_count = pass_count + 1
else
fail_count = fail_count + 1
end
end
// Next we print the pass / fail stats.
_env.out.print("----")
_env.out.print("---- " + _records.size().string() + " test"
+ _plural(_records.size()) + " ran.")
_env.out.print(_Color.green() + "---- Passed: " + pass_count.string()
+ _Color.reset())
if fail_count == 0 then
// Success, nothing failed.
return
end
// Not everything passed.
_env.out.print(_Color.red() + "**** FAILED: " + fail_count.string()
+ " test" + _plural(fail_count) + ", listed below:" + _Color.reset())
// Finally print our list of failed tests.
for rec in _records.values() do
rec._list_failed()
end
_env.exitcode(-1)
fun _plural(n: USize): String =>
"""
Return a "s" or an empty string depending on whether the given number is 1.
For use when printing possibly plural words, eg "test" or "tests".
"""
if n == 1 then "" else "s" end


UTC +8
Voltage: 240 V
Frequency: 50 Hz
Brunei dollar (Br$) of 100 cents/sen.
On a par with the Singapore dollar, the two currencies are interchangeable in both states. Sing$ can be imported/exported up to $1000, Br$ imported up to $1000. Indian and Indonesian banknotes are not exchangeable.
International dialing code for Brunei is +673
Area Codes
* Mumong - 3
* Behawan - 2
* Tutong - 4
* Kuala Belait - 3
Mobile phone service in Brunei is extensive with GSM 900, 3G, and GPRS services all available. SIM cards are relatively cheap and international roaming can be activated with major mobile operators.
SE Asia Cruisers Net
THIS NET IS NO LONGER OPERATIONAL.
For full list of Foreign Embassies in Brunei - see link
Foreign Embassies in Brunei
Emergency Phone Numbers in Brunei
Police Emergency - 993 Ambulance - 991 Fire - 995
IMRAY AND ADLARD COLES PILOT BOOKS are available at a discounted price for Noonsite.com users via World Cruising Club
Cruising Guide To Southeast Asia Volume I: South China Sea, Philippines, Gulf Of Thailand To Singapore
By Stephen Davies and Elaine Morgan
Publisher: Imray, Laurie, Norie & Wilson (Nov 1998)
ISBN-13:<PHONE_NUMBER>962
Cruising guide covering South China Sea, detailing Hong Kong and Macau, The Philippines, Brunei, East Malaysia, the Gulf of Thailand and Singapore.
Noonsite welcomes information and updates especially regarding clearance, customs and immigration procedures from cruisers visiting this country.
Please E-mail noonsite with any new information, updates or corrections. Even just a short email confirming that the current data is accurate would be most helpful.


Guillermo Guerrero
Follow me on github:
https://github.com/ryanfox1985
February 2nd, 2021
Terraform is a tool for creating, changing, and versioning infrastructure safely and predictably
-- terraform.io
https://www.terraform.io
https://github.com/hashicorp/terraform
(there are more; these are the basics)


Hi.
Is there a place where the format of the data string that is sent to emoncms is documented ?
I mean the string that is added to the URL, like this :
Sending remote data
GET /emoncms/input/bulk.json?apikey=xxxxxxxxxxxxxx&data=[[0,10,1806],[0,10,1806],[4,10,1806],[7,10,1806],[11,10,1806],[15,10,1800],[19,10,1800],[23,10,1800],[26,10,1806],[30,10,1806],[34,10,1800]] HTTP/1.1
This is what I got in the raspberrypi module. I just added an echo $com in getcontent().
My particular concern for today is the following :
I don't know why I got twice the [0,10,1806] but anyway, as I understand it, the first value of each [0,10,1806] sub-array is the time since last time $start_time was reset. In practice, it should be reset about every 30 seconds (apparently, in this case, it took a bit more).
I understand this time information is needed by target remote emoncms to associate each value with the right time in the past, as all those values are sent at once. What I don't understand is how remote emoncms knows what 0 accounts for. Basically, 0 is when $start_time was reset, which is something like 35 s before now, but when exactly ?
I hope I'm making myself clear.
I've got the feeling we're losing information, here.
Could it be every sample ends up delayed about 30s, sometimes 35 or 40 and we don't care ?
I would understand something like data=[[-30,10,1806],[-25,10,1806],[-20,10,1806],[-15,10,1806]] to indicate the time difference with now. Or better, an absolute time value.
Is there something I misunderstood ?
By the way, is there a data string that can be sent to set a particular value (or set of values) at a given time ?
Thanks.
Re: Input API documentation ?
There is a little bit of info in the API help.
Including a line
http://domain.tld/emoncms/input/post?time=1360577239&node=1&csv=100,200,300
that suggests an absolute time could be set in the string.
There seems to be several ways of doing the same thing (csv/json, for instance), I'm a bit confused.
I'm wondering if the time=12345678 could address the concern I expressed in the question above.
A string like this
GET /emoncms/input/bulk.json?apikey=xxxxxxxxxxxxxx&time=123456789&data=[[0,10,1806],[0,10,1806],[4,10,1806],[7,10,1806],[11,10,1806],[15,10,1800],[19,10,1800],[23,10,1800],[26,10,1806],[30,10,1806],[34,10,1800]]
where time would be the absolute time when $start_time was reset, would allow emoncms to know at what time each sample was received from emonTX.
Is there a place I can get more comprehensive information about the API than this page in emoncms, apart from the code itself (I may get to understand it more widely some day, but the learning curve is steep) ? I'm afraid not.


#282
raw
Waveguide run number: 282.
Working directory: /tmp/waveguide-SAFr
Nix install script verison: https://0.entrypoint.co/scripts/hypered-nix-2.1.1-install.sh.
Nix nixpkgs tarball: https://0.entrypoint.co/git/nixpkgs/archive/e9d4bab04458cd03cb9029d2d571c37cc017ffdc.tar.gz.
Nix cache: https://0.entrypoint.co/cache.
Repository URL: https://0.entrypoint.co/git/waveguide.git.
Revision: 3e5edace881a703b27a938abbe6532be3a03837d.
Creating north user...
Extracting payload tarball...
Copying SSH deploy keys...
Creating Nix directories...
cURL and Git already installed.
Exec'ing the user script...
Running user script...
Installing Nix...
Running command curl -s https://0.entrypoint.co/scripts/hypered-nix-2.1.1-install.sh -o /home/north/install-nix.sh...
Running command /home/north/install-nix.sh...
/home/north/install-nix.sh: line 1: html: No such file or directory
/home/north/install-nix.sh: line 2: syntax error near unexpected token `<'
/home/north/install-nix.sh: line 2: `<head><title>502 Bad Gateway</title></head>
'
Adding /nix/store/h180y3n5k1ypxgm1pcvj243qix5j45zz-nix-2.1.1/bin/ to $PATH...
Running command nix --version...
/tmp/waveguide-SAFr/as-north.sh: line 14: nix: command not found
Configuring cache...
Running command du -hs /nix/store...
du: cannot access '/nix/store': No such file or directory
/tmp/waveguide-SAFr/as-north.sh: line 54: nix-prefetch-url: command not found
Setting default nixpkgs to .
Installing nix-prefetch-git...
Received signal EXIT.


--- layout: page title: About header-img: "img/about-bg.png" ---
This is the storyline of an interesting show with ups and down involving a new language in a new time.


In the last month, US has announced tariffs on products coming from China. While the US and the World at large have recoiled and protested the new tariffs, it has brought to the light a lack of knowledge about the global economy.
It’s very difficult to track the resources that flow in and out of nations in this globalized modern world. Our visualization aims to utilize many data sources to provide a visual representation of the inter-woven nature of international industries. Our hope is to show the interdependence of nations. In addition, our hope is to raise awareness for other countries and their industries.
Description of the World bank datasets
Who is OEC, what data do they have?
Kaggle dataset of "Who eats our food"
"I've been trading things since I was small."
"I started in life trading chicken nuggets for fruit snacks. In high school I traded homework answers for beat-up insurance. These days I trade snarky remarks for pretty much anything.."
Great python library with built-in interactivity and web hosting. Check it out at their homepage! www.plotly.com
USF’s one-year Master of Science in Data Science (MSDS) program — formerly the analytics program — delivers a rigorous curriculum focused on mathematical and computational techniques in the emerging field of data science. The curriculum emphasizes the careful formulation of business problems, selecting effective analytical techniques to address those problems, and communicating solutions in a clear and creative fashion.


Neural Human Radiance Fields Neural Humans Controllable Generation of Faces Generative Faces Can a small color patch affect optical flow networks? Attacking Optical Flow Optical flow networks and datasets for human motion Human Optical Flow Unsupervised Learning of Depth, Camera Motion, Optical Flow and Motion Segmentation Self-supervised Learning of Geometry Generate faces, clothing and more using mesh convolutional autoencoders Mesh Autoencoders Optical flow using a Spatial Pyramid Network Spatial Pyramid Networks (SPyNet) Animate any face using voice Voice driven Facial Animation Animating upper faces using gaze direction Gaze-driven Facial Animation


@(id: String = "") @if(utils.BSVersion.play_code == "2.4") {
Messages
argument defined in your custom template collides with the implicit one taken from PlayMagicForJava
object, and it raises
a compilation error. So you only need to remove this implicit argument from your custom template.


Michael Axelson
Education
-
Accounting Specialist- Washington State House Finance Commission
-
Financial Analyst- Amazon
-
Investment Banking Analyst- Capitalia Colombia, Medellín, Colombia
-
Seattle ~ Non Profits
I just asked you some questions! Here are the results...
Question one!
Your answer...
Question two!
Your answer...
Question three!
Your answer...
Question four!
Your answer...
Question five!
Your answer...
Question Six!
Your answer...
Question Seven!
Your answer...
Top Ten Places I Want to Visit
-
1. Nicaragua
-
2. Santiago, Chile
-
3. Sicily, Italy
-
4. Havana, Cuba
-
5. Tokyo, Japan
-
6. Stockholm, Sweden
-
7. asldfhsdf


--- layout: page title: About header-img: "img/about-bg.png" ---
I am a Flatiron student who, along with my cohort, is diving headfirst into the vast world of Software Engineering!


Preparation time
1-2 hours
Cooking time
30 mins to 1 hour
Serves
Makes 30
Dietary
These Polish dumplings are the real deal and surprisingly simple to make. Serve sprinkled with crisp fried onions.
For the mushroom and sauerkraut filling, soak the dried mushrooms in 300ml/10½fl oz water and set aside to infuse for 1 hour.
Drain the sauerkraut in a colander and rinse under a tap to remove some of the acidity. Transfer to a pan of boiling water. Reduce the heat until the water is simmering and cook the sauerkraut for 30 minutes. Drain well.
Remove the mushrooms from the water using a slotted spoon, reserving the water. Finely chop the mushrooms.
Heat the butter in a frying pan over a medium heat. Add the sauerkraut, mushrooms and the reserved water. Bring the mixture to the boil. Continue to boil the mixture until all of the liquid has evaporated, then remove from the heat and set aside until cool.
For the cottage cheese and potato filling, boil the potatoes in a pan of salted water until soft enough to mash (about 20 minutes). Drain well and set aside to cool.
Heat the oil in a frying pan over a medium heat and fry the onions for 4-5 minutes, or until crisp and browned. Reserve a tablespoonful of the onions for the garnish.
For the dumpling dough, sift the flour into a large mixing bowl and make a well in the centre. Fill the well with the salt, oil and water. Using your fingers, gradually stir the flour into the wet ingredients, until the mixture comes together as a soft dough.
Turn the dough out onto a lightly floured work surface and knead for 5-8 minutes, or until it is smooth and glossy. Wrap the dough in a clean tea towel and set aside to rest in a cool room for at least 20 minutes.
When the potatoes have cooled, transfer them to a large bowl and crumble over the cottage cheese. Mash until smooth, then stir in the fried onions until well combined. Set aside.
To shape the pierogi, roll out the dough onto a lightly floured surface to a thickness of 3mm. Cut 10cm/4in rounds from it using a pastry cutter.
Place one teaspoonful of the cottage cheese and potato filling into half of the pastry rounds, and one teaspoonsful of the mushroom and sauerkraut filling into the remaining pastry rounds. Brush a little water around the edge of each pastry round, then fold the edges together to create a bulging semi-circular dumpling, pressing the edges together to seal.
Poach the pierogi, in batches if necessary, in a deep-sided pan of boiling water for 3-4 minutes, or until they float to the surface.
To serve, pile the pierogi onto serving plates and serve the soured cream in small bowls alongside. Sprinkle with the reserved fried onions and the dill.


import gc
import math
import re
import warnings
from typing import List, Tuple, Union
import numpy as np
import torch
from . import _video_opt
from ._video_opt import VideoMetaData
try:
import av
av.logging.set_level(av.logging.ERROR)
if not hasattr(av.video.frame.VideoFrame, "pict_type"):
av = ImportError(
"""\
Your version of PyAV is too old for the necessary video operations in torchvision.
If you are on Python 3.5, you will have to build from source (the conda-forge
packages are not up-to-date). See
https://github.com/mikeboers/PyAV#installation for instructions on how to
install PyAV on your system.
"""
)
except ImportError:
av = ImportError(
"""\
PyAV is not installed, and is necessary for the video operations in torchvision.
See https://github.com/mikeboers/PyAV#installation for instructions on how to
install PyAV on your system.
"""
)
def _check_av_available():
if isinstance(av, Exception):
raise av
def _av_available():
return not isinstance(av, Exception)
# PyAV has some reference cycles
_CALLED_TIMES = 0
_GC_COLLECTION_INTERVAL = 10
[docs]def write_video(filename, video_array, fps: Union[int, float], video_codec="libx264", options=None):
"""
Writes a 4d tensor in [T, H, W, C] format in a video file
Parameters
----------
filename : str
path where the video will be saved
video_array : Tensor[T, H, W, C]
tensor containing the individual frames, as a uint8 tensor in [T, H, W, C] format
fps : Number
frames per second
"""
_check_av_available()
video_array = torch.as_tensor(video_array, dtype=torch.uint8).numpy()
# PyAV does not support floating point numbers with decimal point
# and will throw OverflowException in case this is not the case
if isinstance(fps, float):
fps = np.round(fps)
with av.open(filename, mode="w") as container:
stream = container.add_stream(video_codec, rate=fps)
stream.width = video_array.shape[2]
stream.height = video_array.shape[1]
stream.pix_fmt = "yuv420p" if video_codec != "libx264rgb" else "rgb24"
stream.options = options or {}
for img in video_array:
frame = av.VideoFrame.from_ndarray(img, format="rgb24")
frame.pict_type = "NONE"
for packet in stream.encode(frame):
container.mux(packet)
# Flush stream
for packet in stream.encode():
container.mux(packet)
def _read_from_stream(
container, start_offset, end_offset, pts_unit, stream, stream_name
):
global _CALLED_TIMES, _GC_COLLECTION_INTERVAL
_CALLED_TIMES += 1
if _CALLED_TIMES % _GC_COLLECTION_INTERVAL == _GC_COLLECTION_INTERVAL - 1:
gc.collect()
if pts_unit == "sec":
start_offset = int(math.floor(start_offset * (1 / stream.time_base)))
if end_offset != float("inf"):
end_offset = int(math.ceil(end_offset * (1 / stream.time_base)))
else:
warnings.warn(
"The pts_unit 'pts' gives wrong results and will be removed in a "
+ "follow-up version. Please use pts_unit 'sec'."
)
frames = {}
should_buffer = True
max_buffer_size = 5
if stream.type == "video":
# DivX-style packed B-frames can have out-of-order pts (2 frames in a single pkt)
# so need to buffer some extra frames to sort everything
# properly
extradata = stream.codec_context.extradata
# overly complicated way of finding if `divx_packed` is set, following
# https://github.com/FFmpeg/FFmpeg/commit/d5a21172283572af587b3d939eba0091484d3263
if extradata and b"DivX" in extradata:
# can't use regex directly because of some weird characters sometimes...
pos = extradata.find(b"DivX")
d = extradata[pos:]
o = re.search(br"DivX(\d+)Build(\d+)(\w)", d)
if o is None:
o = re.search(br"DivX(\d+)b(\d+)(\w)", d)
if o is not None:
should_buffer = o.group(3) == b"p"
seek_offset = start_offset
# some files don't seek to the right location, so better be safe here
seek_offset = max(seek_offset - 1, 0)
if should_buffer:
# FIXME this is kind of a hack, but we will jump to the previous keyframe
# so this will be safe
seek_offset = max(seek_offset - max_buffer_size, 0)
try:
# TODO check if stream needs to always be the video stream here or not
container.seek(seek_offset, any_frame=False, backward=True, stream=stream)
except av.AVError:
# TODO add some warnings in this case
# print("Corrupted file?", container.name)
return []
buffer_count = 0
try:
for _idx, frame in enumerate(container.decode(**stream_name)):
frames[frame.pts] = frame
if frame.pts >= end_offset:
if should_buffer and buffer_count < max_buffer_size:
buffer_count += 1
continue
break
except av.AVError:
# TODO add a warning
pass
# ensure that the results are sorted wrt the pts
result = [
frames[i] for i in sorted(frames) if start_offset <= frames[i].pts <= end_offset
]
if len(frames) > 0 and start_offset > 0 and start_offset not in frames:
# if there is no frame that exactly matches the pts of start_offset
# add the last frame smaller than start_offset, to guarantee that
# we will have all the necessary data. This is most useful for audio
preceding_frames = [i for i in frames if i < start_offset]
if len(preceding_frames) > 0:
first_frame_pts = max(preceding_frames)
result.insert(0, frames[first_frame_pts])
return result
def _align_audio_frames(aframes, audio_frames, ref_start, ref_end):
start, end = audio_frames[0].pts, audio_frames[-1].pts
total_aframes = aframes.shape[1]
step_per_aframe = (end - start + 1) / total_aframes
s_idx = 0
e_idx = total_aframes
if start < ref_start:
s_idx = int((ref_start - start) / step_per_aframe)
if end > ref_end:
e_idx = int((ref_end - end) / step_per_aframe)
return aframes[:, s_idx:e_idx]
[docs]def read_video(filename, start_pts=0, end_pts=None, pts_unit="pts"):
"""
Reads a video from a file, returning both the video frames as well as
the audio frames
Parameters
----------
filename : str
path to the video file
start_pts : int if pts_unit = 'pts', optional
float / Fraction if pts_unit = 'sec', optional
the start presentation time of the video
end_pts : int if pts_unit = 'pts', optional
float / Fraction if pts_unit = 'sec', optional
the end presentation time
pts_unit : str, optional
unit in which start_pts and end_pts values will be interpreted, either 'pts' or 'sec'. Defaults to 'pts'.
Returns
-------
vframes : Tensor[T, H, W, C]
the `T` video frames
aframes : Tensor[K, L]
the audio frames, where `K` is the number of channels and `L` is the
number of points
info : Dict
metadata for the video and audio. Can contain the fields video_fps (float)
and audio_fps (int)
"""
from torchvision import get_video_backend
if get_video_backend() != "pyav":
return _video_opt._read_video(filename, start_pts, end_pts, pts_unit)
_check_av_available()
if end_pts is None:
end_pts = float("inf")
if end_pts < start_pts:
raise ValueError(
"end_pts should be larger than start_pts, got "
"start_pts={} and end_pts={}".format(start_pts, end_pts)
)
info = {}
video_frames = []
audio_frames = []
try:
with av.open(filename, metadata_errors="ignore") as container:
if container.streams.video:
video_frames = _read_from_stream(
container,
start_pts,
end_pts,
pts_unit,
container.streams.video[0],
{"video": 0},
)
video_fps = container.streams.video[0].average_rate
# guard against potentially corrupted files
if video_fps is not None:
info["video_fps"] = float(video_fps)
if container.streams.audio:
audio_frames = _read_from_stream(
container,
start_pts,
end_pts,
pts_unit,
container.streams.audio[0],
{"audio": 0},
)
info["audio_fps"] = container.streams.audio[0].rate
except av.AVError:
# TODO raise a warning?
pass
vframes = [frame.to_rgb().to_ndarray() for frame in video_frames]
aframes = [frame.to_ndarray() for frame in audio_frames]
if vframes:
vframes = torch.as_tensor(np.stack(vframes))
else:
vframes = torch.empty((0, 1, 1, 3), dtype=torch.uint8)
if aframes:
aframes = np.concatenate(aframes, 1)
aframes = torch.as_tensor(aframes)
aframes = _align_audio_frames(aframes, audio_frames, start_pts, end_pts)
else:
aframes = torch.empty((1, 0), dtype=torch.float32)
return vframes, aframes, info
def _can_read_timestamps_from_packets(container):
extradata = container.streams[0].codec_context.extradata
if extradata is None:
return False
if b"Lavc" in extradata:
return True
return False
def _decode_video_timestamps(container):
if _can_read_timestamps_from_packets(container):
# fast path
return [x.pts for x in container.demux(video=0) if x.pts is not None]
else:
return [x.pts for x in container.decode(video=0) if x.pts is not None]
[docs]def read_video_timestamps(filename, pts_unit="pts"):
"""
List the video frames timestamps.
Note that the function decodes the whole video frame-by-frame.
Parameters
----------
filename : str
path to the video file
pts_unit : str, optional
unit in which timestamp values will be returned either 'pts' or 'sec'. Defaults to 'pts'.
Returns
-------
pts : List[int] if pts_unit = 'pts'
List[Fraction] if pts_unit = 'sec'
presentation timestamps for each one of the frames in the video.
video_fps : int
the frame rate for the video
"""
from torchvision import get_video_backend
if get_video_backend() != "pyav":
return _video_opt._read_video_timestamps(filename, pts_unit)
_check_av_available()
video_fps = None
pts = []
try:
with av.open(filename, metadata_errors="ignore") as container:
if container.streams.video:
video_stream = container.streams.video[0]
video_time_base = video_stream.time_base
try:
pts = _decode_video_timestamps(container)
except av.AVError:
warnings.warn(f"Failed decoding frames for file {filename}")
video_fps = float(video_stream.average_rate)
except av.AVError:
# TODO add a warning
pass
pts.sort()
if pts_unit == "sec":
pts = [x * video_time_base for x in pts]
return pts, video_fps


Wrapping up the year at St. Mike’s!
|
Click to view this email online
|
|
|
Wrapping up the Year at St. Mike’s!
|
|
|
Dear Alumni and Friends,
Activities in May and June usually mark the end of the academic year and the beginning of summer for our alumni team. The last several weeks have certainly been different from how we pictured this year ending. Our plans included the campus being filled with alumni, students and families celebrating Alumni Reunion and Convocation. When COVID-19 related restrictions meant St. Mike’s had to celebrate these milestones virtually, alumni and students rose to the occasion with great resiliency. Planning is underway to celebrate these occasions in person as soon as we are able.
This year-end update video from President David Sylvester and the creation of a Convocation Hub are two of the ways we connected with and celebrated alumni and students and I am delighted to share these with you in this newsletter. You will also find announcements about our interim Dean of Theology, and acting Principal and also about new ways we hope you will stay involved and engaged with St. Mike's during this socially-distanced time.
Please do stay in touch over the summer. We hope to see you soon!
Brittany Davila
Senior Manager, Alumni Programming
416-926-7260<EMAIL_ADDRESS>Advancement and Alumni Team:
Kathryn Elton, Chief Advancement Officer,<PHONE_NUMBER><EMAIL_ADDRESS>Matt Doyle, Advancement Officer, Special Projects:<PHONE_NUMBER><EMAIL_ADDRESS>Klim Khomenko, Senior Development Manager:<PHONE_NUMBER><EMAIL_ADDRESS>Betty Noakes, Advancement Associate, Stewardship:<PHONE_NUMBER><EMAIL_ADDRESS>Ken Schnell, Advancement Manager, Annual Campaigns:<PHONE_NUMBER><EMAIL_ADDRESS>|
|
|
|
Message from the President
|
|
|
|
The Alumni Association Annual General Meeting held on Friday evening of Alumni Reunion usually includes a year-end update from our President.
This year, Dr. Sylvester shared his update virtually through this brief video.
President Sylvester also sent a year-end message to the St. Mike’s community on June 8, to view that message click here.
|
|
|
|
New Appointments at St. Mike’s!
|
|
|
|
President David Sylvester is pleased to announce the appointment of Dr. John McLaughlin to a two-year term as Interim Dean of the Faculty of Theology, effective July 1, 2020.
Dr. McLaughlin served as the Faculty’s Interim Dean in the 2014-15 academic year prior to Dr. Ginther’s arrival.
Professor McLaughlin joined the St. Michael’s faculty in 2002 after teaching for seven years at Wheeling Jesuit University in Wheeling, West Virginia.
A professor of Old Testament/Hebrew Bible, Dr. McLaughlin earned a BA from St. Thomas University in Fredericton, NB before enrolling at the University of Toronto, where he earned an MA in Philosophy. He then studied Theology and Scripture at St. Michael’s Faculty of Theology, earning an MDiv and a PhD.
To read more about Dr. McLaughlin’s appointment please click here.
|
|
|
Principal Emeritus Dr. Mark McGowan will serve as the Interim Principal of the University of St. Michael’s College for the 2020-2021 academic year, President David Sylvester has announced.
St. Michael’s Principal from 2002-2011, Dr. McGowan is an historian renowned for his work on the Catholic Church in Canada and the Great Irish Famine, as well as the lasting impact that the Famine’s mass migration had on Canada.
He is cross-appointed to U of T, where he holds tenure and has served as Deputy Chair of the History department (2017-19), as Senior Academic Advisor to the Dean of Arts & Science, International (2014-17) and as Acting Vice-Provost, Students, for the University of Toronto for part of 2013.
To read more about Dr. McGowan’s appointment please click here.
|
|
|
|
Congratulations to the Class of 2020!
|
|
|
|
Congratulations to the Class of 2020 and Welcome to the St. Mike's Alumni Association!
On June 2 a virtual convocation ceremony was held for all 2020 University of Toronto graduates.
To view the virtual ceremony please click here.
St. Mike’s convocation ceremonies were scheduled to occur on June 12, and to acknowledge that day, a congratulations video
and messages were sent out throughout the day through email and social media to the class.
To view the messages please visit the Convocation Hub at: https://stmikes.utoronto.ca/celebrating-the-class-of-2020/
|
|
|
|
Help St. Mike’s Remember the Pandemic
|
|
|
|
|
|
University Archivist Jessica Barr is documenting St. Michael's experience of and response to the COVID-19 pandemic — and alumni are invited to participate.
Use the university's archive project form to send in your account of life under the pandemic.
If you have any questions, please reach out to Jessica Barr.
|
|
|
|
Staying Connected While Apart
|
|
|
|
|
|
|
|
InsightOut Blog Series
Wondering how alumni, students, faculty, and staff are responding to the COVID-19 crisis? Check out InsightOut, St. Mike’s new multimedia blog, to gain insights into everything from ethical issues to personal experiences viewed in light of the pandemic.
If you are interested in submitting a blog piece for consideration, please contact Communications Officer Catherine Mulroney at<EMAIL_ADDRESS>for more details. We’d love to hear from you!
|
|
|
|
|
|
UofT Alumni Hub
Our lives may feel on hold right now but that doesn’t mean we can’t keep learning and exploring. Sought-after experts from U of T faculties, departments and across our community have answered the call with these resources for the times. Check out this online hub often for workouts, webinars, insights, events and more:
alumni.utoronto.ca/stayhome
|
|
|
|
|
|
|
We invite you to join with classmates and friends to compare and
share your memories with this bingo game.
|
|
|
|
|
FOLLOW USMC
University of St. Michael's College
Advancement and Alumni Affairs
81 St. Mary Street
Toronto, Ontario
M5S 1J4
Give: stmikes.utoronto.ca/alumni/giving
E-mail<EMAIL_ADDRESS>Website: stmikes.utoronto.ca/alumni
This e-mail was sent to ##SubscriberEmail##
Update contact information
Opt out of future messages
The University of Toronto respects your privacy. We do not rent, trade or sell our mailing lists.
Copyright © 2020 University of Toronto. All rights reserved. This e-mail was sent to ##SubscriberEmail##
|


Home
Playlist
Log Off
My Videogame Playlist
Use our videogame search engine to get general information about your favorite videogames and add them to your playlist.
Game:
Play Status:
Global Rating:
/ 5
Add Game to your Playlist