camperapp package¶
Submodules¶
camperapp.forms module¶
-
class
camperapp.forms.
ChildEnrollmentForm
(formdata=<object object>, **kwargs)¶ Bases:
flask_wtf.form.FlaskForm
Child Enrollment Form
Form for use by Parents to enroll a child at camp
-
child_birth_date
= <UnboundField(DateField, (), {'validators': [<wtforms.validators.DataRequired object>], 'label': 'Birthday'})>¶
-
child_first_name
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.DataRequired object>], 'label': 'First name'})>¶
-
child_gender
= <UnboundField(SelectField, (), {'validators': [<wtforms.validators.DataRequired object>], 'choices': [('M', 'Male'), ('F', 'Female')], 'label': 'Gender'})>¶
-
child_grade
= <UnboundField(IntegerField, (), {'validators': [<wtforms.validators.DataRequired object>], 'label': 'Grade'})>¶
-
child_last_name
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.DataRequired object>], 'label': 'Last name'})>¶
-
city
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.Optional object>], 'label': 'City'})>¶
-
consent
= <UnboundField(SelectField, (), {'validators': [<wtforms.validators.DataRequired object>], 'choices': [('y', 'Yes, I consent')], 'label': ''})>¶
-
medical_notes
= <UnboundField(TextAreaField, (), {'validators': [<wtforms.validators.Optional object>], 'label': 'Medical Notes'})>¶
-
other_parent_birth_date
= <UnboundField(DateField, (), {'validators': [<wtforms.validators.Optional object>], 'label': "Parent/Guardian's Birth Date"})>¶
-
other_parent_cell
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.Optional object>], 'label': "Parent/Guardian's Cell"})>¶
-
other_parent_email
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.Optional object>], 'label': "Parent/Guardian's Email"})>¶
-
other_parent_name
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.Optional object>], 'label': "Parent/Guardian's Name"})>¶
-
state
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.Optional object>], 'label': 'State'})>¶
-
street_address
= <UnboundField(StringField, (), {'validators': [<wtforms.validators.Optional object>], 'label': 'Street Address'})>¶
-
submit
= <UnboundField(SubmitField, (), {'label': 'NEXT'})>¶
-
zipcode
= <UnboundField(IntegerField, (), {'validators': [<wtforms.validators.Optional object>], 'label': 'Zip Code'})>¶
-
-
class
camperapp.forms.
CreateChildForm
(formdata=<object object>, **kwargs)¶ Bases:
flask_wtf.form.FlaskForm
Camper Creation Form
Form for use by Admins create a Camper/Child in the db
-
birth_date
= <UnboundField(DateField, ('Birthday',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
city
= <UnboundField(StringField, ('City',), {})>¶
-
first_name
= <UnboundField(StringField, ('First name',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
gender
= <UnboundField(SelectField, (), {'validators': [<wtforms.validators.DataRequired object>], 'choices': [('M', 'Male'), ('F', 'Female')], 'label': 'Gender'})>¶
-
grade
= <UnboundField(IntegerField, ('Grade',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
last_name
= <UnboundField(StringField, ('Last name',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
medical_notes
= <UnboundField(TextAreaField, ('Medical Notes',), {})>¶
-
parent_first_name
= <UnboundField(StringField, ("Parent's first name",), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
parent_last_name
= <UnboundField(StringField, ("Parent's last name",), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
state
= <UnboundField(StringField, ('State',), {})>¶
-
street_address
= <UnboundField(StringField, ('Street Address',), {})>¶
-
submit
= <UnboundField(SubmitField, ('SAVE',), {})>¶
-
zipcode
= <UnboundField(IntegerField, ('Zip Code',), {})>¶
-
-
class
camperapp.forms.
CreateParentForm
(formdata=<object object>, **kwargs)¶ Bases:
flask_wtf.form.FlaskForm
Parent Creation Form
Form for use by Admins create a Parent in the db
-
birth_date
= <UnboundField(DateField, ('Birthday',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
city
= <UnboundField(StringField, ('City',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
email
= <UnboundField(StringField, ('Email Address',), {'validators': [<wtforms.validators.DataRequired object>, <wtforms.validators.Email object>]})>¶
-
first_name
= <UnboundField(StringField, ('First name',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
gender
= <UnboundField(SelectField, (), {'validators': [<wtforms.validators.DataRequired object>], 'choices': [('M', 'Male'), ('F', 'Female')], 'label': 'Gender'})>¶
-
last_name
= <UnboundField(StringField, ('Last name',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
phone
= <UnboundField(StringField, ('Phone Number',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
state
= <UnboundField(StringField, ('State',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
street_address
= <UnboundField(StringField, ('Street Address',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
submit
= <UnboundField(SubmitField, ('SAVE',), {})>¶
-
zipcode
= <UnboundField(IntegerField, ('Zip Code',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
-
class
camperapp.forms.
LoginForm
(formdata=<object object>, **kwargs)¶ Bases:
flask_wtf.form.FlaskForm
Login Form for Admins and Parents
Login Flask Form for Admins and Parents
-
email
= <UnboundField(StringField, ('Email',), {'validators': [<wtforms.validators.DataRequired object>, <wtforms.validators.Email object>]})>¶
-
password
= <UnboundField(PasswordField, ('Password',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
submit
= <UnboundField(SubmitField, ('Sign in',), {})>¶
-
-
class
camperapp.forms.
SignupFormAdmin
(formdata=<object object>, **kwargs)¶ Bases:
flask_wtf.form.FlaskForm
Sign Up Form for Admins
Sign Up Flask Form for Admins
-
email
= <UnboundField(StringField, ('Email',), {'validators': [<wtforms.validators.DataRequired object>, <wtforms.validators.Email object>]})>¶
-
first_name
= <UnboundField(StringField, ('First name',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
last_name
= <UnboundField(StringField, ('Last name',), {'validators': [<wtforms.validators.DataRequired object>]})>¶
-
password
= <UnboundField(PasswordField, ('Password',), {'validators': [<wtforms.validators.DataRequired object>, <wtforms.validators.Length object>]})>¶
-
submit
= <UnboundField(SubmitField, ('Sign up',), {})>¶
-
camperapp.login module¶
-
camperapp.login.
load_user
(user_id)¶ Retrieve user with id user_id from database
Retrieves the user with the specified user_id from the Users table in the database
- Args:
- user_id (int) : id of user to be queried
- Returns:
- sql_alchemy user object with specified user_id
-
camperapp.login.
requires_roles
(*roles)¶ Wrapper Function to restrict access to endpoints
Functions with this as a wrapper will only execute if the flask_login current_user has a role from
Role class
specified in this function’s input- Args:
- roles (any) : roles
- Returns:
- A wrapped version of the original function that will only run if current_user.role is in roles
- Raises:
- werkzeug.exceptions.Unauthorized: An error occurred if current_user.role is not in roles
camperapp.models module¶
-
class
camperapp.models.
CampEvent
(title, start, end)¶ Bases:
sqlalchemy.ext.declarative.api.Model
Model for Camp Events
SQL Alchemy model for Camp Events for the Camper+ Schedule
-
add_color_attr
()¶ Add a color to the camp event
Adds the color of the events Camp Group to the event
-
classmethod
convert_calevent_to_campevent
(calevent)¶ Convert Full Calendar calevent dictionary to a Camp Event object
Converts a calendar event retrieved from the Full Calendar calender framework (calEvent) to a CampEvent to store in db
- Args:
- calevent (dict) : calendar event from full calendar
- Returns:
- A CampEvent instance ready to be committed to db
-
classmethod
convert_iso_datetime_to_py_datetime
(iso_datetime)¶ Convert ISO standard datetime to python datetime object
Converts an ISO standard datetime (e.g 2014-10-12T12:45) to a python datetime object. The Full Calendar Framework uses the ISO standard datetime
- Args:
- iso_datetime (str) : ISO datetime string
- Returns:
- A python datetime object
-
classmethod
convert_py_datetime_to_iso_datetime
(py_datetime)¶ Convert python datetime object to an ISO standard datetime string
Converts a python datetime object to an ISO standard datetime string (e.g 2014-10-12T12:45). The Full Calendar Framework uses the ISO standard datetime
- Args:
- py_datetime (datetime) : python datetime object
- Returns:
- An ISO standard datetime string
-
end
¶
-
group_id
¶
-
id
¶
-
start
¶
-
title
¶
-
-
class
camperapp.models.
CampEventSchema
(only=(), exclude=(), prefix='', strict=None, many=False, context=None, load_only=(), dump_only=(), partial=False)¶ Bases:
marshmallow.schema.Schema
Schema for Camp Events
A Marshmallow Schema template to enable CampEvent objects to converted to JSON Objects. See sample code
Warning
Be sure to append a color to Camp Events using the
add_color_attr
method before trying to jsonify it.-
opts
= <marshmallow.schema.SchemaOpts object>¶
-
-
class
camperapp.models.
CampGroup
(name, color)¶ Bases:
sqlalchemy.ext.declarative.api.Model
Camp Group Model
SQL Alchemy Model of a Camp Group
-
campers
¶
-
color
¶
-
events
¶
-
id
¶
-
name
¶
-
-
class
camperapp.models.
Camper
(**kwargs)¶ Bases:
sqlalchemy.ext.declarative.api.Model
Camper Model
SQL Alchemy Model of a Camper
-
age
()¶ Get the age of Camper
Calculates the age of a Camper based on time since camper’s birth date
- Returns:
- age of Camper
-
alt_name
()¶ Get an alternative display friendly name of Camper
Concatenates Camper’s first name and last name to a display friendly version. Format of name is Last name, First name
- Returns:
- ‘First name Last name’ of Camper
-
birth_date
¶
-
city
¶
-
first_name
¶
-
gender
¶
-
get_color
()¶ Get the color of camper’s Camp Group
Retrieves Camper’s assigned Camp Group’s color.
- Returns:
- color of camper’s Camp Group (camper.campgroup.color) or gray if camper has no group
Note
The default color of Camper’s without a group is gray but this is should never happen. Campers without groups should be put in the default None group created in camperapp.routes.py
-
grade
¶
-
group_id
¶
-
id
¶
-
is_active
¶
-
last_name
¶
-
medical_notes
¶
-
name
()¶ Get a display friendly name of Camper
Concatenates Campers’s last name and first name to a display friendly version. Format of name is Last name, First name
- Returns:
- ‘Last name, First name’ of Camper
-
other_parent_birth_date
¶
-
other_parent_email
¶
-
other_parent_name
¶
-
other_parent_phone
¶
-
parent_id
¶
-
phone
¶
-
state
¶
-
street_address
¶
-
zip_code
¶
-
-
class
camperapp.models.
LowerCaseString
(*args, **kwargs)¶ Bases:
sqlalchemy.sql.type_api.TypeDecorator
Lowercase conversion template SQL Alchemy Models
Used to initialize the String Columns of Sql Alchemy Models for auto conversion of assigned string literals and variables to lowercase
Note
If no value is passed to the field, auto conversion doesn’t happen
-
impl
¶ alias of
String
-
process_bind_param
(value, dialect)¶
-
-
class
camperapp.models.
Parent
(**kwargs)¶ Bases:
sqlalchemy.ext.declarative.api.Model
Parent Model
SQL Alchemy Model of a Parent
-
alt_name
()¶ Get an alternative display friendly name of Parent
Concatenates Parent’s first name and last name to a display friendly version. Format of name is Last name, First name
- Returns:
- ‘First name Last name’ of Parent
-
birth_date
¶
-
campers
¶
-
city
¶
-
email
¶
-
first_name
¶
-
gender
¶
-
id
¶
-
last_name
¶
-
name
()¶ Get a display friendly name of Parent
Concatenates Parent’s last name and first name to a display friendly version. Format of name is Last name, First name
- Returns:
- ‘Last name, First name’ of Parent
-
phone
¶
-
state
¶
-
street_address
¶
-
user
¶
-
zip_code
¶
-
-
class
camperapp.models.
Role
¶ Bases:
enum.Enum
Role of Users
Roles that can be assumed by a user
-
admin
= 'admin'¶
-
parent
= 'parent'¶
-
-
class
camperapp.models.
User
(email, password, role)¶ Bases:
sqlalchemy.ext.declarative.api.Model
User Model
SQL Alchemy Model of a User (for login only) Current User types are admins and parents
-
check_password
(password)¶ Check if password is user’s password
Encrypts password and checks if user’s saved password is equal to specified password using werkzeug.security.check_password_hash
- Args:
- password (str) : password to be checked
- Returns:
- True if password is user’s password else False
-
email
¶
-
get_id
()¶ Get User’s id
Getter for User’s id. Used by flask_login
- Returns:
- user’s id in the db
-
id
¶
-
is_active
()¶ Check if User is active
Check is current user is active. Required by Flask Login
- Returns:
- True
-
is_authenticated
()¶ Check if User is authenticated
Check is current user is authenticated. Required by Flask Login
- Returns:
- True
-
parent_id
¶
-
password
¶
-
role
¶
-
-
camperapp.models.
get_user_name
(user)¶ Retrieve the display name of users
Retrieves the print ready names of logged in users for rendering on web pages
- Args:
- user (User) : user object from User model
- Returns:
- the first part of the email of users without a name (admins) or the print ready name (last name, first name) of users with a name (parents)
camperapp.routes module¶
-
camperapp.routes.
before_request
()¶ Set Flask Global User
sets flask global user to current user
Note
this function is run before every request
-
camperapp.routes.
campers
()¶ Administrator people/groups View
Endpoint to view campers, camp groups and parents
- Returns:
- rendered admin_manage.html template
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
create_default_group
()¶ Create Default Group
Creates a default group called ‘none’ for campers ‘without a group’
Note
this function is run before every request to make sure a group exists for camper’s without groups
-
camperapp.routes.
faq
()¶ Camper+ FAQ Page Static Camper+ FAQ Page
-
camperapp.routes.
get_camp_events
()¶ Get Camp Events Endpoint
Endpoint to retrieve all camp events saved in db. Full Calendar calls this endpoint with a start and end argument representing the range of dates for which to get events for
- Returns:
- a list of all camp events in db as json
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
index
()¶ Index View
Endpoint for Camper+ homepage page with login form. Users are automatically redirected to default pages if they are logged in/authenticated
- Returns:
- parents are redirected to parent_enrollments endpoint. admins are redirected to campers endpoint. unauthenticated users are served the rendered home.html template with login form.
-
camperapp.routes.
login
()¶ Login Endpoint
Endpoint to login to Camper+ Application
- Returns:
- on GET request/invalid POST (failed authentication), returns rendered login.html page on successful POST, i.e successful authentication, returns redirect to url_for(‘campers’) or url_for(‘parent_enrollments’) if user is admin or parent respectively
-
camperapp.routes.
logout
()¶ Log out Endpoint
Logs out current user
- Returns:
- a redirect to url_for(‘index’), i.e Homepage
-
camperapp.routes.
parent_enrollments
()¶ Parent Enrollments View
Endpoint to show parent’s enrolled campers
- Returns:
- rendered parent_enrollments.html page
Note
Only authenticated parents can access this endpoint
-
camperapp.routes.
parent_register
()¶ Parent Child Registration View
Endpoint with forms for parents to register new camper. Valid Campers submitted are added to the Campers database table
- Returns:
- if a GET or invalid POST request is received, returns rendered parent_register.html template. if a valid POST request is received, returns rendered parent_register_complete.html template
Note
Only authenticated parents can access this endpoint
-
camperapp.routes.
parent_schedule
()¶ Parent Schedule View
Endpoint for parent camp schedule. Contains the Full Calendar js calendar for rendering camp events
- Returns:
- rendered parent_schedule.html template
Note
Only authenticated parents can access this endpoint
-
camperapp.routes.
schedule
()¶ Admin Schedule View
Endpoint for camp schedule. Contains the Full Calendar js calendar for rendering camp events
- Returns:
- rendered admin_schedule.html template
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
submit_camp_group_management
()¶ Camp Group Management Endpoint
Endpoint for administrator to edit, add and delete camp groups
- Returns:
- on valid POST request, returns a redirect to url_for(‘campers’) on valid DELETE, return json with success flag on invalid POST/DELETE request, return json with failure flag
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
submit_camper_management
()¶ Camper Management Endpoint
Endpoint for administrator to edit, add and delete campers
- Returns:
- on valid POST request, returns a redirect to url_for(‘campers’) on valid DELETE/PATCH, return json with success flag on invalid POST/DELETE request, return json with failure flag
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
submit_handler
()¶ Camp Event Management Endpoint
Endpoint for administrator to create, edit and delete camp events on the Full Calendar Schedule
- Returns:
- on valid POST request, returns a json with success flag and color to render event it. This color corresponds to the event’s camp group’s color on valid PUT/DELETE request, returns a json with success flag
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
submit_parent_management
()¶ Parent Management Endpoint
Endpoint for administrator to edit, add and delete parents
- Returns:
- on valid POST request, returns a redirect to url_for(‘campers’) on valid DELETE, return json with success flag on invalid POST/DELETE request, return json with failure flag
Note
Only authenticated admins can access this endpoint
-
camperapp.routes.
update_forms
()¶ Update Flask Forms
Updates CreateChildForm’s select Field with current groups and parents
Note
this function is run before every request to make sure recently created parents and groups are in the CreateChildForm
Module contents¶
Camper+ Web Application


The week's top news stories: November 24, 2019
The automotive news wheel is always turning.
by CarAdvice- shares
Darcy Foster • If you’re not constantly checking CarAdvice – which you should be doing, by the way – it can be easy for some headlines to slip through the cracks.
To make sure you haven’t missed anything important, we’ve gathered what we reckon are the hottest news stories from this week, right here.
Tesla planning Berlin Gigafactory
Elon Musk has confirmed Tesla will build another of its huge factories in Germany.
Alpina: X7-based mule spied, Australian arm interested
More spy pictures have surfaced the Alpina XB7/XD7, the company's take on the seven-seat BMW X7.
Caterham returns to Australia after emissions-fuelled hiatus
The small British brand is back, with a three-model line-up for 2020.
Low volume, but back nonetheless
2020 Mini JCW GP: Auto-only hot hatch revealed
The hottest ever Mini has been unveiled ahead of the Los Angeles motor show, and the manual transmission is gone.
Ferrari 812 GTS Spider V12 to cost $675,888 when it arrives in late 2020
Ferrari unveils 812 GTS Spider V12 in Australia, however customers won’t get their cars until a year from now.
Karma SC2 Vision concept, Revero GTS unveiled
More powerful sedan will go on sale next year in the US, while the dramatic coupe previews the company's next generation of all-electric cars.
2020 Lexus LC500 Convertible revealed, confirmed for Australia
Lexus has ended the tease and revealed the LC500 Convertible. It's only offered with a V8, and will be touching down in the second half of 2020.
Audi e-tron Sportback revealed, here 'second half' of 2020
Swoopy-roof electric crossover outed as the second member of Audi's e-tron family.
300 SRT Pacer: Chrysler Valiant tribute special revealed
The Pacer is only a tribute for now, but a production version is in the works for Australia.
2020 Aston Martin DBX revealed: Australian launch due next year
Not a moment too soon, Aston Martin leaps into the profit-building premium SUV party.
2020 Audi RSQ8 revealed
The range-topping Audi Q8 has finally been revealed, with power from a hulking V8 engine and Volkswagen Group's active anti-roll technology.
2020 Mercedes-AMG GLS, GLE63 S revealed with mild-hybrid V8
A pair of large performance SUVs are on the horizon for Mercedes in Australia, with an arrival time in the second half of 2020.
Ford Mustang Mach-E electric car ready for Australia
Ford confirms the Mustang Mach-E will be made in right-hand-drive but the UK will get it before we do.
Hyundai working on “crazy” sports-car, due 2020
Korean car maker Hyundai says it will release a “crazy” sports-car next year...
...but won’t share any more details
Lexus UX300e revealed with 400km of range
The compact UX SUV has become the first-ever pure-electric Lexus, with 400km of claimed range and 300Nm.
2020 Mercedes-Benz EQC priced at $137,900
Battery-electric Benz hits showrooms on December 9 with the Jaguar I-Pace and Tesla Model X in its crosshairs
1
17
nextprevious
The week's top news stories: November 24, 2019


{% extends "_base_core.html" %} {% block page_title %} {{ viewParams.MON_VO }} World Jobs{% endblock %} {% block title %} {{ viewParams.MON_VO }} PanDA monitor{% endblock %} {% block subtitle %}PanDA {{view}} {{ requestParams.mode }} World Jobs dashboard{{ viewParams.selection|safe }} {% endblock %} {% block body %}
| Nucleus | defined | waiting | pending | assigned | throttled | activated | sent | starting | running | holding | transferring | finished | failed | cancelled | merging | closed | {% if requestParams.es %}Events in failed jobs | Events in finished jobs | Events in merging jobs | {% endif %}
| {{ nucleus }} Nucleus, Satellites | defined | waiting | pending | assigned | throttled | activated | sent | starting | running | holding | transferring | finished | failed | cancelled | merging | closed | {% if requestParams.es %}Events in failed jobs | Events in finished jobs | Events in merging jobs | {% endif %}


Performance & timing¶
Test 1¶
Fitting the Leonardo discovery photometry using Dynamic Nested Sampling, once with uniform sampling, once with random-walk sampling:
ns_modus,dynamic
ns_nlive,500
ns_bound,single
ns_sample,unif vs. rwalk
ns_tol,0.01
ndim = 8
allesfit_Leonardo_unif/:
75 minutes, 27k samples, logZ = 545.42 +- 0.14
allesfit_Leonardo_rwalk/:
31 minutes, 24k samples, logZ = 545.36 +- 0.14
Test 2¶
Fitting all TMNT data together using Dynamic Nested Sampling, once with uniform sampling, once with random-walk sampling:
ns_modus,dynamic
ns_nlive,500
ns_bound,single
ns_sample,(compared below)
ns_tol,0.01
ndim = 8
allesfit_all_TMNT_unif/:
> 24h, aborted
allesfit_all_TMNT_rwalk/:
1.3h, 35111 samples, logZ = 1234.26 +- 0.23
allesfit_all_TMNT_slice/:
> 24h, aborted
allesfit_all_TMNT_rslice/:
1h, 28074 samples, logZ = 1233.66 +- 0.23
allesfit_all_TMNT_hslice/:
16.4h, 30925 samples, logZ = 1231.49 +- 0.23
Summary:
- unif does not converge within a reasonable run time for higher dimensions. It seems not applicable to our exoplanet scenarios.
- rwalk runs fast, and finds the true solution. It shows quite “conservative” (large) posterior errorbars. This seems to be the best choice for exoplanet modelling.
- slice is theoretically the most robust, but does not converge within a reasonable run time for higher dimensions.
- rslice runs fast, but gives somewhat funky posteriors / traceplots. It seems to be overly confident while missing the true solution.
- hslice is very slow and gives somewhat funky posteriors / traceplots.


A fishing harbour on the south coast of Gran Canaria. A useful port for both repairs and provisions.
Position 27° 45'33"N, 15° 41'08"W (marina)
Rarely any moorings for visiting boats.
Visitors must anchor outside and take stern lines to the inner breakwater, or anchor in the well-protected area between the harbour and the beach. The holding here seems to be reasonable.
Skippers are advised to enquire if there is space before they arrive, otherwise visiting yachts berth at the main wharf until a place is found for them.
There are a few moorings for yachts to come stern-to the outer breakwater which is fronted by large rocks.
Last updated March 2011.


The Model-Driven Low-Code Platform
Alan is a low code platform that enables the rapid development of data centric applications, from small to very, very large.
It feels like prototyping, and lets you go from back-of-the-napkin to a running application in minutes.
Alan supports global businesses
Alan for your Business
Alan's low code approach will change the way you think about software development. We wrote an article about what this means.
Do low-code or no-code really change software development?
and other articles about Alan
Are you running into the limitations of legacy systems or Excel? Get in touch with Kjerner and learn about the possibilities.
For proprietary solutions, please contact us at info@kjerner.com.


{% extends 'base.html'%} {% from 'pitch_disp_macros.html' import display_pitches%} {% block content%} Pitch it get recognised by other pitchers: Create Pitch View Pitches {% endblock %}
get recognised by other pitchers:


All rights reserved.


Support Nanocents Development
Donate (10 NC)
Vote for development of a Gatsby Example
Vote Gatsby (5 NC)


Kittens
Quick simple servie test Just put your image size (test)
Like this:
http://placekitten.com/200/300
Or:
http://placekitten.com/g/200/300


Hello, Peter
ScopingSim
Create New Project
Open Existing Project
Logout
Help
Project Name
Edit
Delete
Bronchoscopy
Gastroscopy
Endoscopy
Colonoscopy
EGD
Capsule Endoscopy
Laparoscopy


THE MASK (1994) A Film Review Copyright Dragan Antulov 2001
Comic book industry has suffered a sharp commercial decline in the last decade. One of the reasons for that can be found in the rapid development of computer graphic technologies that brought whole new dimension to interactive video games and Hollywood films. Two-dimensional paper world of comic books simply can't compete with them and the adolescents, who used to keep the industry alive, are turning away towards alternative forms of entertainment in which their favourite characters, even the most outrageous ones, look more alive and more attractive. One of such examples is THE MASK, movie adaptation of Dark Horse comic book, directed in 1994 by Charles Russell.
Protagonist of this film is Stanley Ipkiss (played by Jim Carrey), mild-mannered bank clerk who is not particularly happy with many aspects of his life, especially those related to opposite sex. One day a beautiful night club singer Tina Carlyle (played by Cameron Diaz) comes to his bank and Stanley hopelessly falls in love with. But the visit to the night club ends with Stanley being bounced and spending the rest of night walking by the sea. There he sees a strange ancient mask that features face of Loki, Norse god of mischief. When Stanley puts the mask on his face, he gets transformed into Mask - a new character with a green face, a person who does almost any thing Stanley would never do. While doing that he brings attention of both police led by Lt. Mitch Kellaway (played by Peter Riegert) and crime syndicate led by Dorian Tyrell (played by Peter Greene).
There are few comic actors like Jim Carrey whose comedic talent is such that he can carry movies that would otherwise be unwatchable. THE MASK is one of those rare instances where Jim Carrey's overwhelming talent actually had to compete with something else. The outrageous and cartoonish character of Mask was simply impossible to put on the screen without massive display of latest CGI technologies. In the end the special effects became the most important element of the film and everything else - plot, characters, settings etc. - was just an excuse for their display. Unfortunately, those scenes tend to be too short and between them viewers have to deal with the weak script by Mike Werb and anachronistic characters and situation that might look like they were time-warped from 1940s. Although Carrey really tried his best (and usually succeeds) in bringing life to the comic book characters, his efforts weren't enough to rescue this film from sinking into oblivion. Those who remember THE MASK these days usually don't think of Carrey or ground-breaking CGI effects; the main reason why this film gets mentioned is Cameron Diaz in her first major movie appearance, in which she displays somewhat rounder shape than we are accustomed to see from Hollywood actresses. In the end, those viewers who aren't big fans of Carrey, Diaz or comic books probably won't miss much if they don't watch this film.
RATING: 4/10 (+)
Review written on September 29th 2001
Dragan Antulov a.k.a. Drax E-mail<EMAIL_ADDRESS>http://www.film.purger.com - Filmske recenzije na hrvatskom/Movie Reviews in Croatian
========== X-RAMR-ID: 29649 X-Language: en X-RT-ReviewID: 252397 X-RT-TitleID: 1053779 X-RT-AuthorID: 1307 X-RT-RatingText: 4/10
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


One day ahead of deadline, Trump says he'll decide on auto tariffs 'soon'
U.S. President Donald Trump on Wednesday said he had been briefed by his administration on the issue of whether to impose tariffs on car and auto part imports into the United States and would make a decision fairly soon.
WASHINGTON: U.S. President Donald Trump on Wednesday said he would make a decision soon on whether to impose tariffs on cars and auto parts imported into the United States but gave no other details.
"I'll make a decision soon, fairly soon," he told reporters at the White House, one day ahead of a deadline to act.
The Republican president is weighing whether to impose the levy on vehicles and parts imported from the European Union, Japan and South Korea, although EU officials said they expect Trump to announce a delay this week.
Speaking to reporters at the White House at the start of a meeting with Turkish President Tayyip Erdogan, Trump said he had been briefed by his administration on the issue of auto tariffs but did not elaborate on his decision or the possible timing.
Trump's administration faces a Thursday deadline to decide whether to impose threatened "Section 232" national security tariffs of as much as 25per cent on imported vehicles and parts under a Cold War-era trade law.
U.S. and EU sources on Friday said they expect Trump to delay a decision on the auto tariffs for another 180 days, allowing time for negotiation with the EU and Japan on automotive trade barriers.
But they cautioned that no firm decision had been made and that the president was the ultimate decider. Auto industry executives also are expecting another delay in the decision
Trump said he wanted to expand U.S. trade with Turkey, now about US$20 billion a year.
"We think that number should be easily US$100 billion, which would be great for Turkey and great for us," Trump said.
(Reporting by Alexandra Alper and Humeyra Pamuk; writing by Susan Heavey; editing by Jonathan Oatis)


This post will go into detail about the performance of individual vehicles using the top results from matches.
This post
- Top of the board
- Alternative approaches
- Caveats
- Tier 3
- Tier 4
- Tier 5
- Tier 6
- Tier 7
- Tier 8
- Tier 9 & 10
Top of the board
For this second part on vehicle performance, I used (roughly) the top 1/3 of each match scoreboard. Combined, this is approximately 22,000 individual player outcomes.
There are two reasons for this approach.
- The top of the board seems to do the most, so it’s more interesting to see which vehicles are up there
- This approach controls somewhat for “decent+” players and thus provides some information on: “Do challenging but effective vehicles do well when good players drive them?”
The results are organized by vehicle tier, rather than match tier. That is, I took the top 1/3 of each scoreboard regardless of the tier spread in that match. I then aggregated the results by vehicle tier. If a T7 ended up top of the board in a Tier 9 game or Tier 7 game, it doesn’t matter here. It would by aggregated with all the other 7s.
I also removed myself from the sample for the same reason as in previous posts.
In addition to the standard performance metrics (average damage, spotting, spot damage etc.) I’ve added an additional stat: The % chance of a vehicle ending up top of the scoreboard. That is ->
(total at top)/(total of that type)
Otherwise, vehicles that are played more will be biased toward showing up more in the top of the scoreboard, when in fact they’re just played more.
This is also an important stat in that it’s an estimate of both the relative power of that vehicle and/or the average quality of player driving it. Unfortunately there’s no way to distinguish between the two without more data.
Alternatives
A different way to approach this would be to control for match tier. This would involve looking for games where a majority of tanks were the same tier - and then take the top of those scoreboards. This would probably reduce the sample size a bit too much in my case, although if you had OE data, it’d be fine.
Additionally, the second approach would be better at answering the question of how a tier does against itself. Nevertheless, I think the approach I chose more closely aligns with how vehicles are actually used under game conditions: Sometimes you’re top tier, sometimes not.
Finally, I also tried taking the top 1/3 of XP earners in a match. The results are pretty similar, and you get more people from the winning team. I think the top 1/3 of the both the winning and losing team is closer to how you think about game results when you see them.
Caveats
Some of the samples start to get small at the tiers I’ve played less of. Keep that in mind. However, the results are still probably pretty reasonable, with a few exceptions. Especially when we look at the big trends. If there are slight differences between two vehicles and the sample size is small, mentally add an asterisk.
Top scoreboard vehicle performance
Tier 3: The Finest Scout
The XM800 probably cements itself as the finest scout relative to tier. While it’s DpM is significantly lower than most of the rest of the tier, it has a significant lead in average spotting damage per match (40% or more). Spot damage is good for XP income and as in the ‘all players’ results, it leads the board in XP income.
The LAV 150-90 and Dragoon lead for damage and kills, pulling in a combined average of 1730 DpM and 1.4 KpM. Spots and spotting damage are significantly lower than the others, strongly indicating they’re relying on team spotting most of the time.
The T-62 and Type-59 are the top MBTs, showing decent-ish kills, damage and spot damage.
In a reasonably consistent trend across tiers, the range of XP income is pretty close across the top performers. In this case, only the Object 430 and BMP-1 suffer in XP income relative to their peers. These two are also lesser-played vehicles.
The XM, Dragoon and LAV 150-90 all show a higher chance of ending up top of the board (32-39%) relative to the MBTs which are all in the 23%-ish range. Similar to other tiers, this could be a result of either/both better vehicles or better players gravitating to them. MBTs are more widely played generally, suggesting a bigger skill gap.
Tier 4: “Our seals can’t repel clubbing of that magnitude!!”
The Zhalo and AMX10P-90 both lead in XP income. Even so, the XP income spread for top scoreboard non-arty tanks is pretty even at Tier 4. There’s only a 17% difference between the Zhalo and the OF-40, Sheridan and Swingfire - all of which are a bit lower than the rest.
That being said, both the Zhalo and the PAC-90 seem to have a much greater chance of being a top performer. 53% of both these tanks end up in the top 1/3 of a scoreboard, similar also to the BWP. The LAV-300, also in the top for XP, has a lesser chance at 36%.
The rest of the tier is pretty even in the mid-20s suggesting a more difficult road to the top. The OF-40 brings up the rear here. Only 1 in 5 make it to the top, as compared to half of all Zhalos.
Again, XP income at this tier is probably correlated with win rate…
Not surprisingly, the tank destroyers lead in damage and kills by a fair margin.
One interesting difference between the global tier 4 results and the top performers is that there’s a more significant gap between the spotting damage of the TDs and MBTs. For all Tier 4s, the TDs are doing 88% of the spotting damage of MBTs while the top performers are doing 67% of the spotting damage of MBTs.
If I were to make up a story about this, I think it suggests that better players are
- not getting camo sniped to death out in the open in their MBTs (very common), and instead are surviving long enough to do something useful at the front and/or
- that good TD players aren’t getting into positions where they’re spotting (yoloing) early. Rather, doing damage and then using their vision advantage later in the match, where they pick up more spotting damage.
Good Swingfire players brings in the most average spotting damage by far, 2.5 times as much as the Zhalo and 40% more than the BMD-1, for example.
Tier 5: Come on, just hull down noob.
Among top performers, this is the tier at which you start to see some of the later armor meta take shape. Specifically regarding the WZ-1224. The WZ is significantly more likely to end up top of the board at 49% of all WZs played, the ERC following at 37% and most of the rest split between the mid 30s and mid 20s. The Leo 1A5 is lowest, only 21% ending up top 1/3.
The WZ also leads Tier 5 in DpM, just ahead of the Bagel and ERC (You could probably call these three tied). The bagel brings in by far the most KpM (1.94), with the WZ and ERC close to even for second at ~1.6. Across tiers, 1.6 kills per match is uncharacteristically high for an MBT, which are often in the 1.2 range.
The WZ and the M60A3 both have, on average, about 25% more spotting damage than the other MBTs, suggesting their relative positions on the front. The WZ and M60A3 also close the gap on spotting damage relative to AFVs and previous tiers, the M60A3 doing 90% of the BMD-2’s spot damage, and 85% of the Fox’s top spotting damage.
In terms of XP income the Fox, ERC and WZ lead, each balancing a good amount of damage with spotting/spot damage income. The spread in income (8%) is pretty low among the top six vehicles.
The tier 6, 7 and 8 Chinese tanks: Anomalous
These tanks end up high up in top performers list. In terms of XP income, The 85II is 4th in tier 6, the 90II 1st in T7 and the Type98 1st in T8. However, the sample sizes are quite small relative to the other tanks - there are 10x as many Arietes as Type98s, 4x+ as many Leo 2AVs as 85IIs, for example.
I think there are a few things going on here.
- These tanks came out later and attracted more experienced people who had already played other lines.
- By the time the Chinese tanks were out, it was getting harder and harder to get up lines in NA PVP. Unless people were willing to obtain them through PVE, most of the pop didn’t bother (including me - half way through Tier 6).
- Some of these results are dominated by a few names. The Type98 in particular has a sample of 50, half of those names being a few top players on NA.
I’ll leave out talking about the T7 and 8 Chinese tanks for this reason. I’ve heard they’re limited but decent. The main takeaway from these results is that they can do well enough in the right hands.
Tier 6: I’ll be back… for purchase, and The Last Scout
The Terminator is somewhat of an outlier at tier 6. It’s top for XP income, has damage output that’s in line with the best of the MBTs and the Centauro, is second in spot damage after the VBL and is highest in kills. 48% of Terminators played also end up in the top 1/3 of the scoreboard. These were founder’s tanks, so they’re also being driven by more experienced players.
The VBL is far and away the best scout, doing 50% to 70% more spot damage than anything else. My committee of one says it loses the top-at-tier scout award to the XM800 for driveability reasons only. Barely.
45% of VFMs end up as top performers, the least likely being the Stingray (24%) and Centauro (25%).
XP income is very even for the top performers with the exception of the vehicles that can’t take a hit - Stingrays, Centauro, Taifuns, Expeditionary tanks. XP income is likely limited by a lack of spot damage, but all bring in decent damage and kills when they do well.
All of the MBTs overtake the Bradley and BMP-3 in spotting damage at this tier. The VBL is the last scout in the tier progression to outperform all MBTs in spotting damage.
Tier 7: No no, I play it for the exciting, fast-paced gameplay
Similar to previous posts, the most “interesting” thing about this tier is that the Challenger (25%) and Cent 120 (17%) make up a significant percentage (42%) of all top performing vehicles driven, and 37% of all vehicles generally. Wiesels, BMD-4s and T-80s make up another 27% of the top.
44% of Challengers end up top 1/3, as compared to 36% of T-80s, 31% of M1s and 28% of Leo 2s. The Merkava does well for itself, having a 46% chance of being a top performer, although this is a relatively small sample.
Damage is in the 2600 range for most vehicles, with the Cent 120 (3490) and LAV 600 (3171) leading the pack. The T-80 (2843) has an edge on the other MBTs, as you might expect.
The MBTs are the leaders in spot damage, with only the Wiesel edging out the non-Challys. The Challenger is top spotter, with 17% more spot damage than the Wiesel, on average. The T-80 has the lowest spotting damage among MBTs, suggesting top performing T-80s are keeping a bit more distance. The BMP-3M beats only the T-80 in spotting damage, by 5%. The BMD-4 does not.
The Challenger has a significant edge in spotting damage compared to all other MBTs. The Leopard 2 is closest, with the Challenger only having 33% more spotting damage.
Kills exhibit the same class pattern as in other tiers.
The Challenger, Cent 120 and Wiesel lead in XP income, in that order.
Tier 8: The Charge of the Light Tank
By this point the spotting trend is well established, so no need to cover that.
The Leopard 2A5 is most likely to be a top performer, with a 47% chance of being top 1/3. All of the MBTs do well in this regard, only the T-90 coming in relatively low with 35% of T-90s ending up top 1/3.
The Leopard 2A5 is essentially top of the board in XP income - ignoring the Unica-bait Type98. The T-90 has the lowest XP income among the MBTs, which likely comes from having less spotting damage, at 35% less than the 2A5, for example. A strong indication that this tank requires more conservative play.
The Warrior is an anomaly here with good performance (other than spotting damage). This tank is driven significantly less than the MBTs and is often driven by quite good/experienced players on NA. This could be biasing the results. Nonetheless, it is capable of doing well in the right hands, although what this means for win rate, I can’t say.
Although the number of tier 8 arty observed is quite low, there are a few tanks in tier 8 that have the notable distinction of having lower XP income than arty, which is unique to this tier. The XM8, RCR and VBR all have (barely) less XP income than the Paladin, while the Ramka has less than both of the tier 8 artys.
The RCR actually does quite well in damage (the highest at 3533) and kills, but loses out bigtime on spotting damage relative to its tier, which affects XP income. The Ramka has quite low damage for its tier because it has until recently sucked so bad. The VBR is new, so I can’t say much about it. From what I’ve seen, it is the primo missile camo sniper on NA.
The XM8 is the least likely T8 to be a top performer. Only 29% reach top of the board, significantly less than the other tier 8s. Apparently it’s not the meta to scream around the map drifting on one tread, trying to avoid being hit by anything, all to drop a one-time low-roll 450 on the side of an MBT before it turns and blows you away.
…My stats would not have improved the XM8’s standing.
Tier 9 and 10: Seems okay except for power creep and the light vehicles having little to do
These are pretty similar tiers in terms of their stats.
The Challenger 2 is top of the board at T9, and like the Challenger 1 and ATDU is by far the best spotter at its tier. Top Chally 2s are doing 71% more spotting damage than the CRAB, for example. ATDUs are doing 48% more spotting damage than SPHINXs.
I assume this is a result of CRAB and SPHINX crews not calling in their recce reports because they’re too busy executing 3-point turns, getting rammed by full-speed Leopards and avoiding railroad tracks and unpaved terrain.
Sidebar. I really like the SPHINX, but the small high tier games on NA collapse (smartly) into lemming trains. A great deal of NA 8v8 SPHINX, CRAB and light vehicle time is thus spent trying to figure out how to attack a Testudo of MBTs.
Hmmm…
It’s quite possible this phenomenon is showing up in the spotting damage results. I would guess these high tier stats are the most likely to be different for the EU.
Anyway, the MBTs at these tiers are all fairly balanced against each other, and this shows up in the stats. Well, the Chally 2 is probably a bit too good, anecdotally. Additionally, the M1s suffer a bit for their weakspots but seem to do about as well in these performance metrics.
The Challengers and Leos are top performers in XP income in both tiers, probably in large part because of spotting damage. They tend to have the best armor, and this stat suggests their resulting positions on the field.


Rails 3: An improved agnostic search model using Arel
class Search
attr_accessor :attributes
def initialize(model, attrs = {})
@attributes = {}
@model = model
@arel = model.arel_table
model.columns.each do |field|
pattr = field.name
attrs = Hash[attrs.select {|k,v| !v.empty? }]
searchable = !attrs[pattr].nil?
@attributes[pattr.to_sym] = attrs[pattr] if searchable
self.class.send(:define_method,field.name) do |cond, *value|
attr = field.name.to_sym
value = value.first || @attributes[attr] || nil
@model = @model.where(@arel[attr].send(cond,value)) if searchable
end
end
if block_given?
yield self
end
end
def result
@model
end
end
The constructor takes the model you want to search in, and an hash of params to use, they’ll be the request params when used from controller. Note that if some param value is an empty string, it will be ignored: this lets the visitor to leave blank some fields in the search form and make it conditional.
To save typings, when specifying conditions, you can omit the value, because it’s taken from the params hash. By the way, if you need some more control, you can specify another value. Finally, you can pass a block to make it easier to read. Here’s a real usage example from a controller:
class RealtyRequestController < ApplicationController
#... other actions ...
def search
@s = Search.new(RealtyRequest,params[:search]) do |s|
# value to search defaults to params[:search][:contract_id]
s.contract_id :eq
s.price_max :lteq # same here
s.price_min :gteq
s.zone :matches, "%#{params[:search][:zone]}%" # here I look for '%param%'
s.province :matches, "%#{params[:search][:province]}%"
s.municipality :matches, "%#{params[:search][:municipality]}%"
s.rooms :eq
s.mq :eq
end
@realty_requests = @s.result # assign result
@realty_requests.order(:created_at) # add order option
# ... other rendering stuff ...
end
end
When Search#result
is called a model instance is returned, it can still be ordered. According to Arel’s README, there’s no support for OR conditions yet, I hope it will be included soon.
Notes:
This article was initially published on http://blog.andreapavoni.com/post/776670218/rails-3-an-improved-agnostic-search-model-using-arel


About Me
Hello Everyone,
My name is Nagesh Kalegowda. I live in Toronto, Ontario, Canada. I have been working in the field of Information Technology for over 10 years now. I work as Technology Architect helping organizations in architecture, design and implementation of IT infrastructure.
I have a strong track record of success in technology architecture, cloud services architecture, secure IT infrastructure design, implementation and full life cycle project management.
I have strong experience in cloud services deployments, in adoption of public and private cloud services, in virtualization, in managed services, in the delivery of professional and consulting services to top-tier Financial, Public Sector, Telecom, Energy, and IT Services firms.
I am very much interested in enhancing my skill sets to include full stack web development. To accomplish this goal, I am currently enrolled in the University of Toronto SCS Coding Boot Camp. I am hoping to develop these skills by April 2021.
Have Fun!
Nagesh
Please feel free to connect on:


1 An All Funds Approach
1.1 Including or Excluding funds in the Fiscal Futures All Funds Budget
While it is called an “All Funds” Budget, that is a slight exaggeration. Illinois has over 700 funds. Whereas the overwhelming majority are included in our “All Funds” measure, some are not. The starting point for our list of all funds is all appropriated funds, but, for the reasons listed below, we exclude a handful of appropriated funds and include a number of non-appropriated funds.1
Preliminary expenditure and revenue data is requested after the Fiscal Year ends, and the requested again at the end of the lapse period.2 Calculations are based off the values received from the data received after October 31st when Illinois’ lapse period ends.
Criterion 1: INCLUDE IF the fund collects a state-levied tax.
The state collects both state-levied taxes and locally levied taxes (typically local-option sales and utility taxes). The state collects and returns local taxes to the local governments. Upon receipt, local tax revenues are deposited into specifically-designated, non-appropriated state trust funds. In cases where the state is solely acting as a collection agent for a local taxing body, this receiving trust fund, its revenue and distribution (expenditure) is NOT counted in our analytical frame. If the tax is collected for the state, the fund and its revenue IS counted in our analytical frame.
Criterion 2: INCLUDE IF the fund supports a state function.
Non-appropriated funds may support state functions such as education, social services, transportation, public facilities, regulation, natural resources, and law enforcement. Generally these are trust funds that hold federal dollars for a specified state project or purpose. This category of non-appropriated funds is essentially the same as a large group of appropriated state and federal trust funds. Because we are counting federal dollars as revenue, it would be inconsistent to count the appropriated funds, but not the non-appropriated funds that do essentially the same thing.
Criterion 3: EXCLUDE IF the fund is a holding fund for individuals.
Many funds are used to hold monies that belong to individuals, not the state. Most of these funds are non-appropriated, but some are appropriated. Examples of appropriated funds that we exclude from the frame are child support collection funds or employee pension own-contribution funds. These funds are holding money that belongs to an individual and will be returned to the person, or used for a payment on behalf of that person, at a later date.
Criterion 4: EXCLUDE IF the fund’s expenditures or revenues have been counted elsewhere (i.e., avoid double-counting).
In some cases, funds receive and disburse money that was already counted as revenues to or expenditures from other funds. For example, the Commercial Consolidation Fund is a huge fund that distributes state benefit payments to individuals, service providers, and local governments by direct deposit. Payments into this fund are counted, distributions from this fund are not.
Criterion 5: EXCLUDE IF the fund holds designated user fees targeted for a specific purpose that is not a public function (conduit).
Typically we have excluded non-appropriated funds that hold designated user fees that are directed to a specific purpose that is not a necessary public function. These funds can be considered a conduit and we did not add these to the frame. For example, we exclude Fund 0098, which collects fees from harness race entrants at the state fair and then pays them out to race winners.
Criterion 6: INCLUDE IF the fund collects a user fee that supports a large, important state function (state function trumps user fee).
Non-appropriated funds that are supported by user fees AND perform a state function (e.g., transportation) ARE counted in the frame. The rationale for this is that the state function would have to be performed even if the user fee and the fund structure did not exist. The biggest example is the Illinois State Toll Highway Revenue Fund, which collects tolls and supports the expansion and maintenance of Illinois toll roads.
Criterion 7: EXCLUDE IF unclear information, dead fund, small amounts. Some funds are defunct, and our historical information on fund descriptions does not include pre-2005 designations. Fund numbers are re-used, making it impossible to determine the original purpose of some older, defunct funds. These funds generally appear to be very small. Because we are projecting forward from the most recently completed fiscal year, we assumed that these funds would not be in the frame.
Fiscal Futures Project Documentation. (2016). Institute of Government and Public Affairs, University of Illinois System. https://igpa.uillinois.edu/fiscal-futures-project-documentation/. Last document posted online. Updated by Richard Dye.↩
“Closed” year: accounts have been reconciled and reported as final.
“Lapse period:” June 30 fiscal year end date has passed, but books remain open 3-6 months to settle obligations.
“Open” year: accounts are still subject to revision and reconciliation (includes lapse period).
“Current” year: fiscal year has begun (July 1) but not yet ended (June 30).
“Upcoming” year: next fiscal year for which have actual or proposed appropriations and official revenue estimates.
“Projection” year: future years for which model is used to project expenditure and revenue by category. ↩


A type alias for a retroable or builtin array-like object.
Chain together several iterables.
The iterable or array-like objects of interest.
An iterator which yields the values of the iterables in the order in which they are supplied.
import { chain, toArray } from '@phosphor/algorithm';
let data1 = [1, 2, 3];
let data2 = [4, 5, 6];
let stream = chain(data1, data2);
toArray(stream); // [1, 2, 3, 4, 5, 6]
Invoke a function for each value in an iterable.
The iterable or array-like object of interest.
The callback function to invoke for each value.
Iteration can be terminated early by returning false
from the
callback function.
Linear.
import { each } from '@phosphor/algorithm';
let data = [5, 7, 0, -2, 9];
each(data, value => { console.log(value); });
Create an empty iterator.
A new iterator which yields nothing.
import { empty, toArray } from '@phosphor/algorithm';
let stream = empty<number>();
toArray(stream); // []
Test whether all values in an iterable satisfy a predicate.
The iterable or array-like object of interest.
The predicate function to invoke for each value.
true
if all values pass the test, false
otherwise.
Iteration terminates on the first false
predicate result.
Linear.
import { every } from '@phosphor/algorithm';
let data = [5, 7, 1];
every(data, value => value % 2 === 0); // false
every(data, value => value % 2 === 1); // true
Filter an iterable for values which pass a test.
The iterable or array-like object of interest.
The predicate function to invoke for each value.
An iterator which yields the values which pass the test.
import { filter, toArray } from '@phosphor/algorithm';
let data = [1, 2, 3, 4, 5, 6];
let stream = filter(data, value => value % 2 === 0);
toArray(stream); // [2, 4, 6]
Find the first value in an iterable which matches a predicate.
The iterable or array-like object to search.
The predicate function to apply to the values.
The first matching value, or undefined
if no matching
value is found.
Linear.
import { find } from '@phosphor/algorithm';
interface IAnimal { species: string, name: string };
function isCat(value: IAnimal): boolean {
return value.species === 'cat';
}
let data: IAnimal[] = [
{ species: 'dog', name: 'spot' },
{ species: 'cat', name: 'fluffy' },
{ species: 'alligator', name: 'pocho' }
];
find(data, isCat).name; // 'fluffy'
Create an iterator for an iterable object.
The iterable or array-like object of interest.
A new iterator for the given object.
This function allows iteration algorithms to operate on user-defined iterable types and builtin array-like objects in a uniform fashion.
Transform the values of an iterable with a mapping function.
The iterable or array-like object of interest.
The mapping function to invoke for each value.
An iterator which yields the transformed values.
import { map, toArray } from '@phosphor/algorithm';
let data = [1, 2, 3];
let stream = map(data, value => value * 2);
toArray(stream); // [2, 4, 6]
Find the maximum value in an iterable.
The iterable or array-like object to search.
The 3-way comparison function to apply to the values.
It should return < 0
if the first value is less than the second.
0
if the values are equivalent, or > 0
if the first value is
greater than the second.
The maximum value in the iterable. If multiple values are
equivalent to the maximum, the left-most value is returned. If
the iterable is empty, this returns undefined
.
Linear.
import { max } from '@phosphor/algorithm';
function numberCmp(a: number, b: number): number {
return a - b;
}
max([7, 4, 0, 3, 9, 4], numberCmp); // 9
Find the minimum value in an iterable.
The iterable or array-like object to search.
The 3-way comparison function to apply to the values.
It should return < 0
if the first value is less than the second.
0
if the values are equivalent, or > 0
if the first value is
greater than the second.
The minimum value in the iterable. If multiple values are
equivalent to the minimum, the left-most value is returned. If
the iterable is empty, this returns undefined
.
Linear.
import { min } from '@phosphor/algorithm';
function numberCmp(a: number, b: number): number {
return a - b;
}
min([7, 4, 0, 3, 9, 4], numberCmp); // 0
Find the minimum and maximum values in an iterable.
The iterable or array-like object to search.
The 3-way comparison function to apply to the values.
It should return < 0
if the first value is less than the second.
0
if the values are equivalent, or > 0
if the first value is
greater than the second.
A 2-tuple of the [min, max]
values in the iterable. If
multiple values are equivalent, the left-most values are returned.
If the iterable is empty, this returns undefined
.
Linear.
import { minmax } from '@phosphor/algorithm';
function numberCmp(a: number, b: number): number {
return a - b;
}
minmax([7, 4, 0, 3, 9, 4], numberCmp); // [0, 9]
Create an iterator which yields a value a single time.
The value to wrap in an iterator.
A new iterator which yields the value a single time.
import { once, toArray } from '@phosphor/algorithm';
let stream = once(7);
toArray(stream); // [7]
Create an iterator of evenly spaced values.
The starting value for the range, inclusive.
The stopping value for the range, exclusive.
The distance between each value.
An iterator which produces evenly spaced values.
In the single argument form of range(stop)
, start
defaults to
0
and step
defaults to 1
.
In the two argument form of range(start, stop)
, step
defaults
to 1
.
Summarize all values in an iterable using a reducer function.
The iterable or array-like object of interest.
The reducer function to invoke for each value.
The final accumulated value.
The reduce
function follows the conventions of Array#reduce
.
If the iterator is empty, an initial value is required. That value will be used as the return value. If no initial value is provided, an error will be thrown.
If the iterator contains a single item and no initial value is provided, the single item is used as the return value.
Otherwise, the reducer is invoked for each element in the iterable. If an initial value is not provided, the first element will be used as the initial accumulated value.
Linear.
import { reduce } from '@phosphor/algorithm';
let data = [1, 2, 3, 4, 5];
let sum = reduce(data, (a, value) => a + value); // 15
Create an iterator which repeats a value a number of times.
The value to repeat.
The number of times to repeat the value.
A new iterator which repeats the specified value.
import { repeat, toArray } from '@phosphor/algorithm';
let stream = repeat(7, 3);
toArray(stream); // [7, 7, 7]
Create an iterator for a retroable object.
The retroable or array-like object of interest.
An iterator which traverses the object's values in reverse.
import { retro, toArray } from '@phosphor/algorithm';
let data = [1, 2, 3, 4, 5, 6];
let stream = retro(data);
toArray(stream); // [6, 5, 4, 3, 2, 1]
Test whether any value in an iterable satisfies a predicate.
The iterable or array-like object of interest.
The predicate function to invoke for each value.
true
if any value passes the test, false
otherwise.
Iteration terminates on the first true
predicate result.
Linear.
import { some } from '@phosphor/algorithm';
let data = [5, 7, 1];
some(data, value => value === 7); // true
some(data, value => value === 3); // false
Iterate over an iterable using a stepped increment.
The iterable or array-like object of interest.
The distance to step on each iteration. A value
of less than 1
will behave the same as a value of 1
.
An iterator which traverses the iterable step-wise.
import { stride, toArray } from '@phosphor/algorithm';
let data = [1, 2, 3, 4, 5, 6];
let stream = stride(data, 2);
toArray(stream); // [1, 3, 5];
Take a fixed number of items from an iterable.
The iterable or array-like object of interest.
The number of items to take from the iterable.
An iterator which yields the specified number of items from the source iterable.
The returned iterator will exhaust early if the source iterable contains an insufficient number of items.
Create an array from an iterable of values.
The iterable or array-like object of interest.
A new array of values from the given object.
import { iter, toArray } from '@phosphor/algorithm';
let data = [1, 2, 3, 4, 5, 6];
let stream = iter(data);
toArray(stream); // [1, 2, 3, 4, 5, 6];
Topologically sort an iterable of edges.
The iterable or array-like object of edges to sort.
An edge is represented as a 2-tuple of [fromNode, toNode]
.
The topologically sorted array of nodes.
If a cycle is present in the graph, the cycle will be ignored and the return value will be only approximately sorted.
`
typescript
import { topologicSort } from '@phosphor/algorithm';
let data = [ ['d', 'e'], ['c', 'd'], ['a', 'b'], ['b', 'c'] ];
topologicSort(data); // ['a', 'b', 'c', 'd', 'e']
Iterate several iterables in lockstep.
The iterable or array-like objects of interest.
An iterator which yields successive tuples of values where each value is taken in turn from the provided iterables. It will be as long as the shortest provided iterable.
import { zip, toArray } from '@phosphor/algorithm';
let data1 = [1, 2, 3];
let data2 = [4, 5, 6];
let stream = zip(data1, data2);
toArray(stream); // [[1, 4], [2, 5], [3, 6]]
Generated using TypeDoc
A type alias for an iterable or builtin array-like object.


Antonio Brown apologizes to Patriots, owner Robert Kraft
by EndPlayBOSTON (AP) - Antonio Brown has apologized to the Patriots and team owner Robert Kraft for any negative attention he brought to the team during his brief stint in New England.
The four-time All-Pro receiver posted his apology on Instagram Tuesday, writing: "All I wanted to be was an asset to the organization; sorry for the bad media and the drama!"
The apology comes on the heels of past posts in which he indicated he'd fight the Patriots' decision to withhold a $9 million signing bonus. He also reportedly met with NFL officials last week to discuss various sexual assault allegations against him that could make him subject to a possible suspension under the league's personal conduct policy if he's signed by another team.
The Patriots cut ties with Brown in September following just one game after a second woman accused him of sexual misconduct. They were the third team in less than a year to tire of the off-field behavior that has overshadowed his on-field accomplishments.
On his first unemployed NFL Sunday, Brown took shots at Kraft and longtime Steelers quarterback Ben Roethlisberger.
___
More AP NFL: https://apnews.com/NFL and https://twitter.com/AP_NFL


Welcome to LaunchRocket, a free teaser template from LaunchRiot.com.
It was put together by @avizuber and @nadavreis. Enjoy!
Close this message for a full preview. Click here to download it. Like it? Share it!
Business travelers are busy people
BizMem is here to remember them important stuff, without any need to go after anything
Sign up below and we'll let you know when it's ready for primetime.


ST PIRAN'S-DAY AND PICROUS-DAY.
HONE, in his "Every-Day Book," has the following remarks on St Piran :
"This saint, anciently of good repute in Cornwall, is not mentioned by Butler. According to Porter, he was born in Ireland, and became a hermit there. He afterwards came to England, and settling at Cornwall, had a grave made for hint, entered into it, and dying on the 6th of March, 'in the glorie of a great light and splendour that appeared at the same instant,' was buried at Padstow. 'He is reported,' says Porter, 'to have wrought manie wonderful miracles in his lifetime, which, because they tend rather to breed an incredulous amazement in the readers, than move to anie workes of virtues or pietie, we have willingly omitted.' We have had a specimen of such miracles as Father Porter deemed worthy of belief; those of St Piran, which would have caused 'incredulous amassment' in Porter's readers, must have been 'passing wonderful.'"
"St .Piran's.day is said to be a favourite with the tinners. Having a tradition that some secrets regarding the manufacture of tin was communicated to their ancestors by that saint, they leave the manufacture to shift for itself for that day, and keep it as a holiday." [a]
Mr T. Q. Couch obligingly favours me with the following note on Picous-day:--
"The second Thursday before Christmas-day is a festival observed by the tinners of the district of Blackmore, and known as .Picrous day. It is not at present marked by any distinctive ceremonies, but it is the occasion of a supper and much merry-making. The owner of the tin-stream contributes a shilling a man towards it. This is said to be the feast of the discovery of tin by a man named Picrous. My first impression was that the day took its name from the circumstance of a pie forming the pièce de résistance of the supper; butt this explanation is not allowed by tinners, nor sanctioned by the usages of the feast. What truth there may be in the tradition of the first tinner, Picrous, it is now too late to discover, but the notion is worth recording. It has occurred to me whether, from some similarity between the names (not a close one, I admit it), the honours of Picrous may not have been transferred to St Piran, who is generally said to be the patron saint of tunners. St Piran is not known in Blackmore, and his festival is on the 5th of March. The tinners also have a festival to commemorate the discovery of smelting."
[a] Gilbert's "History."


Arturo "Artie" Bradic was born in Mexico City in 1995 and immigrated to the U.S. at the age of 5. He grew up in Northwest Arkansas and eventually moved to Tucson, AZ to pursue a Neuroscience and Cognitive Science degree at the University of Arizona. After graduating and working in medicine for 2 years, he realized pursuing medical school was not the right path for him and switched careers to another interest that fullfilled his need for creativity and creation: technology and development. Naïve or ambitious? We'll find out soon...


How to install?¶
MulensModel can be installed using setup.py - just download the source, go to the package directory and run:
python setup.py install
To make sure that all the necessary packages (including astropy package) are installed, please run:
pip install -r requirements.txt
and this should work. If there are problems, please contact code authors.
Old installation¶
Make sure you have python with astropy package installed.
Download source code - either recent release or the current repository from MulensModel github page (green button on right).
Unpack the archive.
Add the path to the unpack directory to the
PYTHONPATH
, e.g., if you’ve extracted the archive in your home directory (/home/USER_NAME/
) and MulensModel version in 1.17.0 in tcsh (update the path as needed):setenv PYTHONPATH /home/USER_NAME/MulensModel-1.17.0/source\:$PYTHONPATH
in bash:
export PYTHONPATH=/home/USER_NAME/MulensModel-1.17.0/source:$PYTHONPATH
In order to have this command invoked every time you open a terminal, please add this command to your startup file (~/.cshrc
, ~/.bashrc
, ~/.profile
, or similar). If you didn’t have PYTHONPATH
defined before, then skip the last part of the above commands.
Go to subdirectory
source/VBBL/
and runmake
command. If it’s not working and you’re using Windows, then please run:gcc -lm -lstdc++ -fPIC -c VBBinaryLensingLibrary.cpp gcc -Wl,-soname,rapper -shared -o VBBinaryLensingLibrary_wrapper.so VBBinaryLensingLibrary_wrapper.cpp -lm -lstdc++ -fPIC VBBinaryLensingLibrary.o
Repeat step 5. in
source/AdaptiveContouring/
subdirectory.Run
py.test
insource/MulensModel/
to check that all unit tests pass.Congratulations! You have MulensModel installed fully.


Depending on market development we plan to expand the team during the 2nd half of 2020. We will then be looking for people with the following profile:
If you want to join us in our mission to improve security, privacy and usability for cryptocurrencies, send us your application to<EMAIL_ADDRESS>We offer a dynamic and flexible work environment with competitive compensation.


Overview
The Advanced tab contains some lesser used options when building a character.Advanced Metadata
- Vary label by stage: This allows you to change what other characters call your character based on their clothing stage. For example, Mulan is initially known as Ping but switches to Mulan after revealing her secret identity. You do not need to fill out every stage. If a stage is left blank, the previous stage's label is used.
- Scale factor: This provides global scaling to your images in the game. Perhaps you made your images too big and don't want to regenerate all of them. You could instead scale them down here.
- Speech bubble position: For talkative characters, it's possible for the speech bubble and the character model to overlap. Normally the bubble appears behind the character, blocking the text. You can use this to put the speech bubble in front of your character.
- Z layer: This adjusts the sorting layers between players. If you are making a custom pose that extends into other character's spaces, you may want to apply a negative z layer so as to ensure your pose appears behind everybody else.
Nicknames
While the Label in the section above is what other characters call yours, nicknames are what other characters call yours when using the ~name~ variable. You can assign multiple nicknames to the same character, and the game will choose a random one each time it plays a line with ~name~.If you want to assign one or more nicknames to the entire roster, use the second table. Characters with specific nicknames assigned will have priority over this global list.
Dynamic Nicknames
You can also nicknames to characters in the middle of the game by using a special per-target marker called nickname. To use this in dialogue, rather than ~name~, use ~marker.nickname~. The following example will cause your character to call the target of the line where this marker was set "Biggest Loser" for the remainder of the game.Custom Text Formatting
For added expressiveness, it's possible to add custom text formatting to your speech bubbles via custom styles. The game includes a handful of prebuilt styles available for all characters to use, but it's also possible to add styles unique to your character. You can find this on your character's Advanced tab.Style Usage
To enable custom formatting in dialogue, type the style name in curly brackets. To remove all custom formatting mid-line, use {!reset}. For instance, the line "This text is {b}bold{!reset} and {i}italicized{!reset}." will produce "This text is bold and italicized" when displayed in game.Creating Styles
Click the + in this section to create a style. The very first style will be called "example" and will turn text blue. Additional styles will start out being called just "style". To edit a style, select it from the list.- Style name: The name is how your style is accessed in dialogue. For instance a style named "example" is used in dialogue by typing {example}. Style names cannot contain spaces or special characters.
- Description: This is used by intellisense when typing { in dialogue to describe what the style does. It has no effect in game.
Once the property has been added, fields appear for customizing it. The preview at the bottom updates immediately to give an idea how it would look in game.
Miscellaneous Properties
Custom styles are really just CSS behind the scenes. You can use the "Other" style property type to add arbitrary CSS properties to your style. Note that the preview in the editor uses IE11, which is missing some of the more modern CSS properties. Therefore, it's possible that some effects won't appear in the editor but will still show in game when using a modern browser.Global Styles
The game has several common styles available to all characters already. These are used the same way as character-specific custom styles. Global styles include:- {b}: Bold
- {i}: Italics
- {s}: Strikethrough
- {u}: Underline
- {highlight}: Applies a highlighter effect to text
- {mono}: Monospace font (like a robot talking)
- {small}: Slightly smaller text
- {big}: Slightly larger text


“We keep moving forward, opening new doors, and doing new things,
because we’re curious and curiosity keeps leading us down new paths.” -
Walt Disney
Staying Inspired
The Power of Tech Communities
Thanks to Jon, Lee, Boon
& all the wonderful volunteers!
"Kansas City Developers Conference cultivates community among techies"
- via Startland News
Jennifer Wadella
@likeOMGitsFEDAY
JavaScript Developer
Accidental Community Organizer
Founder of Kansas City Women in Technology
CoderDojoKC
Coding & Cupcakes
Coding & Cocktails
Midwest Dev Chat Currator
Twitter warning: Bachelor tweets
self taught developer working at admissions software company
always organized groups of people
Conference Hype
Are You Inspired?
So day one of KCDC, day two if you've been at the precompilers. How is it?
Have you seen some amazing talks? How do they make you feel? Are you inspired?
Being at a technical conference can be a wonderful thing. You get to hear from
brilliant speakers, hear about exciting new technologies, and share the passion
for your craft with those around you. The halls buzz with excitement and chatter,
it can be hard not to walk away feeling empowered.
Are you ready to change the world? Are you raring to going to go home and try that
new tech stack? Are you inpsired?
How will you feel the day after?
And Monday?
And Tuesday?
And Wednesday?
And the next week?
Slowly, these feelings may start to fade. Will you return to the regular pace of your day?
Will you realize your team isn't ready to implement that new deployment process you were so inspired by?
Will you remember how you felt during that talk that validated the way you write code, or lead a team,
or make technical decisions? When will you return to the hum drum of completing those tickets in your
sprint and picking up the kids from daycare and remembering to get the propane tank and was that
kid's birthday party on Saturday or Sunday and did I respond to that email and why is QA not seeing
the changes I just deployed?
When you're on support duty next week working on bugs, will you be putting those newly learned best-practice
techniques to use?
Will you still be working on that side project you were inspired to change the world with after seeing
that awesome Arduino demo about dogs sending selfies?
Will you still be sharing insights you learned at KCDC with your significant other at the dinner table?
How long will you stay inspired?
Hello World.
Can you remember your first moment?
Hello world is often the first app a developer ever writes.
I run a lot of programs teaching kids to code.
When you started programming, or the last time you tackled something new,
do you remember your "hello world moment"?
Coding & Cupcakes, May 2015
Are You Inspired?
Clearly reflecting on your hello world moment every time you're feeling
uninspired would get old and quite frankly obnixous.
How do you get that inspiration back?
Communities to the rescue!
Why do Communities do this for us?
Maslow's Hierarchy
Acceptance. Maslow's freaking heirarchy.
If you've never taken a psych class, I'll give you a crash course.
In 1943 Maslow stated that people are motivated to achieve certain needs. When one need is
fulfilled a person seeks to fullfil the next one, and so on. So he created this pyramid model
- splitting needs into 5 levels.
The most basic is physiological - health, food, sleep... the most rudimentary things
we need to survive. Once those needs are satisfied, we move on to safety .
We search for shelter, removal from danger, stability, freedom from fear. Fortunalely for us,
this is already taken care of, at least until the impending zombie apocalypse occurs. In that
case, I'm sure most people watch enough Walking Dead to know what NOT to do to survive.
So once we're fed, on a diet of Mountain Dew and Dortios, of course, and safe, the next thing
we look for is acceptance. There really is a biological reason behind needing to feel as though
you belong to a group.
In early days of humanity, being a part of a group was necessary to survive. We were hunters
and gatherers that shared food and cared for offspring in groups. We created and shared tools.
If you were different in any way, or stood out, you would be cast from the group, and die on
your own. That's why we're programmed to fear rejection - it's biological.
So we've established it is as simple as just a human need to feel accepted and to be part
of a community. The next thing we strive for is self-esteem, confidence, achievement - respect from ourself and others.
If you don't have a community that can relate to your achievements, you may have a hard time
fulfilling this need. At my first job, I was the only designer/developer. There was no basis
for my level of achievement. As far as the client managers were concerned, I sat in my cube doing
magic having graduated from the university of Hogwarts School of Webery. When I accomplished
anything, there was nothing to compare it to, therefor no sense of achievement or self worth.
Granted this was also before twitter took off and my only connection to anything relevant in
the web industry was reading SmashingMagazine.com.
Developer Communities are important in that they fill a need for acceptance, and give us a sense
of belonging to others who understand what we do, and why it's so awesome. Let's be real - I love
being a developer, and I'm sure you do too, that's why you're here. Being a part of a community
who understands what you do can help you access your validity and skill level.
The very top level is self-actualization - achieving your potential. According to Maslow,
a person is always “becoming” and never remains static in these terms. In self-actualization a
person comes to find a meaning to life that is important to them. I don't run into many developers
who are happy with how they are now; they're always looking to learn, grow, and improve. This may
explain the discontent you feel when you're doing maintenance, or on a project that doesn't require
any learning or growth.
Communities help you find your people.
People who understand the developer life
Know what the highs and lows are like
Can share their highs
Community
com·mu·ni·ty [kuh-myoo-ni-tee]
a social, religious, occupational, or other group sharing common characteristics or interests and perceived or perceiving itself as distinct in some respect from the larger society within which it exists
Community is defined as "a social, religious, occupational, or other group sharing common characteristics or interests and perceived or perceiving itself as distinct in some respect from the larger society within which it exists".
So we are an occupationals group with common characteristics, and in all likelyhood shared interests.
Let's now talk about existing communities you may or may not be aware of. We're first going to look inside the workplace, as you probably spend a minimum of 40 hours a week there.
Examples
work teams
disciplines
online communities
user groups
How to get involved
Make connections. "networking for developers"
Lunch it up. And invite the new person!
Evangelize your workplace.
Get on social media.
Answer questions.
Actually go to stuff...
Are You Inspired?
Do you want to start your own community?
Have you noticed there's not a community for your flavor of tech?

Not from KC?
Tips for Building Communities
Just ask.
Become an email master.
Communicate well.
Be consistent.
Prioritize the needs of your community.
Don't be afraid to delegate or change the guard.
emailing is hard, esp as a developer. - inbox snooze, apps like MixMax
communicate well: people like to be informed and know whats going on.
Ask for feedback, but be prepare for critism. It's how you'll grow
Fresh persectives are key.
Next Steps
Check out the user group tables outside.
Join a slack channel: Midwest Dev Chat 700 devs & growing
Come to the attendee party.
Attendee Party
No Other Pub
7-9pm
So here's the BIG CTA. Just one step. Come to the attendee party tonight.
If you've got kids to take care of, text or call your significant other, and
ask nicely to take a few hours to network. Does your cat need to be fed?
Text a roommate or friend. D&D group meeting? Ok, I don't know if I can talk you
into blowing that off, I know how hardcore my friends are about that night. But you
should come anyway.
Tell that speaker how much you enjoyed their talk. Take the chance to pick their brain.
Talk to someone new. Reconnect with someone old. And finally,
be inspired by someone else's story, or better yet, inspire someone with you own.
Come join the community.


context-link
📖 link contextual based text entries
Installation
npm install --save context-link
Usage
var context = new ContextLink([
'hello world',
'hello saturn',
'hello pluto'
]);
var found = context.find('hello');
UMD bundle located in ./dist


Wiki ▸ [[API Reference]] ▸ [[Geo]] ▸ Geo Streams
For fast transformations of geometry without temporary copies of geometry objects, D3 uses geometry streams. The main d3.geo.stream method converts a GeoJSON input object to a stream: a series of method calls on a stream listener. In addition, D3 provides several stream transformations that wrap listeners and transform the geometry. For example, the projection.stream interface transforms spherical coordinates to Cartesian coordinates, and d3.geo.path serializes geometry to either SVG or Canvas. Internally, clipping and rotating are also implemented as stream transformations.
# d3.geo.stream(object, listener)
Streams the specified GeoJSON object to the specified stream listener. (Despite the name “stream”, these method calls are currently synchronous.) While both features and geometry objects are supported as input, the stream interface only describes the geometry, and thus additional feature properties are not visible to listeners.
Stream listeners must implement several methods to traverse geometry. Listeners are inherently stateful; the meaning of a point depends on whether the point is inside of a line, and likewise a line is distinguished from a ring by a polygon.
# listener.point(x, y[, z])
Indicates a point with the specified coordinates x and y (and optionally z). The coordinate system is unspecified and implementation-dependent; for example, projection streams require spherical coordinates in degrees as input. Outside the context of a polygon or line, a point indicates a point geometry object (Point or MultiPoint). Within a line or polygon ring, the point indicates a control point.
# listener.lineStart()
Indicates the start of a line or ring. Within a polygon, indicates the start of a ring. The first ring of a polygon is the exterior ring, and is typically clockwise. Any subsequent rings indicate holes in the polygon, and are typically counterclockwise.
# listener.lineEnd()
Indicates the end of a line or ring. Within a polygon, indicates the end of a ring. Unlike GeoJSON, the redundant closing coordinate of a ring is not indicated via point, and instead is implied via lineEnd within a polygon. Thus, the given polygon input:
json
{
"type": "Polygon",
"coordinates": [
[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]
]
}
Will produce the following series of method calls on the listener:
js
listener.polygonStart();
listener.lineStart();
listener.point(0, 0);
listener.point(1, 0);
listener.point(1, 1);
listener.point(0, 1);
listener.lineEnd();
listener.polygonEnd();
# listener.polygonStart()
Indicates the start of a polygon. The first line of a polygon indicates the exterior ring, and any subsequent lines indicate interior holes.
# listener.polygonEnd()
Indicates the end of a polygon.
# listener.sphere()
Indicates the sphere (the globe; the unit sphere centered at ⟨0,0,0⟩).
A stream transform wraps a stream listener, transforming the geometry before passing it along to the wrapped listener. A geographic projection is one example of a stream transform. The d3.geo.transform class provides an easy way of implementing a custom stream transform.
# d3.geo.transform(methods)
Creates a new stream transform using the specified hash of methods. The hash may contain implementations of any of the standard stream listener methods: sphere, point, lineStart, lineEnd, polygonStart and polygonEnd. Any method that is not present in the specified hash will be implemented a pass-through directly to the wrapped stream. To access the wrapped stream within a method, use this.stream
. For example, to implement a simple 2D matrix transform:
js
function matrix(a, b, c, d, tx, ty) {
return d3.geo.transform({
point: function(x, y) { this.stream.point(a * x + b * y + tx, c * x + d * y + ty); },
});
}
This transform can then be used in conjunction with d3.geo.path. For example, to implement a 2D affine transform that flips the y-axis:
js
var path = d3.geo.path()
.projection(matrix(1, 0, 0, -1, 0, height));
# transform.stream(listener)
Given the specified stream listener, returns a wrapped stream listener that applies this transform to any input geometry before streaming it to the wrapped listener.
# d3.geo.clipExtent()
Create a new stream transform that implements axis-aligned rectangle clipping. This is typically used to clip geometry to the viewport after projecting.
# clipExtent.extent([extent])
If extent is specified, sets the clip extent to the specified rectangle [[x0, y0], [x1, y1]] and returns this transform. If extent is not specified, returns the current clip extent, which defaults to [[0, 0], [960, 500]].