Charlotte bowl eligible for first time, beats Marshall 24-13
CHARLOTTE, N.C. (AP) - Victor Tucker scored two fourth-quarter touchdowns, and Charlotte is bowl eligible for the first time with its 24-13 victory over Marshall on Saturday.
The 49ers (6-5, 4-3 Conference USA) have won four straight conference games for their program-best sixth win.
Tucker ran into the end zone from the 5 on a jet sweep to give Charlotte a 17-13 lead with 10:47 to play. Charlotte’s Nafees Lyon intercepted an Isaiah Green pass with about seven minutes left. Chris Reynolds then led the 49ers on an 11-play, 62-yard drive capped by his 25-yard TD pass to Tucker with 48 seconds remaining.
Tucker had five catches for 121 yards. Reynolds threw for 166 yards and two interceptions and added 145 yards on the ground, including a 15-yard touchdown run in the second quarter.
Benny LeMay added 100 yards rushing to surpass 3,000 in his career at Charlotte.
Brenden Knox had 92 yards rushing for Marshall (7-4, 5-2). Joseph Early scored on a 16-yard punt return and Justin Rohrwasser made two field goals.
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


24 January 2000
Disease Outbreak Reported
Since the beginning of the year, 61 suspected cases of yellow fever have been reported. Five have been laboratory confirmed, 8 discarded and for 48 the lab results are pending. Among the 5 confirmed cases one was detected in the State of Rio de Janeiro (Rio de Janeiro County), two have been identified in the State of Sao Paulo (Sao Paulo City and Campinas counties). These 3 cases were infected in Alto Paraíso county, State of Goiás, the same place of infection of 2 cases in residents of Brasília reported in late December 1999. The other 2 confirmed cases (both fatal) were reported by the Goiás State in residents of Doverlândia and Goiás Velho Counties, both in Goiás.
Active surveillance is in place throughout the country. All 5 confirmed cases are represent sylvatic transmission of yellow fever virus. There is no evidence of urban transmission.
Yellow
Fever in Brazil- 2000 Epidemiological
Weeks: 1 - 3 Number of
cases investigated:61 Number of
cases discarded:8 Number of
cases under investigation:48 Confirmed
Cases Reporting State Reporting County Place of Infection Confirmed Cases Deaths 2 0 1 0 1 0 1 0 1 0 2 2 1 1 1 1 5 2
Confirmed Cases: 5
São Paulo
São Paulo
Alto Paraíso, State of Goiás
Campinas
Alto Paraíso, State of Goiás
Rio de Janeiro
Rio de Janeiro
Alto Paraíso, State of Goiás
Goiás
Doverlândia
Doverlândia, State of Goiás
Goiás Velho
Goiás Velho, State of Goiás
TOTAL


This SPARQL micro-service searches Flickr photos related to a certain taxonomic name. It takes as input a species scientific name (without authority nor date), and relies on the common convention used e.g. in the Encyclopedia of Life and by Biodiversity Heritage Library where photos are tagged with a taxonomic name formatted as: taxonomy:binomial=<scientific name>.
- Canonical URL
- http://example.org/flickr/getPhotosByTaxon_sd/
- Query mode
- SPARQL
- Input parameter: name
-
The taxon scientific name without authorship nor date information.
Passed as the object of predicate http://rs.tdwg.org/dwc/terms/scientificName.
Example: Delphinus delphis
- Service Description graph
- http://example.org/flickr/getPhotosByTaxon_sd/ServiceDescription
- SHACL graph
- http://example.org/flickr/getPhotosByTaxon_sd/ShapesGraph


#include <point.h>
Public Member Functions | |
| point (double i, double j, double k, const color &col) | |
Public Attributes | |
| color | c |
| double | x |
| double | y |
| double | z |
| point::point | ( | double | i, | |
| double | j, | |||
| double | k, | |||
| const color & | col | |||
| ) | [inline] |
| double point::x |
| double point::y |
| double point::z |


I am a backend developer and Recent graduate of the University of Idaho Coeur d'Alene campus.
I am an effective programmer with both low-level and high-level backend systems. I am proficient at writing in C, C++, Python, and powershell, have moderate experience with Java, and basic experience with .net. I am also proficient in writing embedded systems and real-time operating systems.
While working in my previous position at Micron, I had the opportunity to not only work as a part of a team, but to effectively communicate across different cultures and time zones. The job also helped with my ability to distribute my time across multiple projects, and to change focus quickly.
Graduation date: December 2019
Relevant courses:
Micron Technology, Inc. - Boise, ID
May 2018 to December 2018
Duties:
University of Idaho - Coeur d'Alene, ID
May 2019 to August 2019
My primary acomplishment over the summer was writing an interface for easy communication with an underwater drone using Mavlink. The interface is written in Python, and makes use of PyMavLink for some of the connections


{% block css %}{% endblock %}
✕ Close
{% if user.is_authenticated %}
{{ user.username }}
Signout
{% else %}
Signup
Signin
{% endif %}
M
✕ Close
✕ Close
Home
Company
Resume Tips
Resume Templates
CV Templates
Cover Letter Templates
Tips
About Us
Contact Us
2
✕ Close
Electronics
Yellow Wireless Headphone
1 x
$8
Electronics
Nikon DSLR Camera 4k
1 x
$8
Women Clothing
New Dress D Nice Elegant
1 x
$8
Men Clothing
New Fashion D Nice Elegant
1 x
$8
SUBTOTAL
$16
PROCEED TO CHECKOUT
VIEW CART
{% block body %}{% endblock %}
Item is added successfully!
Beats Bomb Wireless Headphone
Quantity: 1
$170.00
1 item (s) in your cart
CONTINUE SHOPPING
VIEW CART
PROCEED TO CHECKOUT
{% block script %}{% endblock %}
JavaScript is disabled in your browser.
Please enable JavaScript in your browser or upgrade to a JavaScript-capable browser.


§533-9 Barred by divorce or misconduct. In case of divorce dissolving the marriage contract, the wife shall not be endowed.
No wife who has for one year or upwards, previous to the death of her husband, wilfully and utterly deserted her husband, shall be endowed or be entitled by way of dower to any property owned by him at the date of his death. [CC 1859, §1307; RL 1925, §3025; RL 1935, §4838; RL 1945, §12108; am L 1945, c 212, §1; RL 1955, §319-9; HRS §533-9]
Case Notes
Divorce cuts off dower though obtained by wife for misconduct of husband. 12 H. 265.
Though appeal from divorce decree pending at time of death, no dower. 35 H. 440.
"Wilful and utter desertion," establishment of. 61 H. 236, 602 P.2d 521.


KidRec 2018
2nd International Workshop on Children & Recommender Systems
June 19, 2018
Co-located with ACM Interaction Design and Children (IDC) Conference 2018 - Trondheim, Norway
Recommender systems (RS) are software implementations that provide suggestions for items to be of use to a user. These suggestions are intended to facilitate the decision-making process. RS can aid children, as well as parents and educators, in locating materials for learning and play, e.g., books, video contents, or digital games, that are not only of interest to the user, but are also developmentally and educationally appropriate. This in turn calls for new design and evaluation approaches--not only in terms of data and algorithms, but also in terms of UX, re-thinking the goals of recommendations when dealing with children, as well as the concept of trust and persuasion for this specific target group, taking into account critical issues such as ethics, privacy, and security.
Following the success and interest of participants in the first KidRec in Como, Italy (in conjunction with ACM Conference on Recommender Systems), we look forward to hold a second workshop at the upcoming 2018 IDC Conference.
The specific theme of this edition of KidRec will be on RS in the educational domain for children , but we welcome other research papers and position papers related to the design of recommender technologies for children.
A reflection on the complex issues associated with kid-related RS leads to several questions that need to be answered from an interdisciplinary perspective to allow for a holistic understanding of their impact on individual children. Given that children's access to online content is global, it also requires an international perspective that would incorporate best practice on the use of children's data for educational and commercial purposes from a global viewpoint. Current research lacks behind the reality of many software developments in this area and use of RS in formal and informal learning environments. In light of the urgency of issues such as potential misuse of children's personal data, and the scale of the use of RS in education worldwide, we feel it is necessary to bring an international, multidisciplinary community together to collectively map out the field of RS for children, and to begin to address these issues together.
Goals
As an interactive workshop, KidRec aims to congregate researchers and experts from multiple disciplines, in order to understand the ethical, pedagogical, and technical implications of designing and developing RS for children and educational activities. We intend to do this by accomplishing the following three main goals:
| Paper submission deadline | April 30, 2018 |
| Notification to authors | May 2, 2018 |
| Camera-Ready Version | May 7, 2018 |
| KidRec Workshop | June 19, 2018 |
We invite submissions related to recommender systems for children including papers concerned with: educational technology for children; recommender algorithms for children; recommendation explanations; privacy of children’s data; transparency; expert-in-the-Loop (e.g., teacher, parent); child-centered content domains (e.g., leisure, education); user profiling; personalization; gamification; mediation, to name a few.
We invite short papers (4-6 pages) discussing novel work in progress and position papers (2-4 pages) focusing on open challenges in promising research directions as well as speculative or innovative work in progress.
All papers should be submitted in the SIGCHI extended abstract format
All papers will be peer-reviewed, and must not be under review in any other conference, workshop or journal (at the time of submission).


For over 20 years I've dedicated myself to solving problems and providing the very best customer service possible. Regardless of the position or title it is always about understanding the needs of the client and the challenges that stand in the way of them achieving their goals. From home users to Fortune 500 companies around the world, I’ve solved problems big and small. As a consultant, support/escalation manager, and trainer I have primarily focused on Microsoft based infrastructure and server applications, networking, BlackBerry wireless messaging, and Google based solutions for business and schools.
I am opening a new chapter of my career as a student in the UIT Startup Immersion program at Cape Breton University. Upon completion of this program it is my plan to go on solving problems but on a much bigger scale.
I currently reside on the beautiful island of Cape Breton in the community of Scotchtown, Nova Scotia, Canada with partner Morene, our children and our dogs.
Phone:<PHONE_NUMBER>
Email<EMAIL_ADDRESS>Address:
105 Patrick Street
Scotchtown, NS
Canada
B1H 2X5
If you would like me to contact you, please fill out the form below and I will make every effort to get in touch with you as soon as possible.


sin(expr)
Takes the sin of the provided expression. It is assumed the expression is in radiians. Result values are in the range -1 to 1. This function works on both gridded and station data.


Kollam is the fourth largest city in Kerala and the fifth largest in terms of corporation area. It is known for cashew processing and coir manufacturing. Ashtamudi Lake is considered the southern gateway to the backwaters of Kerala and is a prominent tourist destination at Kollam.
Jatayu Nature Park is a rock-themed park under construction at Chandamalayam in Kollam district of Kerala, all set to open in August 2017. Built to promote mythology and adventure tourism, the tourism centre boasts of 6D theatre, an audio-visual digital room, cable car and ayurvedic cave resort. It is also a home to umpteen adventure activities including paint ball, laser tag, archery, bouldering, rock climbing, air-rifle shooting etc. The primary attraction of the park however, is the world’s largest stone-cut bird sculpture replicating Jatayu, the mythical bird from Ramayana.
A gorgeous waterfall located on the Kollam-Shencottah Road at Palaruvi is lying at an altitude of 300 feet; the ideal time to enjoy the freshness of the waterfall is from June to January. Palaruvi Falls, cascading downstream from the height of 300 ft, is one of the prime attractions in Kutrallam or as some call it Courtallam, Tamil Nadu. Owing to its height; it is the 32nd highest fall in our country. The name Palaruvi means 'Stream of Milk' in the regional language. Ironically it seems to be a glittering stream of milk as it flows down. Hence, the beauty of this fall stands unimaginable till witnessed with own eyes. The roaring sounds of the fall stand in stark contrast to the silence of the forests and mist-kissed mountains around it.
Kollam Beach, also known as Mahatma Gandhi Beach, is a beach at Kollam city in the Indian state of Kerala. Kollam Beach is the first 'Beach Wedding Destination' in Kerala.
The area is covered by dense forest, rubber and tea plantations. The name has the meaning of ‘Honey Mountain.’ An Eco Tourism Development Project is under implementation here. Thenmala is also a dam site with the Parappar Dam. So as to attract tourists Thenmala has many activities and attractions like boating, rope bridge, trekking, mountaineering, biking, musical fountain and so on.


Preamble
Practical Work - Add your own Router module
-
Use the Angular router to enable navigation.
The Angular router is an external, optional Angular NgModule called RouterModule.
-
The router is a combination of multiple provided services (RouterModule), multiple directives (RouterOutlet, RouterLink, RouterLinkActive), and a configuration (Routes).
-
Create a specific file named app.routing.ts that will define your app Routes.
-
Import that module into you application.
-
add a router-outlet element at the end of your app.component template.
-
add two routerLink elements at the top of your app.component template in order to redirect the user to a specific component.


Cyber Bird
by
Muratcan Şentürk
SELECT
2
COLORS FOR YOUR
CYBER BIRD
First:
Second:
START
SCOREBOARD
Score:
0
press
SPACE
to jump
click
HERE
to start
select new
COLORS
GAME OVER
Your score is:
Try Again


Stan Collymore has a stark warning for Tottenham fans about Jose Mourinho
Stan Collymore warns Tottenham fans that Jose Mourinho may not be the right man for the club
by Social SpyStan Collymore has warned Tottenham fans that Jose Mourinho may not be the right man for Tottenham Hotspur.
Mourinho was officially appointed as the north London club’s new manager on Wednesday morning after the Lilywhites opted to sack Mauricio Pochettino on Tuesday night.
The Portuguese coach is taking his first job since being sacked by Manchester United in December of last year following the club’s poor start to the new season.
Spurs fans will be hoping to see Mourinho lead the Lilywhites up the Premier League table, with the north London club currently languishing in 14th place.
Tottenham have only won three of their opening 12 games in the Premier League to leave them well off the pace in the race for Champions League qualification.
Former Liverpool FC star Collymore is not sure whether Mourinho is the right man for Spurs, who finished fourth in the Premier League table last season.
Writing on Twitter, Collymore posted: “Amazing how some have bought into “Mourinho the winner” without any regard for how he leaves clubs.
“Unbalanced, fractured, overspending, soulless. Everything Spurs tried to avoid.
“Good luck, I like Spurs a lot, but it’s not how this man comes in, it’s how he’ll leave you.”
Mourinho’s first game in charge will be a trip to the London Stadium to take on West Ham United on Saturday lunchtime.
They will then return to Champions League action with a home clash against Greek side Olympiakos on Tuesday night.


Project contents:
The project you have created now contains several files:- Views/*.dothml – are files that describe the View of your app using enhanced HTML markup
- Views/masterpage.dotmaster – is a masterpage of your app. It contains should contain all markup, that is common for all of your pages (for more info about masterpages go here)
- ViewModels/*.cs – are viewmodels of your app, they are only plain C# classes, that are referenced in .dothtml files using the @viewModel directive.
- Startup.cs – an OWIN / ASP.NET Core startup class which registers in the DotVVM and Static Files middleware.
- DotvvmStartup.cs – a DotVVM configuration class (see the Configuration section of documentation).
Tutorial
If you are new to DotVVM you can use of our academy. It will guide you through basics of DotVVM and make you ready to get started with DotVVM development.DotVVM Academy
Builtin controls
Currently, DotVVM contains about 25 built-in controls. You can use them for creating forms, displaying collections of objects, performing validation or adding resources to your project.List of all controls
Authentication
You have chosen not to add authentication to the project. If you change your mind you can find all the information about authentication providing in DotVVM you can find them in our documentation.More information


:: com :: sun :: star :: ucb ::
|
| interface XInteractionCookieHandling |
- Base Interfaces
XInteractionCookieHandling
┗ ::com::sun::star::task::XInteractionContinuation
-
|
- Description
- An interaction continuation handing back some cookie request handling
policy.
This continuation is typically used in conjunction with
HandleCookiesRequest.
|
| Methods' Details |
setGeneralPolicy
- Description
- Set a general policy to hand back.
This method should be called before select().
- Parameter Policy
- Some policy how to handle cookies.
|
|
setSpecificPolicy
| void |
| setSpecificPolicy( |
[in] Cookie |
ConfirmCookie, |
| [in] boolean |
Accept ); |
- Description
- Set a policy to hand back for a specific cookie.
This method should be called before select().
- Parameter ConfirmCookie
- A cookie that sould come from the sequence of
cookies offered by the HandleCookiesRequest and that
should have a policy of CookiePolicy::CONFIRM.
- Parameter Accept
- If true, set the policy for the cookie to
CookiePolicy::ACCEPT; otherwise, set it to
CookiePolicy::IGNORE.
|
|
Top of Page
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


Class that dispenses batches of data for mini-batch training BatchDispenser interface cannot be created but gives methods to its child classes.
More...
|
| def | __init__ (self, size) |
| | batchDispenser constructor More...
|
| |
| def | get_batch (self, pos=None) |
| | Get a batch of features and targets. More...
|
| |
| def | split (self, num_utt) |
| | take a number of utterances from the batchdispenser to make a new one More...
|
| |
|
def | get_pair (self) |
| | get the next input-target pai
|
| |
| def | num_batches (self) |
| | The number of batches in the given data. More...
|
| |
|
def | num_utt (self) |
| | The number of utterances in the given data.
|
| |
|
def | num_labels (self) |
| | the number of output labels
|
| |
|
def | max_input_length (self) |
| | the maximal sequence length of the features
|
| |
|
def | max_target_length (self) |
| | the maximal length of the targets
|
| |
|
def | pos (self) |
| | the current position in the data
|
| |
|
def | pos (self, pos) |
| | setter for the current position in the data
|
| |
Class that dispenses batches of data for mini-batch training BatchDispenser interface cannot be created but gives methods to its child classes.
§ __init__()
| def nabu.processing.batchdispenser.BatchDispenser.__init__ |
( |
|
self, |
|
|
|
size |
|
) |
| |
batchDispenser constructor
- Parameters
-
| size | Specifies how many utterances should be contained in each batch. |
§ get_batch()
| def nabu.processing.batchdispenser.BatchDispenser.get_batch |
( |
|
self, |
|
|
|
pos = None |
|
) |
| |
Get a batch of features and targets.
- Parameters
-
| pos | position in the reader, if None will remain unchanged |
- Returns
- A pair containing:
- The features: a list of feature matrices
- The targets: a list of target vectors
§ num_batches()
| def nabu.processing.batchdispenser.BatchDispenser.num_batches |
( |
|
self | ) |
|
The number of batches in the given data.
The number of batches is not necessarily a whole number
§ split()
| def nabu.processing.batchdispenser.BatchDispenser.split |
( |
|
self, |
|
|
|
num_utt |
|
) |
| |
take a number of utterances from the batchdispenser to make a new one
- Parameters
-
| num_utt | the number of utterances in the new batchdispenser |
- Returns
- a batch dispenser with the requested number of utterances
The documentation for this class was generated from the following file:


public interface Calendaring
| Modifier and Type | Method and Description |
|---|---|
CalendarActionData |
buildActionData()
Use this method to start building the data object to be passed along
calendar actions;
|
String |
createCalendarEntry(Database dbMail,
String iCal,
Collection<CalendarWrite> flags)
Creates a calendar entry.
This supports either a single entry, or a recurring entry which may contain multiple VEVENTS represenging both the series and exception data. |
void |
entryAction(Database dbMail,
String uid,
String recurId,
Collection<CalendarProcess> action,
CalendarRangeRepeat scope,
String comment,
CalendarActionData data,
Collection<CalendarActionOptions> flags)
Perform an action on a calendar entry.
For instance, change the response of an accepted meeting to counter or delegate. This must be applied to meetings (with the exception of CalendarProcess.DELETE ,
which can be applied to any calendar entry).This makes the appropriate modifications to the invitee calendar and also sends appropriate notices out. |
String |
getApptUnidFromUID(String uid)
This is a convenience method that returns an Apptunid value that corresponds to a UID.
|
int |
getNewInvitations(Database dbMail,
TemporalAccessor start,
String uid,
TemporalAccessor since,
AtomicReference<DominoDateTime> retUntil,
List<Integer> retNoteIds,
List<String> retUNIDs)
Retrieve invitations in a mailfile that have not yet been responded to.
This returns the number of new invitations as well as optional NOTEID and/or UNID lists. This returns only invitations (and delegated invitations), and not reschedules, information updates, cancels, etc. This method does not filter out any invitations that have since been canceled/rescheduled, or are otherwise out of date. Once the invitation is accepted, other notices that apply to that meeting can be discovered with a call to getUnappliedNotices(Database, String, List, List)
must be used (on a per-UID level).Only invitations for meetings that are current (at least one instance starts within the last day or in the future) are returned, although the starting time can be specified by the caller to override the default.A caller can retrieve only invitations that have arrived since a prior call to getNewInvitations(com.hcl.domino.data.Database, java.time.temporal.TemporalAccessor, java.lang.String, java.time.temporal.TemporalAccessor, java.util.concurrent.atomic.AtomicReference<com.hcl.domino.data.DominoDateTime>, java.util.List<java.lang.Integer>, java.util.List<java.lang.String>)
by using tdSince and ptdretUntil.If uid is provided, invitations only for a
particular meeting will be returned.This is useful if you are looking for an invitation or invitations that correspond to an updated notice that has arrived. Note: Multiple invitations might exist for a particular UID if that meeting is recurring and you were added to an instance or instances after the initial creation. The returned notices are not guaranteed to be in any particular order. |
String |
getRecurrenceID(TemporalAccessor td)
This is a convenience method that returns a RECURRENCE-ID (in UTC time) from a
TemporalAccessor object. |
String |
getUIDfromDocument(Document document)
This is a convinience method that returns a UID for a calendar entry document.
NOTEID->UID is a many to one mapping since one or several documents may represent a calendar entry (especially if it repeats) and its related notices. |
String |
getUIDfromNoteID(Database dbMail,
int noteId)
This is a convinience method that returns a UID from a NOTEID.
NOTEID->UID is a many to one mapping since one or several notes may represent a calendar entry (especially if it repeats) and its related notices. |
String |
getUIDFromUNID(Database dbMail,
String unid)
This is a convinience method that returns a UID from a UNID.
UNID->UID is a many to one mapping since one or several notes may represent a calendar entry (especially if it repeats) and its related notices. As such, the UID output will be the same for all notes that refer to the same calendar entry. This method may incur a note open, so there could be performance impact. |
int |
getUnappliedNotices(Database dbMail,
String uid,
List<Integer> retNoteIds,
List<String> retUNIDs)
Retrieve the unapplied notices that exist for a participant of calendar entry representing a meeting.
This will return things like: Reschedules, informational updates, cancelations, confirmations, etc. Notices will only be returned if the initial invitation has already been responded to, otherwise this method will return ERR_INVITE_NOT_ACCEPTED. For recurring meetings, notices that apply to any instances in the series will be returned, with the exception of instances where the initial invitation has not yet been responded to. Calendar entries that are not meetings will return ERR_INVALID_NOTE. We do not currently support getting unprocessed calendar entries if you are the owner (such as a counter proposal request or a request for updated information), so this will return ERR_NOT_YET_IMPLEMENTED. Note: For recurring meetings, it is possible that multiple notices will contain current information for a particular occurence, so it is not possible to guarantee that there is a single "most current" notice. For example, the subject might be changed for a single instance, and then the time may be changed across instances. Because only one notice will have the current subject and another notice will have the current time but NOT the current subject, both notices will be returned and both must be processed to guarantee accuracy. Process returned notices via the CalNoticeAction method. |
void |
noticeAction(Database dbMail,
int noteId,
Collection<CalendarProcess> action,
String comment,
CalendarActionData data,
Collection<CalendarActionOptions> flags)
Process a calendar notice.
This makes the appropriate modifications to the calendar entry and also sends appropriate notices out. |
void |
noticeAction(Database dbMail,
String unid,
Collection<CalendarProcess> action,
String comment,
CalendarActionData data,
Collection<CalendarActionOptions> flags)
Process a calendar notice.
This makes the appropriate modifications to the calendar entry and also sends appropriate notices out. |
Document |
openCalendarEntryDocument(Database dbMail,
String uid,
String recurId,
Collection<CalendarDocumentOpen> flags)
This is a method to get a document for an entry on the calendar.
The intent is that the note handle can be used to get information about an entry or instance or to write additional information to the entry or instance (beyond what is defined in iCalendar and/or available in this API). |
String |
readCalendarEntry(Database dbMail,
String uid,
String recurId,
Collection<CalendarRead> flags)
This will return complete iCalendar data for the specified entry.
For recurring entries, this may result in multiple VEVENTs in the returned iCalendar data. In this case, the first VEVENT represents the recurrence set and additional entries represent exceptions to the recurrence set. All instances that differ from the recurrence set will be returned as additional VEVENTs containing the exceptional data. |
String |
readNotice(Database dbMail,
int noteId,
Collection<CalendarRead> flags)
This will return iCalendar data representing a notice with the specified NOTIED.
A notice may not yet be applied to the calendar entries itself, but an application may want to read the notice (and process it). Examples of notices include invitations, reschedules, information updates, confirmations, cancelations, counterproposals, requests for information, acceptances, declines, tenative acceptances, etc. |
String |
readNotice(Database dbMail,
String unid,
Collection<CalendarRead> flags)
This will return iCalendar data representing a notice with the specified NOTIED.
A notice may not yet be applied to the calendar entries itself, but an application may want to read the notice (and process it). Examples of notices include invitations, reschedules, information updates, confirmations, cancelations, counterproposals, requests for information, acceptances, declines, tenative acceptances, etc. |
void |
readRange(Database dbMail,
TemporalAccessor start,
TemporalAccessor end,
Appendable retICal,
List<String> retUIDs)
Gets a summary of calendar entries for a range of times
|
void |
readRange(Database dbMail,
TemporalAccessor start,
TemporalAccessor end,
int skipCount,
int maxRead,
Appendable retICal,
List<String> retUIDs)
Gets a summary of calendar entries for a range of times
|
void |
readRange(Database dbMail,
TemporalAccessor start,
TemporalAccessor end,
int skipCount,
int maxRead,
Collection<CalendarReadRange> readMask,
Appendable retICal,
List<String> retUIDs)
Gets a summary of calendar entries for a range of times
|
void |
updateCalendarEntry(Database dbMail,
String iCal,
String uid,
String recurId,
String comments,
Collection<CalendarWrite> flags)
This will modify an existing calendar entry.
This supports either single entries or recurring entries, but recurring entries will only support updates for a single instance specified via RECURRENCE-ID that may not include a RANGE (This may be permitted in the future but for now will return an error). The iCalendar input may only contain a single VEVENT and must contain a UID. By default, attachments and custom data (for fields contained in $CSCopyItems) will be maintained from the existing calendar entry. |
String createCalendarEntry(Database dbMail, String iCal, Collection<CalendarWrite> flags)
CalendarWrite.DISABLE_IMPLICIT_SCHEDULING
is specified)
The following errors will be thrown by this method:
ERR_NULL_DBHANDLE
- The database handle is NULLERR_NO_CALENDAR_FOUND
- Unable to find the entry because the required view does not exist in this databaseERR_ICAL2NOTE_CONVERT
- Error interpreting iCalendar inputERR_IMPLICIT_SCHED_FAILED
- Entry was updated, but errors were encountered sending notices to meeting participantsdbMail
- The database where the entry will be created.iCal
- The iCalendar data representing the entry to createflags
- CalendarWrite
flags to control non-default behaviorvoid updateCalendarEntry(Database dbMail, String iCal, String uid, String recurId, String comments, Collection<CalendarWrite> flags)
CalendarWrite.DISABLE_IMPLICIT_SCHEDULING
is specified).ERR_NULL_DBHANDLE
- The database handle is NULLERR_NO_CALENDAR_FOUND
- Unable to find the entry because the required view does not exist in this databaseERR_ICAL2NOTE_CONVERT
- Error interpereting iCalendar inputERR_IMPLICIT_SCHED_FAILED
- Entry was updated, but errors were encountered sending notices to meeting participantsdbMail
- The database containing the entry to updateiCal
- The iCalendar data representing the updated entryuid
- If non-NULL, this value MUST match the UID value in the iCalendar input. If present,or else this returns ERR_InvalidVEventPropertyFound. If the iCalendar input has no UID this value will be used.recurId
- If non-NULL, this value MUST match the RECURRENCE-ID value in the iCalendar input if present, or else this returns ERR_InvalidVEventPropertyFound. If the iCalendar input has no RECURRENCE-ID this value will be used.comments
- If non-NULL, this text will be sent as comments on any notices sent to meeting participants as a result of this call. that will be included on the notices. Can be NULL.flags
- CalendarWrite
flags to control non-default behavior. Supported: CAL_WRITE_MODIFY_LITERAL, CalendarWrite.DISABLE_IMPLICIT_SCHEDULING
, CalendarWrite.IGNORE_VERIFY_DB
.String getUIDfromDocument(Document document)
ERR_NULL_DBHANDLE
- The database handle is NULLdocument
- the documentString getUIDfromNoteID(Database dbMail, int noteId)
ERR_NULL_DBHANDLE
- The database handle is NULLdbMail
- The database containing the note referenced by noteid.noteId
- note idString getUIDFromUNID(Database dbMail, String unid)
ERR_NULL_DBHANDLE
- The database handle is NULLdbMail
- The database containing the note referenced by unid.unid
- UNID of a calendar noteString getApptUnidFromUID(String uid)
uid
- UID of the icalendar entryDocument openCalendarEntryDocument(Database dbMail, String uid, String recurId, Collection<CalendarDocumentOpen> flags)
ERR_NULL_DBHANDLE
- The database handle is NULLERR_NO_CALENDAR_FOUND
- Unable to find the entry because the required view does not exist in this databasedbMail
- The database containing the entry to open.uid
- The UID of the entry to get a note handle for.recurId
- The RECURRENCE-ID of the instance to get a note handle for. Timezones not permitted (time values must be in UTC time). NULL for single entries. Must be present for recurring entries.flags
- CalendarDocumentOpen
flags to control non-default behavior. Supported: CalendarDocumentOpen.HANDLE_NOSPLIT
.String readCalendarEntry(Database dbMail, String uid, String recurId, Collection<CalendarRead> flags)
recurId
and only the data for that instance will be returned.dbMail
- The database from which entries are returned.uid
- The UID of the entry to be returned.recurId
- NULL for single entries or to read data for an entire recurring series. If populated, this is the RECURRENCE-ID of the specific instance to read.flags
- CalendarRead
flags to control non-default behaviorvoid readRange(Database dbMail, TemporalAccessor start, TemporalAccessor end, Appendable retICal, List<String> retUIDs) throws IOException
dbMail
- The database from which entries are returned.start
- the start time of the rangeend
- the end time of the range. An exception occurs if the end time is not greater than the start timeretICal
- if not null, we return a summary in iCalendar format of the entries from the start date to the end date, inclusive. An exception occurs if the range contains no entries.retUIDs
- if not null, we return a list of UIDs found within the rangeIOException
- if writing iCalendar data failsvoid readRange(Database dbMail, TemporalAccessor start, TemporalAccessor end, int skipCount, int maxRead, Appendable retICal, List<String> retUIDs) throws IOException
dbMail
- The database from which entries are returned.start
- the start time of the rangeend
- the end time of the range. An exception occurs if the end time is not greater than the start timeskipCount
- the number of entries to skip from the beginning of the range. This parameter can be used in conjunction with entriesprocessed to read the entries in a series of callsmaxRead
- the maximum number of entries to readretICal
- if not null, we return a summary in iCalendar format of the entries from the start date to the end date, inclusive. An exception occurs if the range contains no entries.retUIDs
- if not null, we return a list of UIDs found within the rangeIOException
- if writing iCalendar data failsvoid readRange(Database dbMail, TemporalAccessor start, TemporalAccessor end, int skipCount, int maxRead, Collection<CalendarReadRange> readMask, Appendable retICal, List<String> retUIDs) throws IOException
dbMail
- The database from which entries are returned.start
- the start time of the rangeend
- the end time of the range. An exception occurs if the end time is not greater than the start timeskipCount
- the number of entries to skip from the beginning of the range. This parameter can be used in conjunction with entriesprocessed to read the entries in a series of callsmaxRead
- the maximum number of entries to readreadMask
- flags that control what properties about the calendar entries will be returnedretICal
- if not null, we return a summary in iCalendar format of the entries from the start date to the end date, inclusive. An exception occurs if the range contains no entries.retUIDs
- if not null, we return a list of UIDs found within the rangeIOException
- if writing iCalendar data failsString getRecurrenceID(TemporalAccessor td)
TemporalAccessor
object.td
- Input time/date objectint getUnappliedNotices(Database dbMail, String uid, List<Integer> retNoteIds, List<String> retUNIDs)
dbMail
- The database to search for calendar entriesuid
- The UID of the entry to return notices for.retNoteIds
- return list of note ids or NULLretUNIDs
- return list of UNIDs or NULLint getNewInvitations(Database dbMail, TemporalAccessor start, String uid, TemporalAccessor since, AtomicReference<DominoDateTime> retUntil, List<Integer> retNoteIds, List<String> retUNIDs)
getUnappliedNotices(Database, String, List, List)
must be used (on a per-UID level).getNewInvitations(com.hcl.domino.data.Database, java.time.temporal.TemporalAccessor, java.lang.String, java.time.temporal.TemporalAccessor, java.util.concurrent.atomic.AtomicReference<com.hcl.domino.data.DominoDateTime>, java.util.List<java.lang.Integer>, java.util.List<java.lang.String>)
by using tdSince and ptdretUntil.If uid
is provided, invitations only for a
particular meeting will be returned.dbMail
- The database from which entries are returned.start
- Optional: If provided, only invitations for meetings that occur on or after this time will be returned.Passing in NULL will use the default value (one day before current time).uid
- Optional: If present only invitations with a matching UID will be returned. Note: For some repeating meetings there could be multiple invites for the same UID (for separate instances).since
- Optional: Only return invitations that have been received/modified since the provided time.Passing in NULL will return invitations regardless of when they arrived.retUntil
- Optional: If provided, this is populated with the time of this method call, which can then be used as the ptdSince argument of a subsequent call.retNoteIds
- return list of note ids or NULLretUNIDs
- return list of UNIDs or NULLString readNotice(Database dbMail, int noteId, Collection<CalendarRead> flags)
dbMail
- The database from which entries are returned.noteId
- The NOTEID of the notice to be returned.flags
- CalendarRead
flags to control non-default behavior. Supported: CalendarRead.HIDE_X_LOTUS
, CalendarRead.INCLUDE_X_LOTUS
.String readNotice(Database dbMail, String unid, Collection<CalendarRead> flags)
dbMail
- The database from which entries are returned.unid
- The UNID of the notice to be returned.flags
- CalendarRead
flags to control non-default behavior. Supported: CalendarRead.HIDE_X_LOTUS
, CalendarRead.INCLUDE_X_LOTUS
.void entryAction(Database dbMail, String uid, String recurId, Collection<CalendarProcess> action, CalendarRangeRepeat scope, String comment, CalendarActionData data, Collection<CalendarActionOptions> flags)
CalendarProcess.DELETE
,
which can be applied to any calendar entry).dbMail
- The database containing calendar entries to act onuid
- The UID of the entry to act onrecurId
- The RECURRENCE-ID of the instance to act on. May be specified for recurring meetings (omission acts on all). MUST be NULL for single meetings. Timezones not permitted (time values must be in UTC time)action
- The action to perform as defined in CalendarProcess
valuesscope
- CalendarRangeRepeat
as defined above (ignored for non-repeating entries)comment
- Comments to include on the outgoing notice(s) to organizer or participants (can be NULL).data
- Conveys any additional information required to perform action
- NULL for actions that do not require additional information to perform, required for CalendarProcess.DELEGATE
, CalendarProcess.DECLINE
and CalendarProcess.COUNTER
and CalendarProcess.UPDATEINVITEES
.flags
- Flags - Only CalendarActionOptions.UPDATE_ALL_PARTICIPANTS
is allowed (and only for CalendarProcess.UPDATEINVITEES
void noticeAction(Database dbMail, int noteId, Collection<CalendarProcess> action, String comment, CalendarActionData data, Collection<CalendarActionOptions> flags)
dbMail
- The database containing the notice to act on.noteId
- The noteid of the notice to act on.action
- The action to perform as defined in CalendarProcess
values.comment
- Comments to include on the outgoing notice(s) to organizer or participants (can be NULL).data
- Conveys any additional information required to perform action
- NULL for actions that do not require additional information to perform, required for CalendarProcess.DELEGATE
and CalendarProcess.COUNTER
flags
- Flags - (a CalendarActionOptions
value).void noticeAction(Database dbMail, String unid, Collection<CalendarProcess> action, String comment, CalendarActionData data, Collection<CalendarActionOptions> flags)
dbMail
- The database containing the notice to act on.unid
- The UNID of the notice to act onaction
- The action to perform as defined in CalendarProcess
values.comment
- Comments to include on the outgoing notice(s) to organizer or participants (can be NULL).data
- Conveys any additional information required to perform action
- NULL for actions that do not require additional information to perform, required for CalendarProcess.DELEGATE
and CalendarProcess.COUNTER
flags
- Flags - (a CalendarActionOptions
value).CalendarActionData buildActionData()
Copyright © 2019–2021 HCL. All rights reserved.


Lemon and oregano chicken traybake
- ⏲ Prep time: 30 min (in 10 minute intervals)
- 🍳 Cook time: 60 min
- 🍽 Servings: 4
Ingredients
- 8 chicken thighs (skin on)
- 500g new potato
- 100g bacon lardon
- 8 shallots
- 5 oregano sprigs / heavy sprinkle of oregano leaves
- 2 tbsp olive oil
- 2 lemons
- 200ml chicken stock
- 100ml white wine
Directions
- Heat oven to 220C/200C with fan/gas 7. While oven is heating up cut the new potatoes into 0.5cm - 1cm slices and tip them into a roasting tray. Drizzle 1tbsp of olive oil on the sliced potatoes, season well and toss to ensure a good coating. Then put the roasting tray into the oven for 20 minutes, or however long until the potatoes start to crisp.
- In a seperate, temporary, tray place the chicken thighs and season them. Cut up the shallots into 1/8 parts, then the lemons into ¼ wedges. Once this is done, take out the roasting tray and transfer the chicken, challots, lemon wedges and bacon lardons into it, with a final drizzle of 1tbsp of olive oil over the tray’s items. Cook for another 20 minutes.
- Prepare the chicken stock and wine to take out the roasting tray for the last time before serving.
Contribution
- Isaac Hill (recipe/photo credit) - website
Recipe tags:
mediterranean
chicken
traybake


--- layout: post title: "Functional design is intrinsically testable" description: "TDD with Functional Programming doesn't lead to test-induced damage. Here's why." date: 2015-05-07 6:13 UTC tags: [Unit Testing, Software Design, Functional Programming] image: "/content/binary/ideal-function-isolation-testability-stacked-venn.png" image_alt: "Stacked Venn diagram that show that an ideal function is a subset of isolated functions, which is again a subset of testable functions." --- {% include JB/setup %}
{{ page.description }}
Over the years, there's been much criticism of Test-Driven Development (TDD). Perhaps David Heinemeier Hansson best condensed this criticism by claiming that TDD leads to test-induced design damage. This isn't a criticism you can just brush away; it hits a sore point.
Personally, I don't believe that TDD has to lead to test-induced damage (not even in Object-Oriented Programming), but I'm the first to admit that it's not a design methodology.
In this article, though, you're going to learn about the fundamental reason that TDD with Functional Programming doesn't lead to test-induced damage.
In Functional Programming, the ideal function is a Pure function. A Pure function is a function that always returns the same value given the same input, and has no side-effects.
The first characteristic of a Pure function means that an ideal function can't depend on any implicit knowledge about the external world. Only the input into the function can influence the evaluation of the function.
This is what Jessica Kerr calls Isolation. A function has the property of Isolation when the only information it has about the external word is passed into it via arguments.
You can think about Isolation as the dual of Encapsulation.
In Object-Oriented Programming, Encapsulation is a very important concept. It means that while an object contains state, the external world doesn't know about that state, unless the object explicitly makes it available.
In Functional Programming, a function is Isolated when it knows nothing about the state of the external world, unless it's explicitly made available to it.
A Pure function, the ideal of Functional Programming, is Isolated.
Why is this interesting?
It's interesting if you start to think about what unit testing means. There are tons of conflicting definitions of what exactly constitutes a unit test, but most experts seem to be able to agree on this broad definition:
A unit test is an automated test that tests a unit in isolation from its dependencies.Notice the use of the word Isolation in that definition. In order to unit test, you'll have to be able to isolate the unit from its dependencies. This is the requirement that tends to lead to Test-Induced Damage in Object-Oriented Programming. While there's nothing about Encapsulation that explicitly states that it's forbidden to isolate an object from its dependencies, it offers no help on the matter either. Programmers are on their own, because this concern isn't ingrained into Object-Oriented Programming.
You can do TDD with Object-Oriented Programming, and as long as you stay within the intersection of Encapsulation and Isolation, you may be able to stay clear of test-induced damage. However, that zone of testability isn't particularly big, so it's easy to stray. You have to be very careful and know what you're doing. Not surprisingly, many books and articles have been written about TDD, including quite a few on this blog.
In Functional Programming, on the other hand, Isolation is the ideal. An ideal function is already isolated from its dependencies, so no more design work is required to make it testable.
Ideal Functional design is not only ideal, but also perfectly testable, so there's no conflict. This is the underlying reason that TDD doesn't lead to test-induced damage with Functional Programming.
Isolation is an important quality of Functional Programming. An ideal function is Isolated, and that means that it's intrinsically testable. You don't have to tweak any design principles in order to make a function testable - in fact, if a function isn't testable, it's a sign that it's poorly designed. Thus, TDD doesn't lead to Test-Induced Damage in Functional Programming.
If you want to learn more about this, as well as see lots of code examples, you can watch my Test-Driven Development with F# Pluralsight course.
Comments
What do you mean by "value"? Can an exception instance be a value? More specifically, would you say that the C# function
int Foo() => new Exception();
is pure?Many of your posts mention pure funcitons and at least a few of them include your own definition. I decided to comment on this post since it was the oldest post I found that included your own definition of a pure function.
Tyson, thank you for writing. I don't think that
int Foo() => new Exception();
compiles...Apart from that, how do you find that this is my own definition of a pure function? It seems to me to be a standard and non-controversial definition. I even link to the Wikipedia definition in the beginning of the article.
I am not trying claim that any particular definition of a pure function is non-standard or is controversial. I also don't mean that the text I quoted is "your definition" in the sense that it semantically differs from the one on Wikipedia. I just mean that it is "your definition" in the sense that you have syntactically included in your post the text that I quoted.
However, I am unsure about the precise meaning the defintion for a pure function that you have syntactically included in your post and that I quoted. To help me improve my understanding of that defintion, I tried to ask you if a particular C# function is pure.
Ah, yes. Thanks for alerting me to my mistake. I meant to include the
throws
keyword as well. For clarity, I now repeat that whole paragraph but with the prose "thrown" and the keywordthrows
added.What do you mean by "value"? Can a thrown exception instance be a value? More specifically, would you say that the C# function
int Foo() => throws new Exception();
is pure?Tyson, your code still doesn't compile, but I think I understand the question 😜
Yes,
int Foo() => throw new Exception();
is still a pure function, but it isn't total. Rather, it's a partial function. This is an independent quality of functions.Purity relates to determinism and the lack of side effects. A total function, on the other hand, is a function that returns a proper value for every possible value in its domain. What do I mean by proper?
There's two ways in which a function can fail to return a value. One is if the function never returns. Due to the halting problem there's no general-purpose way to determine whether or not this is the case for a Turing-complete language.
Another way a function can fail to return a value is if it throws an exception. Most languages (even Haskell!) allows exception-throwing. This isn't considered a 'proper' value because, using the type system, you declared that
Foo
returns anint
. It doesn't. It 'returns' an exception.Both non-termination and exceptions are typically considered a special value termed bottom, often written with the symbol
⊥
.Functions can be pure, but partial. Your
Foo
function is an example of that. The holy grail in statically typed functional programming is pure and total functions. It's up to the programmer to provide the totality guarantee, though, since the type system can't enforce termination (due to the halting problem). You can, on the other hand, easily program without exceptions once you get the hang of it.Thanks for seeing pass my second compile error and understanding my question.
Ah, yes. I definitely know about partial and total functions from my experience with mathematics, and I am pretty sure I have previously called a function that throws an exception partial, but I completely forgot about this connection. (I think that is because I have so focused on purity.) Thank you for bringing this concept (back) to my attention.
I was asking about pure functions and exception throwing because I was thinking about the definition for a pure function given by Enrico Buonanno in Functional Programming in C#. He considers throwing an exception a side effect and includes this paragraph about this decision.
What do you think about Enrico's choice to define exception throwing as a side effect?
It might be worth considering
async void Foo() => throw new Exception();
because it produces an unhandled exception, which crashes the executing process.I haven't seen anyone take that position before, so I can only evaluate it based on what you wrote. With that limited context, however, I don't find the argument convincing. First, that throwing exceptions will cause indeterminism to appear in code that handles exceptions says nothing about the function that throws the exception. It says something about the code that handles the exception.
Making decisions based on data is itself not non-deterministic. If it was,
if/else
blocks or pattern matching couldn't be pure. If the exception handler does something impure while handling an exception, then it's just an impure action. The functional interaction law explicitly allows this.Keep in mind that the definition of purity that we're discussing is really only a checklist to figure out whether a function is referentially transparent. That's the core definition: Can you replace a function call with its result?
Yes, if the function is pure. This includes a function that throws an exception. It basically just returns
⊥
. If you have code that handles the exception, it'll do that based on the exception that was thrown. It doesn't really matter if the function 'actually executed' or not. We can replace the function call with the bottom value.If you don't handle the exception, then yes: the program crashes. It'll do so, however, regardless of whether you 'run' the function, or you just replace it with a thrown exception.
Yes, this helps. I agree with you. Thanks for your explanation.
The respective problems of deciding if a given function is total or pure are equally difficult; both are undecidable by Rice's theorem. A compiler for Haskell is not a general-purpose algorithm for deciding the purity of a function. It follows from the syntax of Haskell that all functions in Haskell with a return type different from the IO monad are pure (and technically all the others as well). Rice's theorem doesn't apply when the property being checked is syntactic.
In the same way, it is possible to design a programming language with two contexts: one in which partial functions can be defined and another in which only total functions can be defined. As before, the partial function context could be expressed by the syntactic requirement that the return type is some monad.
I'm not familiar with Rice's theorem, so I'll have to take your word on that. Haskell, however, seems to be doing a fairly good job of distinguishing between pure and impure, but this could be because the impure actions ultimately aren't implemented in Haskell (IIRC, they're written in C or C++). This might be analogous to the following escape hatch for partiality versus totality.
You can't define a Turing-complete language where you generally distinguish between total and partial functions. That's what Turing, Gödel, and Church proved in the 1930's. The escape hatch is that if you define a language that's not Turing-complete, you can distinguish between total and partial functions. If I remember correctly, that's the underlying design philosophy of Idris. I believe that Edwin Brady once called the concept Pac-Man-complete; while not Turing-complete, he was aiming for a language powerful enough that you could still implement Pac Man in it. I do believe that Idris also comes with an option where you can escape into the wider, Turing-complete part of the language by giving up on the compiler checking of totality versus partiality.
Ah, great. Your comment motivated me to read more about Idris, and I have learned some things.
First, Idris includes a totality checker for functions. By default, a function is not checked for totality. Putting the keyword
total
above a function defintion enables the checker. Here are some examples of this. The code then compiles if and only if the checker (which is essentially a theorem prover) is able to prove that the function is total. So the two contexts are distinguished by the presence or absence of the keywordtotal
. This is a completely different approach to creating the two contexts than what I was vaguely suggesting.Second, Idris is Turing-complete as confirmed by Edwin Brady himself. Furthermore, both Edwin and this page about coinductive that he cites say (paraphrased into my words) that one could also separate the partial and total contexts using a monad. Though the linked page goes onto say that "this is a heavyweight solution, and so we would like to avoid it whenever possible."
I am really glad to have learned those things. Thanks for the great conversation :)
Would you say that
int Foo() { if (new Random().Next() % 2 == 0) throw new Exception(); else throw new NotImplementedException(); }
is pure?No, that variation of
Foo
is impure because of the non-deterministic behaviour. You can't replace a call toFoo
with a corresponding bottom value.Idris is very interesting. Have you seen attempts to test totality in other languages?
Spencer, thank you for writing. Usually, the names Agda and Coq are thrown around when Idris is mentioned. As far as I understand things, however, both Agda and Coq are mostly intended to be additional tools that you use together with another language, whereas the vision for Idris is to be a complete programming language. I could be wrong, though. It's a rabbit hole that I've yet to explore.
Another language worth mentioning might be F*, but again, I know little about it, and have never written a line of code in it.
Thank you for the leads! These languages are very interesting. I'd never heard of "proof-oriented programming" or depdendant types before. It's going to a take a while to unpack these new approaches.
I notice all these languages take a proof-based approach to verifying totality. I'm curious about your take on a possible experimental approach.
I've been trying to meld ideas from Clojure.spec into a type-driven approach in F#, in line with Scott Wlaschin's Designing with Types and your Types + Properties = Software. Clojure Spec, in case you're unfamiliar, is the Specification pattern as an optional type system. Types are built up through combinations of constraints (e.g. InventoryCount must be an int of at least 0 and no more than 10000). Spec can then automatically test type-annotated functions to verify that any input that fits constraints produces output that fits constraints. It's basically property testing with generators automatically created from the in-code type specifications.
I think this kind of testing is effectively a measure of totality; a measure of how well a function's actual domain matches its advertized domain. Clojure does not make that claim, and I haven't found a similar approach from another language or framework yet.
While less thorough than proofs, such a technique could be applied to most any system with static typing through meta-programming and conventions to find type constraints (i.e. via factory functions). The proportion of inputs that error or timeout could be a consistent measure for migrating systems to more total, and less surprising, functions.
Thoughts?
Spencer, thank you for writing. While I know that Clojure.spec exists, I don't know more about it than what you've described. It's not quite the same, but it sounds not too dissimilar from QuickCheck
Arbitrary
instances. They don't describe predicates, but they do implement (pseudo-random) generators of values. Those generators then drive data generation for property-based tests.Parametrised tests (including properties) are essentially predicates. They take input and return a binary result. Granted, the result isn't true or false, but rather pass or fail, but I hope it's evident that these are isomorphic.
How does that relate to testing totality? It's better than nothing, but in practice we must suffer the reality of combinatorics. You can easily use brute force to prove total a function that takes a single Boolean value as input. A byte input requires 256 test cases, so that's also within the realm of the possible. Many input types, however, represent conceptually infinite sets. A string, for example, represents a conceptually infinite set.
Imagine an adversarial function that loops forever if the input string is a very particular value. This value might be a one-million-character string generated randomly at compile time. The odds that any random test case generator ever hits that particular value are effectively nil.
While I like property-based testing a lot, I don't consider it a measure of totality. If the domain of a function is infinite, it makes little difference if you exercise a hundred or a million test cases - you've still covered practically zero percent of the domain.
You make an excellent point. If I understand correctly, many domains are effectively infinite so coverage of random testing is effectively negligable.
My connection to totality came from trying to understand what Clojure spec's instrument function is really testing. It's a property, but the property only knows the shape of the domain and range. It knows nothing about relationships between specific input and output values. Therefore, it doesn't verify business domain correctness. Rather, it's checking that the range holds true for a sampling of valid input values.
In light of your insight, it may be more fair to say this is a coverage "surprise" check. It can run common edge cases and input scenarios to make sure they return values from the advertized range rather than exceptions (or fail to terminate). As you discerned, it cannot generally detect adversarial implementations that would violate totality.
Thank you for taking the time to consider this idea and share your expertise!
Spencer, thank you for writing. If I understand your description of Clojure.spec correctly, this makes sense in a dynamically typed language like Clojure. It's seems reminiscent of fuzz testing in the sense that you throw arbitrary input at a System Under Test and then monitor what happens. This makes sense in a system where input is mostly (or exclusively) checked at run time.
In a language like Haskell, on the other hand, that kind of testing is generally impossible. You can't just throw random, unconstrained input at a Haskell function, because if the input doesn't type-check, the code will not even compile. Languages like C# and Java seem to fall more on that side than on the Clojure side, even though their types systems involve more ceremony.
To be clear: You could imagine something akin to a 'totality check' even in Haskell. After all, we know from the papers of Church, Gödel, and Turing that no type system can prove arbitrary Turing-complete code total (i.e. the halting problem). Even with the best-designed Haskell API, one might conceivably want to write a QuickCheck property that throws random (typed) input at a function only to assert that it returns a value. In essence, this would be an assertion-free test. The implicit assertion is that if the function returns without exceptions or timing out, then it may be total.
While one could do that, once you've gone through the trouble of writing such a property, you can often think of some sort of explicit assertion to write. If so, why not do that? But if you do, you've now ventured into the territory of genuine property-based testing. There's nothing wrong with that - quite the contrary - but I think it explains why you tend to not see the above kind of totality checking in statically typed languages.
Another point to consider is this: With a decent static type system (and I count C# in that category), you can often design APIs so that the types take care of most concerns regarding totality. It helps to realise that in most languages, functions can be partial in two ways:
You can usually eliminate the first kind of partiality by carefully choosing input and output types. Thus, in a statically typed language, you're often left with the question: Will this function always terminate?
While the halting problem says that there's no general algorithm that will answer that question, it's often obvious for specific functions. For instance, if a function has no recursion or looping, it obviously will terminate. This, to be clear, involves 'white-box' analysis. You have to look at the code and convince yourself that the function will terminate.
I've possibly strayed off your original agenda, but I found your comments and responses inspiring. I hope you or someone else find these notes useful.
I'm glad you've found this line of thought interesting! I've definitely enjoyed and benefitted from our discourse.
I agree this kind of testing bears a strong resemblance to fuzzing and that static types eliminate the majority of invalid inputs up front.
I'm going to dig deeper into my journey to see if it can explain why I think these tests are valuable.
It may not be clear, but the best thing about Clojure Spec's fuzz-like tests is that they don't have to be written at all. All type information is present in the type annotation, including primitive constraints like bounded integers. An introspective function can generically infer generators and assertions from type annotations to create the tests. All annotated functions get these fuzz tests for free.
In static languages, we get the structural component of these tests for free from the compiler. However, we're still missing out on verifying constrained values.
Approaches to combat primitive obsession go a long way toward eliminating such errors and defensive programming from our domains by centralizing validation and coupling it to a type.
Scott Wlaschin demonstrates constrained types using unions
More traditionally, it'd be a constructor
These approaches implement constrained types as a pattern rather than a language construct. A programmer could undermine them by forgetting to keep constructors private, adding new constructors, assigning via reflection, etc.
I spent a while trying to figure out how to add constrained values to F#'s types system and understand what it could do for us. It ultimately failed, but you can check out my attempts and my reasoning in the github repo. This was prior to me learning about dependent type systems, which are the more mature realization of my line of thought.
I later realized that the constraints don't need to be part of the type to be useful. The constraints are represented in the code as factories or constructors. The code itself will enforce the expectations at runtime. At test time it's ok to rely on slow introspective approaches to identify constraints. In that way, we too have all the information we need to mechanically property test a system just like clojure spec does. In fact, we can test every function in the system, intentionally constrained or not, because static languages require typing.
What do these tests do? Like with spec, we can derive some confidence that our system handles the values it says it does. Though not total certainty, which requires a white-box approach as you mentioned.
If a system is migrating from heavy use of exceptions for defensive programming, or from general lack of defensive programming, then this kind of test can track progress away from exceptions.
It can also help consistency of our constrained types. For example, we can always select the most weakly constrained factory or constructor. This prevents accidental public constructors (which, admittedly, could also be accomplished with an annotation and a simple analyzer). We can also pressure towards conventions like naming the factory a certain way, or only using results over exceptions for communicating errors from factories.
As a side benefit, we can also leverage the introspected generators to write our own properties. This reduces duplicated knowledge of constraints between the system and tests, keeping them in line automatically.
Thanks for reading this far. This is all pretty conceptual at this point. I hope it's fun food for thought.
A bit more rumination and I realized my thoughts above can be summarized in a few key points
- Clojure Spec tests I refer to aren't written, they're programmatically inferred from code
- Static languages encode all the information needed to programmatically generate and assert constrained value types like Clojure Spec, it's just that part of information lives in functions rather than types.
- Constrained values are effectively a design pattern in most static languages.
The language can't guarantee a consistent approach or consistent application, so there's value in adding natural pressures to be consistent.
It's kind of like how you once explained the value of DI containers
-
These tests can smoke out defensive programming issues and misadvertized function signatures.
This is only generalizable if we can differentiate expectable failures from unintended issues, thus why these tests mostly measure movement away from exceptions.
Please let me know if you'd like anything clarified. These are far from fully formed ideas.Spencer, thank you for writing. I already got the sense that the Clojure.spec tests weren't written, but thank you for confirming that. I don't know the implementation details of how that works, but I may have an inkling.
Clojure is, as I'm sure that you're aware, homoiconic. Thus, I suppose that the specs are written in Clojure as well. A function or macro can extract the details of each spec and generate test data that are likely to fit.
Consider, as a though experiement, a type like this:
If this was, instead, Clojure, then from perusing the Clojure.spec documentation it looks as though you'd use a predefined specification called
int-in
, but even if you'd be using normal less-than and greater-than operators, I suppose it wouldn't be beyond the abilities of a sophisticated function to tease apart such a predicate and compose a useful generator.In languages like C#, F#, Java, or Haskell, however, predicates and types are typically black boxes. For the
Narrows
class, you have a static factory method. This factory method is total, but if you throw random 64-bit integers at it, the chance of ever getting a populated Maybe value is vanishingly small.If you now have a function that takes that type as input, you can't really exercise it because of the statistics involved. This is why most property-based testing frameworks that I've seen (QuickCheck, Hedgehog, FsCheck, CsCheck) are based on a generator API (usually called either
Arbitrary
orGen
).While you can compose a type-specific generator from other generators, you have to explicitly do that work. The testing framework can't infer the set of valid values to use.
I'm not disagreeing with what you wrote. I'm only trying to outline how I see such efforts interact with the capabilities of various languages.
If I interpret this correctly, you're saying languages like C# and similar would have to throw random values at the Narrows TryCreate function to find instances. However, Clojure could use its macro system to understand the functions symbolically and semantically.
I think that languages like C# and F# can also semantically analyze code, but it has to be done through the compiler platforms (i.e. Roslyn, FSharp Compiler Services) or similar meta-programming. These are performance heavy, not every language has one, and only work when we have access to code, but they do make semantic analysis possible for functions.
We could use the compiler platform to parse constraints from factories. For example, analyze Narrows.TryCreate to find comparison operators, and that those comparisons lead to a "None" value. The other conditional branch is "Some", thus Narrows requres a long greater than 2_993_329_992 and less than 3_001_322_003. Then we use the inferred constraints to create typical property test generators and arbitraries.
However, I think your musing from a few posts back are now clicking better. You mused that static languages can effectively eliminate exception-based partiality through careful choice of types. I see two main categories of exceptions
This is really interesting. Thank you for pushing my thinking.
Spencer, thank you for writing. I didn't meant to imply that we should make a general-purpose code analyser - this seems to me to move perilously close to the halting problem; that is, I don't think you this is generally possible. (I could be wrong, though, I haven't thought deeply about this.)
What I meant was more that since Clojure.spec is written in Clojure, and Clojure code is also data, it's fairly easy to search a spec for easy-to-detect predicates. Something like a specification is fair game for analysis exactly because of the role it plays. I wouldn't contemplate analysing the function body of a Clojure function like that.
In .NET a typical approach to these kinds of problems is to use attributes. There's been quite a few attempts at that over the years - I've previously engaged with that kind of design, but in summary, I'm not a fan. It does, however, provide some metadata that's fair game for analysis.
The distinction, then, seems more related to the nature of the languages. With a language like C#, if you need metadata, it seems as though you need to invent a language feature for that purpose: attributes. In Clojure, on the other hand, because it's homoiconic, you don't need a separate language feature for metadata. You just write the metadata in Clojure. This doesn't, however, change the role of the spec. Even though you're writing it in Clojure, it plays the role of metadata. One of the implications of that is that it's fair game for an analyser, whereas I think a Clojure function body is still off limits for the Spec engine.
Ah, I misunderstood. I hadn't thought about the relationship between metadata and analyzers. Clojure certainly has the edge for elegant and powerful metadata.
I suppose I feel hope for analyzing function bodies for constraints in this context because type factories tend to contain predicates similar to what we'd use in a spec. Unlike Clojure, this relies on some unenforced expectations on the code and wouldn't always come up with an answer.
Even with that hope, the value proposition seems shaky considering our previous comments.
Ruminating on our discussion, I decided it was worth creating an experimental constraints-as-data library, FsSpec, that leans into the advantages of a static type system.
It doesn't attempt to prove totality or be part of the type system, like is possible in Idris or F*. It normalizes the common activity of constraining primitive values and exposes those constraints as data that can be programmatically accessed.
It'll take use and feedback to determine if this approach really saves complexity, but it was very fun to write. The most fun part was realizing how boolean trees can be normalized to reliably interpret them for data generation.
I'd love to hear your thoughts if it interests you.
Spencer, thank you for writing. FsSpec looks interesting. It strikes me as one of those things where I'd need to try it out on a real code base before I could pass an informed verdict.
Very early in the discussion, Tyson Williams asked about Exceptions and purity. In one answer you talked about exceptions being a kind of bottom value. Does that mean that there are multiple values of type Bottom that can potentially be equatable? That doesn't feel right to me...
Daniel, thank you for writing. At this point, I'm basing my incomplete knowledge on all sorts of different sources, not all of which I can readily remember or identify. The Haskell wiki article on bottom, however, also discusses two kinds of bottom. That may have been where I've picked it up.
In general, bottom values originating from invalid input are avoidable in statically typed languages. Instead of throwing exceptions, it's possible to return a Maybe or Either value. In practice, we don't always do that. Division (which is not defined by zero) may be the most infamous example.
Infinite loops, on the other hand, can't be type-checked away, as already discussed here.


{% extends "makeaface/base.html" %} {% load abs %} {% load typepad_filters %} {% block htmlhead %} {% endblock %} {% block content %}
and so’s your face
in your favorite place
by ♥ing faces you like
by @markpasc & friends
made with
Older →
See grid view


Idol boy group brand value rankings for November revealed
by beansssThe Korea Institute of Corporate Reputation has returned with brand value rankings for idol boy groups in the month of November.
According to big data analyzed between October 7 through November 8, 2019, the top boy group in terms of brand value this month was once again, BTS. The group earned a total of 19,549,515 points, a significant leap from last month's analysis at 13,209,186 points.
EXO came in second place once again this month with a total of 4,322,578 points, followed by NU'EST in third place with 2,947,613 points total.
From 4th through 10th place are, in order: Super Junior, Big Bang, WINNER, SHINee, Seventeen, AB6IX, and NCT.


Re-skin creatures or replace other repeating text in room descriptions and notes - there is no Undo so be careful.
Replace with in Notes and all Location Descriptions.Export dumps the data for the current dungeon into the field below. Copy and paste into an email or a file to move to another computer. Paste into the field there and click Import to load it. Careful editing in this field is possible. Save with a name on the destination computer.
To manually save and use the dungeon outside this page, copy the text of the room contents table and notes field and paste into another file, and use the Download Image button on Chrome or the right click menu to save the image as a PNG.
If you need to clear all cached data in your browser for some reason, please export if you'll want to use a dungeon in DunGen again or manually save of any dungeons you care about first. DunGen saves to your browser's "LocalStorage" not to a server. Clearing all LocalStorage will wipe out any saved and edited dungeons.
Comments welcome at the Ruminations blog linked above or on Twitter. If you like hacking, take a look at the dungen_stock.js file first. It's pretty easy to customize content there. DunGen is now up on Github.


WATCH: Harry Styles Throws Shade At Zayn Malik While Hosting SNL
by Tara WalshHarry Styles throws shade
Singer Harry Styles throws shade at his former band mate Zayn Malik while hosting Saturday Night Live over the weekend.
During his opening monologue, he makes reference to his time in One Direction.
Harry brands the boys his 'brothers' but fails to recognise Zayn in any way.
The artist opens up the show by comparing his experience on the show to his past relationships.

He proceeds to play the piano, "Nothing says serious musician like talking while playing piano."
The crowd cheers when Harry mentions One Direction, "I love those guys, they're my brothers."
He names each band member but there's one name missing, "Niall, Liam, Louis... Uh.. Ringo!"
"Yeah, that's it."
Ringo Starr left The Beatles in 1968, kind of like how Zayn left One Direction in 2016.
Harry goes on, "I'm not in a boy band anymore. I'm in a man band."
"I'm so grateful Simon Cowell grew us in those test tubes."
It seems Zayn's exit caused a lot of tension in the band.


Select time range and company
Company
Company's Stats
{{ companyData?.companyName }}
Open Price {{ ohlcData?.open }}
Close Price {{ ohlcData?.close }}
Lowest Price {{ ohlcData?.low }}
Highest Price {{ohlcData?.high}}
Volume {{ohlcData?.volume}}
Note: This data is for date:- {{ohlcData?.date}}
52w high {{ companyData?.week52high }}
52w low {{ companyData?.week52low }}
Market Cap {{ companyData?.marketcap }}
P/E Ratio {{companyData?.peRatio}}


gravitar - Better Battlelog Forums #159652
Sitemap
10. July 2017 06:33
Topicstarter
aberbear317
hi is there anyway i can use my gravitar as my platoon emblem in battlefield 1
14. July 2017 15:36
BrainFooLong
Administrator
No. It's impossible. You have to recreate it with the emblem editor.


Before Change
result = []
nb_images = len(keypoints_on_images)
seeds = ia.copy_random_state(random_state).randint(0, 10**6, (nb_images+1,))
seed = seeds[-1]
nb_rows_samples = self.nb_rows.draw_samples((nb_images,), random_state=ia.new_random_state(seed + 1))
nb_cols_samples = self.nb_cols.draw_samples((nb_images,), random_state=ia.new_random_state(seed + 2))
for i in sm.xrange(nb_images):
rs_image = ia.new_random_state(seeds[i])
kpsoi = keypoints_on_images[i]
h, w = kpsoi.shape[0:2]
transformer = self._get_transformer(h, w, nb_rows_samples[i], nb_cols_samples[i], rs_image)
After Change
result = []
nb_images = len(keypoints_on_images)
rss = ia.derive_random_states(random_state, nb_images+2)
nb_rows_samples = self.nb_rows.draw_samples((nb_images,), random_state=rss[-2])
nb_cols_samples = self.nb_cols.draw_samples((nb_images,), random_state=rss[-1])
for i in sm.xrange(nb_images):
rs_image = rss[i]
kpsoi = keypoints_on_images[i]
h, w = kpsoi.shape[0:2]
transformer = self._get_transformer(h, w, nb_rows_samples[i], nb_cols_samples[i], rs_image)


Contact us
Get in touch and let us know how we can help. Fill out the form and we’ll be in touch as soon as possible.
Let's do business
Step into our place
123 Street St, Your City,YC Country
Contact Sales
Looking for a custom quote? need to tell us more about your project? or want a demonstration? drop us a line to<EMAIL_ADDRESS>Technical Support
Any question about how to integrate your product?.


A Multiscale Computational Study of DNA Origami Nanostructures
From Quantum Mechanical Force Fields to Finer Molecular Dynamics Conformer Generator
by Yichun Zheng
Drawbacks in Molecular dynamics simulations (MD)
The most widely used force fields are not polarizable
Cutoffs and higher order relationships are not handled in a consistent fashion
A water model must be selected from an array of possibilities with different bulk properties: TIP3P, TIP4P...
Drawbacks in Molecular dynamics simulations (MD)
Parameter optimization for force fields based on quantum mechanical (QM) studies is semi-empirical
The final parameters may not be a good choice for a specific protein or a different chemical environment.
Research Findings
by Sumowski et al[1]
Empirical programs were accurate for predicting ensemble averages
Insensitive to local structural variations due to the empirical information derived from statistical structural coordinates
1. C.V. Sumowski, M. Hanni, S. Schweizer, C. Ochsenfeld, Sensitivity of ab-initio
vs. empirical methods in computing structural effects on NMR chemical shifts
for the example of peptides, J. Chem. Theory Comput. 10 (2014) 122–133.
Shortcomings in oxDNA
Predefined structural parameters for hydrogen bonds
Implicit solvent in a specific range
Experimental Data & Simualtion Results
Simulation methodologies must be validated by comparing properties calculated from simulation trajectories with experimental values.
a function of the atoms in each frame and their associated coordinates
the time dependencies or ensemble statistical distributions of these atomic positions.
Optimization of FF & the algorithm at Quantum Mechanical Scale
To identify which force fields most accurately reproduce experimentally determined structures
Finding conformations that are close to the bound conformation from the PDB by extracting 4000 small molecule structures from the PDB
Computing speed
Conformer Generator
Properties for this purpose, ranging from sim- ple RMSD structural comparisons to complex thermodynamic variables.
Computational tools used for structure determination including force fields and quantum chemical methods to yield multiple valid structures
OMEGA
Marvin
Background
Systematic approach: Changing torsion angles of all rotatable bonds by a small amount.
But for large molecules this is infeasible (generates too many states)
Stochastic approach:Use of random algorithms such as distance geometry, Monte Carlo simulation and genetic algorithms to permute torsion angles. Usually time-consuming
The differences between the average value of RMSD obtained from simulation results & the experimental data stored in CSD
Conclusion: RDKit, combining its Distance Geometry (DG) algorithm with energy minimization using the MMFF94 force field proved to be a valid quantum mechanical basis for an novel accurate multiscale FF.
>This project provides an ab initio template-based approach for directly calculating chemical shifts from molecular dynamics simulations.
Comparing simulations to experimental data and as indicator values for the local chemical environment of backbone atoms.
The calculated shifts are in no way empirically fit and are meant to represent the actual chemical environment induced in the simulation.
Video Backgrounds
<section data-background-video="video.mp4,video.webm">


Our Lady of the Railings
Left to right: railings, peonies, and Our Lady of the Railings, Peonies & Creosote. See below.


Project role: Project Lead
Fun fact: A music-aholic and has met many famous rock bands.
Project role: Web UI Developer
Fun fact: Never been outside of the U.S.
Project role: Front-end React I
Fun fact: Practices the art of Wrestling and Jiu Jitsu.
Project role: Front-end React II
Fun fact: Philadelphia Eagles fan.
Project role: Back-end Node
Fun fact: Enjoys cooking.
Project role: Back-end Node
Fun fact: From Medellin, Colombia


ngBindHtml
ng
Creates a binding that will innerHTML the result of evaluating the expression
into the current
element in a secure way. By default, the innerHTML-ed content will be sanitized using the $sanitize service. To utilize this functionality, ensure that $sanitize
is available, for example, by including ngSanitize in your module's dependencies (not in
core Angular.) You may also bypass sanitization for values you know are safe. To do so, bind to
an explicitly trusted value via $sce.trustAsHtml
. See the example
under Strict Contextual Escaping (SCE)
.
Note: If a $sanitize
service is unavailable and the bound value isn't explicitly trusted, you
will have an exception (instead of an exploit.)
<ANY ng-bind-html="{expression}"> ... </ANY>
| Param | Type | Details |
|---|---|---|
| ngBindHtml | expression | Expression to evaluate. |
Try it here: enter text in text box and watch the greeting change.


The Flower Junction
Floral Holiday Calendar
Although a special occasion isn't necessary to send flowers to those you love, use the Floral Holiday Calendar listed below as a reminder of the major floral holidays and special occasions for sending flowers to your family and friends.
- Sat Jan 14, 2017 Makarsankranti / Pongal
- Wed Feb 01, 2017 Vasant Panchami
- Tue Feb 14, 2017 Valentines Day
- Fri Feb 24, 2017 Maha Shivaratri
- Sun Mar 12, 2017 Holika Dahan
- Mon Mar 13, 2017 Holi
- Tue Mar 28, 2017 Hindi New Year
- Tue Mar 28, 2017 Ugadi / Gudi Padwa / Telugu New Year
- Wed Apr 05, 2017 Ramanavami
- Tue Apr 11, 2017 Hanuman Jayanti
- Fri Apr 14, 2017 Tamil New Year
- Fri Apr 14, 2017 Vaisakhi / Baisakhi / Vishu
- Sat Apr 15, 2017 Bengali New Year / Bihu
- Fri Apr 28, 2017 Akshaya Tritiya
- Thu May 25, 2017 Savitri Pooja
- Sun Jun 25, 2017 Puri Rath Yatra
- Sun Jul 09, 2017 Guru Purnima
- Thu Jul 27, 2017 Nag Panchami
- Fri Aug 04, 2017 Varalakshmi Vrat
- Mon Aug 07, 2017 Raksha Bandhan
- Mon Aug 14, 2017 Krishna Janmashtami
- Fri Aug 25, 2017 Ganesh Chaturthi
- Mon Sep 04, 2017 Onam
- Sun Sep 17, 2017 Vishwakarma Puja
- Tue Sep 19, 2017 Mahalaya Amavasya
- Thu Sep 21, 2017 Navaratri begins
- Fri Sep 29, 2017 Navaratri ends / Maha Navami
- Sat Sep 30, 2017 Dusshera
- Thu Oct 05, 2017 Sharad Purnima
- Sun Oct 08, 2017 Karwa Chauth
- Tue Oct 17, 2017 Dhan Teras
- Thu Oct 19, 2017 Diwali
- Sat Oct 21, 2017 Bhai Dooj
- Thu Oct 26, 2017 Chhath Puja
- Sat Nov 04, 2017 Kartik Poornima
- Thu Nov 30, 2017 Geeta Jayanti
- Sat Dec 16, 2017 Dhanu Sankranti
- Mon Dec 25, 2017 Merry Christmas


Additionally to the shown users here, also alastair-admins and oms-core superadmins have permissions to access this