| Apache Struts 2 Documentation > Home > FAQs > How do we repopulate controls when validation fails |
When validation fails, we typically forward back to the same server page, so that the errors can be presented, and so that the client can fix the problem and resubmit the form. Of course, aside from the errors, we may also need to present rich controls, like drop down lists.
If we try to populate rich controls in an Action method, like input or execute, and validation fails, the method will not be invoked, and the controls are not populated. Two alternative ways to populate controls are the Preparable interface and the action tag.
Instead of populating controls in an Action method, implement the Preparable interface, and use a prepare method instead. The prepare method is called before validation, so it validation fails, we still have a chance to populate controls (or whatever).
<%@ taglib prefix="s" uri="/struts-tags" %> <s:form> <s:select tooltip="Choose Your Favorite Language" label="Favorite Language" list="languages" name="language" listKey="key" listValue="description" emptyOption="true" headerKey="None" headerValue="None"/> <s:submit> </form>
public String prepare() { languages.add(new Language("EnglishKey", "English Language")); languages.add(new Language("FrenchKey", "French Language")); languages.add(new Language("SpanishKey", "Spanish Language")); return SUCCESS; } List languages = new ArrayList(); public List getLanguages() { return languages; } String language; public void setLanguage(String value) { language = value; } public String getLanguage() { return language; } public static class Language { public Language(String key, String description) { this.key = key; this.description = description; } String key; public String getKey() { return key; } String description; public String getDescription() { return description; } } }
If a custom stack is being used, be sure to put the Prepare Interceptor before the Validation Interceptor.
Another solution is to use the action tag to execute an Action in place.
One way to use this tag is to put a control on a "snippet" JSP that is rendered as a result of an Action that does nothing but create the object that populates the control. The action tag sets "executeresult=true", then control markup will be "included" into the page (like a tile), after the action executes.
In effect, exectuteResult actions can be used like a tag that can run its own action before emitting the markup.
<%@ taglib prefix="s" uri="/struts-tags" %> <s:form> <s:action name="Languages" executeResult="true"/> <s:submit/> </s::form>
<%@ taglib prefix="s" uri="/struts-tags" %> <s:select tooltip="Choose Your Favorite Language" label="Favorite Language" list="languages" name=language" listKey="key" listValue="description" emptyOption="true" headerKey="None" headerValue="None"/>
public class Languages extends ActionSupport { public String execute() { languages.add(new Language("EnglishKey", "English Language")); languages.add(new Language("FrenchKey", "French Language")); languages.add(new Language("SpanishKey", "Spanish Language")); return SUCCESS; } List languages = new ArrayList(); public List getLanguages() { return languages; } public static class Language { String description; String key; public Language(String key, String description) { this.key = key; this.description = description; } public String getKey() { return key; } public String getDescription() { return description; } } }
<action name="Input"> <result>/app/Input.jsp</result> </action> <action name="Languages" class="app.Languages"> <result>Languages.jsp</result> </action>
The advantage being that the "Languages" action could be dropped in wherever the "Languages" control is needed, and that the Action for the form doesn't need to know how to populate the Languages control.
Now, the Action is going to be hit every time the page is rendered, but so long as you are using a caching data access layer, like IBATIS or Hibernate, it will end up being a memory-to-memory transfer, rather than a database access.


SICStus Prolog caches the name of the current working directory. To
take advantage of the cache and to keep it consistent, foreign code
should call the following interface functions instead of calling
chdir()
and getcwd()
directly:
SP_set_current_dir()
SP_get_current_dir()


Agente de Monitoreo v1.0
three supporting pieces of content. Use it as a starting point to create something more unique.
Ver printer


{{> yield 'content'}}
Summary
Nimble. Bespoke. Describe me as you please. When digital experiences surprise, delight and simplify life for the end user, it's a beautiful thing.
Let's build your digitally-driven business. What I bring to the table is a multidisciplinary mix of competencies: Product Design, Experience Design, Visual Design, Front-End Development.
Read more


Example
The oranges are of orange {{ i18n "color" }}.
Alias
The oranges are of orange {{ T "color" }}.


Popovers are small windows of content associated with a tag element. Use
showPopover()
to add a popover to any tag element with an HTML id. This
allows you to add explanations for inputs. Furthermore the linkInput()
makes adding popovers to semi-plain text possible. Popovers are hidden with
closePopover()
.
A character string specifying the HTML id of a popover’s target tag element.
A character string or tag element specifying the content of the popover.
A character string specifying a title for the popover, defaults
to NULL
, in which case a title is not added.
One of "top"
, "left"
, "bottom"
, or "right"
specifying where the popover is positioned relative to the target tag
element indicated by id
.
A positive integer specifying the duration of the popover
in seconds or NULL
, in which case the popover is not automatically
removed. When NULL
is specified the popover can be removed with
closePopover()
.
Add a popover
ui <- container( buttonInput(“click”, “Button”), buttonInput(“close”, icon(“times”)) %>% background(“red”) )
server <- function(input, output) { observeEvent(input$click, { showPopover( id = “click”, text = “This is a button!”, placement = “bottom”, duration = NULL ) })
observeEvent(input$close, { closePopover(“click”) }) }
shinyApp(ui, server)


|
Nexmo .NET Library
5.0.0
Nexmo REST API client for .NET, ASP.NET, ASP.NET MVC written in C#. API support for SMS, Voice, Text-to-Speech, Numbers, Verify (2FA) and more. https://developer.nexmo.com/
|
Public Member Functions | |
| VerifyResponse | VerifyRequest (VerifyRequest request, Credentials creds=null) |
| Use Verify request to generate and send a PIN to your user More... | |
| VerifyCheckResponse | VerifyCheck (VerifyCheckRequest request, Credentials creds=null) |
| Use Verify check to confirm that the PIN you received from your user matches the one sent by Nexmo in your Verify request More... | |
| VerifySearchResponse | VerifySearch (VerifySearchRequest request, Credentials creds=null) |
| Use Verify search to check the status of past or current verification requests More... | |
| VerifyControlResponse | VerifyControl (VerifyControlRequest request, Credentials creds=null) |
| Control the progress of your Verify requests. To cancel an existing Verify request, or to trigger the next verification event More... | |
| VerifyCheckResponse Nexmo.Api.Verify.IVerifyClient.VerifyCheck | ( | VerifyCheckRequest | request, |
| Credentials | creds = null |
||
| ) |
Use Verify check to confirm that the PIN you received from your user matches the one sent by Nexmo in your Verify request
| request | |
| creds |
Implemented in Nexmo.Api.Verify.VerifyClient.
| VerifyControlResponse Nexmo.Api.Verify.IVerifyClient.VerifyControl | ( | VerifyControlRequest | request, |
| Credentials | creds = null |
||
| ) |
Control the progress of your Verify requests. To cancel an existing Verify request, or to trigger the next verification event
| request | |
| creds |
Implemented in Nexmo.Api.Verify.VerifyClient.
| VerifyResponse Nexmo.Api.Verify.IVerifyClient.VerifyRequest | ( | VerifyRequest | request, |
| Credentials | creds = null |
||
| ) |
Use Verify request to generate and send a PIN to your user
| request | |
| creds |
Implemented in Nexmo.Api.Verify.VerifyClient.
| VerifySearchResponse Nexmo.Api.Verify.IVerifyClient.VerifySearch | ( | VerifySearchRequest | request, |
| Credentials | creds = null |
||
| ) |
Use Verify search to check the status of past or current verification requests
| request | |
| creds |
Implemented in Nexmo.Api.Verify.VerifyClient.


Subversion, Mercurial, ..., Profit!
tl;dr:
Workflow to use Subversion and Mercurial version control side by side.
Preface
Distributed source code management (DSCM) is very popular these days and might take over the world but the current reality is most companies still cling to centralized source control. Most often you will find Subversion (svn) or for the unlucky even CVS.
I won’t reiterate the advantages of distributed vs. centralized version control but if you are interested watch this video of Linus Torvalds trashing SVN.
After going through the five stages of grief lets start with acceptance. Here is a list of the stuff that makes centralized version control a bit painful for me.
* All branches are public
* All commits are public
* History requires connection
* Switching branches is slow
* Complete checkout with branches and tags unnecessary big
With that list in mind lets leverage the flexibility of DSCM to minimize those pain points.
My goals:
* Separation of local and remote version control
* Complete offline history with branches and tags
* Synchronization with central repository
* Push to central repository using native client
I want to live two version control lives. Central repository for working with team members and representing the source of truth plus a rouge local version control regime where I can experiment, branch, fix, delete without affecting other team members.
To achieve these goals I will now present my current work flow in a Subversion vs. Mercurial scenario.
The flow itself is technology agnostic so implementing the same flow with CVS and git is straight forward.
Pre-Requirements
- Subversion
- Mercurial
- hgsubversion (Mercurial plugin for svn integration)
Subversion and Mercurial
Subversion and Mercurial installation packages and instructions can be found at the corresponding websites. I won’t go into the details here as they are pretty standard.
One tip though: If you are installing Subversion on OS X using brew, you will need to install the Subversion python bindings as well.
hgsubversion
Installation
Mercurial offers one time svn conversion out of the box but as Subversion will stay my source of truth I use hgsubversion as a svn integration layer with push and pull support. I don’t use the hgsubversion push functionality as I don’t want to risk leaking Mercurial branches or other meta data to svn but you could easily do so and avoid using svn all together.
Testing
Workflow
Overview
The workflow itself looks like the normal DSCM flow of pull, work, push but each action is taking place in its own directory and repository clone.
Pull
The pull directory is a staging directory for using hgsubversion to pull changes form svn into an initial hg repository.
This hg repository keeps an exact copy of svn and is the source of truth. All other repositories are clones from pull and sync the incoming svn changes from here.
Work
Work is initially a clone of pull but completely separate. Its focus is purely on introducing changes, fixing bugs and working with hg. Here all features of Mercurial can be used to track work like feature branches, rebasing, many small commits or whatever your style is.
Push
Push is the final staging area for pushing changes back to svn.
Simply put push contains real svn checkouts and a clone of work in the same directory.
To avoid having the complete svn tree with all tags and branches on disk I only checkout specific svn branches on demand. I clone my work repository into those checkouts.
Updating to the same branch in svn and hg should result in the same content without any conflicts.
To introduce changes done in work I just update to my feature branch and override all files that changed. Now svn sees the changes and can be used to commit the changes to the central svn repository.
Walk through
After I covered the requirements and gave an overview on how it works here comes the complete flow shown on a contrived rubbish example.
Init directory structure
Starting with the initial directory structure.
Import svn project
You use the usual hg notation for clone as it will automatically fall back to svn.
Quick and easy
This assumes that you use the normal svn branches/tags/trunk layout. There are some parameters to map non-standard layouts but I never used them.
My preferred manual approach
For password protected svns I prefer to set up the hg repository manually to provide the svn path and user + password before starting the clone.
This will pull the complete history and branch/tag structure of the svn repository. This will take some time, depending on your svn size. I had cases that took several hours to complete.
This is a one-time effort and works fast afterwards.
Clone work
Do some work
Ok let’s checkout trunk, create a feature branch and add orm support.
Init Push
Before pushing to svn we need to checkout the branch we are interested. So I checkout trunk, clone my work directory that contains the feature branch.
As hg won’t clone into a directory that is not empty I clone it first to a temp directory and then just move the .hg directory into the svn checkout.
Push to svn
To finally push the changes to svn we update to the feature branch and replace all files. Using the svn client we can then push the changes to svn.
Pull changes from svn and close feature branch
Now we have come full circle and have our changes in svn and can pull them back in from pull to work etc. To tidy up I am also closing the feature branch as it is not necessary anymore.
Conclusion
This approach might seem like overkill but having the security of many commits and easy revert without sharing all those mini steps and potential conflicts with the team is liberating.
Personally I have semi-automated some steps using scripts (e.g. recursive pull for pull -> work -> push) to avoid repetitive tasks and also use tools like tortoisehg and tortoisesvn.


Reyzerbit Developer I go by Rey, I'm fluent in Java, C++, and web development. I'm the head developer for the server, as well as designer for the website. Please don't kill me.
BlazeTheWolf_ Developer I go by Blaze, I have been programming for 4-5 years now. I mostly code in C# and JavaScript but I am able to code in Java as well.


--- layout: post title: Cardamom spiced plum cake date: 2021-05-04 06:00:34 -0200 background: '/img/recipes/plum-cake-2.jpg' categories: Recipes ---
This cake is what winter dreams are made of. It's like a warm hug bursting with flavour.
Prep time: 15 minutes
Cook time: 25-30 minutes
Serving: 1x 24cm cake
Live long and keto-on!


FEAR AND LOATHING IN LAS VEGAS A film review by Steve Rhodes Copyright 1998 Steve Rhodes
RATING (0 TO ****): **
"We were somewhere on the edge of the desert when the drugs took hold," explains the stoned and wild-eyed journalist Raoul Duke. He speeds along like an out-of-control missile in the opening to FEAR AND LOATHING IN LAS VEGAS, which is based on the famous semi-autobiographical novel by Hunter Thompson about his gonzo journalism. Set in a stoned-out 1971, the movie's central character, Raoul, and his sidekick and attorney, Dr. Gonzo, spend the entire picture ripped, stoned, plastered, wasted, you name it. With a cornucopia of drugs in the trunk of their rented Cadillac convertible, they are on their way to Las Vegas, where they will cover the national convention of District Attorneys, among other things. Mainly they are going so they can party using every illegal substance you've ever heard of and some you haven't.
As directed by the wildly imaginative Terry Gilliam from MONTY PYTHON AND THE HOLY GRAIL, BRAZIL, THE FISHER KING and TWELVE MONKEYS, the comedy starts off so ridiculously that you can expect many people to walk out in disgust.
The remarkably talented Johnny Depp plays the lead, Raoul. To his credit, Depp takes what starts as an almost unwatchably bad movie and manages to make it kind of fascinating. With arms waving at imagined terrors, with feet and legs wobbling so he can barely walk without falling, and with a voice that sounds like it's coming from the bottom of a well, he looks so convincingly drugged out of his mind that you'll want to help him into treatment. When he walks, he darts from wall to wall due to his drug-induced paranoia. You see, he has killer bats chasing him.
Benicio Del Toro takes a more by the numbers approach to the part of Dr. Gonzo. He mumbles so many of his lines that he makes his character believable but rarely interesting.
A host of actors appear in cameo roles. Gary Busey plays a macho policeman who chases the speeding and stoned Raoul. The policeman is an understanding sort, who orders Raoul to get some rest and asks only for a little kiss in return. Christina Ricci plays a teenager who paints large oil portraits of Barbra Streisand while watching her on television. Raoul and Dr. Gonzo have nightmares about her naming them in a statutory rape trial.
In one of the film's best scenes, Raoul's drugged brain morphs a bar of conventioneers into a group of alien monsters like those in the bar scene in STAR WARS. In another scene, the pattern in the carpet starts to move and eventually turns to flowing blood. The special effects in the movie are inventive and the psychedelic colors of the sets by THE CROW's Alex McDowell are eye-catching. And when the movie gets utterly absurd, as it frequently does, at least the audience is entertained by some great music of the late 60s and early 70s.
FEAR AND LOATHING IN LAS VEGAS runs 1:55. It is rated R for constant drug usage and would be fine for kids only if they are of college age.
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


| DOSE: T+ 0:00 |
6 bowls |
smoked |
Various |
(plant material) |
| T+ 0:35 |
1 cup |
oral |
Various |
(tea) |
T+0 mins - I had a bunch of herbs and legal highs lying around, stuff that I'd ordered from online or that I was growing myself. The catnip I had lying around from when I last harvested my plant and left out to dry, which it now was, so I decided to try smoking it for the first time. I sat down and smoked six bowls of it mixed with tobacco in a row, and felt reasonably intoxicated. The smoke was pleasant and smooth, did not make me want to hack up a lung like weed does, but then I don't get along well with Marijuana. Nothing as strong as weed, and there were no real mental affects, but it was definitely relaxing and pleasant.
T+20 mins - The effects were noticeably tapering off, and I decided I wanted a bit more, so I dug through my 'intoxicants drawer' and pulled out various items, most too strong for what I was after, but I found about 1/3rd of a 15g bottle of Blue Lotus and a baggie of 'Algerian Blend' which I ordered from an online store. The Algerian Blend was a mix of herbs, including Damiana, Skullcap, Wormwood, Wild Opium Lettuce, Passion Flower and Valarian.
So I took these, with the Catnip, and added 2 tablespsoons of both the Catnip and the Algerian Blend, and emptied to container of Blue Lotus into my coffee perculator. To that I added warm water and stirred constantly for ten minutes, as I had read that warm water is better than hot water due to the latter destroying some of the alkaloids. I then let it sit for another five minutes and poured it into a cup, added milk and three teaspoons of sugar.
T+35 mins - I sipped this slowly for the next ten minutes, allowing it to sit beneath my tongue for a little while and absorb sublingually before swallowing it. The taste wasn't too bad, I recognised the bitter taste of Blue Lotus (I had made a tea of this before), but the minty flavour of the Catnip overrode most of it. The Algerian Blend had little or no effect on the taste, because I couldn't pick out anything either positive or negative from it. The catnip buzz was still present at this stage, but only really noticeable if I focused. Still very relaxed though.
T+45 mins - Starting to feel the effects of the tea. Very relaxed, time seems to be going slower, the music I'm listening to (Hard House) sounds silky and beautiful. I feel a slight tingly rush in my chest when I breathe in deeply.
T+50 mins - Noting a slight stimulation along with the depressant effects. I feel quite sleepy and dreamy, but at the same time terribly alert. I feel like getting up and dancing to my music. I am writing this report and working on an essay at the same time. I am not having any trouble with either, in fact it makes it easier to focus on the essay because I am having fun without having to do anything else.
T+55 mins - I feel at peace, a very slight sensation of Euphoria. Breathing deep is beautiful, I can't help but close my eyes when I do and listen to the silky beats of my music. There is a very slight, almost imperceptable echo to the music as well. This feels very reminiscent of the time I made a tea of 10g Blue Lotus, only it seems to be potentiated by the other herbs, more euphoria, more tingling, yet the other herbs put a definite spin on it. It is quite interesting, not mild, but not too strong either. I can easily get on with my work still.
T+1 hr 5 mins - Seems as though this experience has peaked, I guess we shall see soon. Moderate euphoria, sleepiness has increased, a heaviness of the limbs and my eyes go in and out of focus occasionally. Music sounds utterly brilliant. The stimulant effects seem to have worn off, I don't feel like dancing anymore, more than content to sit in my chair and bop along to the music. A little harder to work on my assignment now, and I'm starting to get a bit hungry, not sure if this has to do with the herbs or not though.
T+1 hr 10 mins - Got up to reheat some left over pizza, felt like walking in slow motion with my heavy limbs. I knew I wasn't, and there were no visual distortions that made it look like that, merely a trick on the brain.
T+1 hr 35 mins - Watched an episode of Family Guy while I was eating, seemed less funny than it usually does. Effects gradually began tapering off over this time, to the point where all that remained was a slight buzz and sedation.
T+2 hrs - Virtually at baseline. There is a very slight sedation, possibly a hangover effect. It is neither unpleasant nor pleasant, just feels like I haven't really had enough sleep.
T+3 hrs - All effects have entirely dissipated, including any feelings of sedation.
Conclusion:
All in all a pleasant experience. Nothing strong or mindblowing, it is very subtle and is only pleasurable if you concentrate on its effects, or you are after something mild. It's the kind of high you need to spend time approaching to get any effects, it doesn't really approach you. Kind of like a cammomile tea with a kick I suppose, much more useful for a Shaman than a Psychonaut, or anyone wanting some kind of a recreational high. Definitely wouldn't be any good for a night out, although music sounded great and I felt like dancing, if I was out in a nightclub/at a rave the overwhelming intensity and swarms of people certainly would have nullified the mild effects. I will likely revisit this experience in the future when I want to meditate or relax.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


WELCOME TO ARTIFICE
This is Artifice,a fully standard css template by
TEMPLATEDthe images used in this template is PDPHOTO
free template is undecreative companies attraction
This is Artifice,a fully standard css template by
TEMPLATEDthe images used in this template is PDPHOTO
free template is undecreative companies attraction
jkf nfvnsj nvn
parisis quarderatio patercia sub wel
bjsdc udkc hhch hdkdckkj kjkfjcskcs
shc ksh dckshkc dc
ribcolus peopphjskd jvk hkjfdvk nkjvn bcdjj
nksdcksc bhdh jfkdks
bdch bcb dbcb dbcb
bdch bcb dbcb dbcb
ribcolus peopphjskd jvk hkjfdvk nkjvn bcdjj
nksdcksc bhdh jfkdks
nfb nvjdv kjfv jfvjf
vhd bfb nvn fvnfn nfn
bv fvbndfv nvnv fvn
liberof ffd ser


Hello
current user:
email:
username:
Logout
Get accounts via UK Open Banking
Hello
Consent-ID:
Status:
Frequency per day:
Recurring indicator:
Valid until:
Create a new consent
Get accounts via Berlin Group APIs using Consent-ID


Starting at 9 AM on June 6, 2015, hundreds of people from across neighborhoods in Oakland will come together for National Day of Civic Hacking.
Each Neighborhood will have a designated place within the District to meet and join the movement.

There will then be an ending party at 6:00 PM at LOCATION BEING UPDATED where you can show off your day's work and meet everyone else that was hacking for national day!
We are a community powered all volunteer group who code for the local community. You can find out more here:
Visit OpenOaklandOn June 6, 2015, thousands of people from across the United States will come together for National Day of Civic Hacking.
The event will bring together urbanists, civic hackers, government staff, developers, designers, community organizers and anyone with the passion to make their city better. They will collaboratively build new solutions using publicly-released data, technology, and design processes to improve our communities and the governments that serve them.
We meet every Tuesday at 6:30 in Oakland City Hall. Find Out More:
Our Meetup PageFeel free to email us for any questions you have about the event or our group in general, give us suggestions for future events, or to just say hello!


Multiple testing procedures for discrete test statistics, that use the known discrete null distribution of the p-values for simultaneous inference.
| Version: | 0.1-2 |
| Published: | 2012-05-05 |
| Author: | Ruth Heller [aut], Hadas Gur [aut], Shay Yaacoby [aut, cre] |
| Maintainer: | Shay Yaacoby <shay66 at gmail.com> |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| URL: | http://www.math.tau.ac.il/~ruheller/ |
| NeedsCompilation: | no |
| CRAN checks: | discreteMTP results |
| Reference manual: | discreteMTP.pdf |
| Package source: | discreteMTP_0.1-2.tar.gz |
| Windows binaries: | r-devel: discreteMTP_0.1-2.zip, r-release: discreteMTP_0.1-2.zip, r-oldrel: discreteMTP_0.1-2.zip |
| OS X binaries: | r-release: discreteMTP_0.1-2.tgz, r-oldrel: discreteMTP_0.1-2.tgz |
| Reverse suggests: | sgof |
Please use the canonical form https://CRAN.R-project.org/package=discreteMTP to link to this page.


Sepsis
Sepsis
Home
My Profile
Guidelines/Training
Detection/Prediction
Patient Directory
My Profile
Records Details
Add
Title:
Upload Report:
Save
Date
Title
Uploaded File


All Classes
AccessToken
Base
BaseClient
BaseException
BaseHttpException
BaseModel
BaseResponseHandler
ErrorBag
HandlerInterface
HttpClientInterface
InputError
JSONRequestBody
Main
Media
NotFound
OkHttpClient
Request
RequestBody
Response
ResponseModel
User
UserNotFound
UserService


Packaging and distributing projects¶
This section covers the basics of how to configure, package and distribute your own Python projects. It assumes that you are already familiar with the contents of the パッケージのインストール page.
The section does not aim to cover best practices for Python project development as a whole. For example, it does not provide guidance or tool recommendations for version control, documentation, or testing.
For more reference material, see Building and Distributing Packages in the setuptools docs, but note that some advisory content there may be outdated. In the event of conflicts, prefer the advice in the Python Packaging User Guide.
Contents
Requirements for packaging and distributing¶
First, make sure you have already fulfilled the requirements for installing packages.
Install "twine" 1:
python -m pip install twine
You'll need this to upload your project distributions to PyPI (see below).
Configuring your project¶
Initial files¶
setup.py¶
The most important file is setup.py
which exists at the root of your
project directory. For an example, see the setup.py in the PyPA
sample project.
setup.py
serves two primary functions:
It's the file where various aspects of your project are configured. The primary feature of
setup.py
is that it contains a globalsetup()
function. The keyword arguments to this function are how specific details of your project are defined. The most relevant arguments are explained in the section below.It's the command line interface for running various commands that relate to packaging tasks. To get a listing of available commands, run
python setup.py --help-commands
.
setup.cfg¶
setup.cfg
is an ini file that contains option defaults for
setup.py
commands. For an example, see the setup.cfg in the PyPA
sample project.
README.rst / README.md¶
All projects should contain a readme file that covers the goal of the project.
The most common format is reStructuredText with an "rst" extension, although
this is not a requirement; multiple variants of Markdown are supported as well (look
at setup()
's long_description_content_type argument).
For an example, see README.md from the PyPA sample project.
メモ
Projects using setuptools 0.6.27+ have standard readme files
(README.rst
, README.txt
, or README
) included in
source distributions by default. The built-in distutils library adopts
this behavior beginning in Python 3.7. Additionally, setuptools
36.4.0+ will include a README.md
if found. If you are using
setuptools, you don't need to list your readme file in MANIFEST.in
.
Otherwise, include it to be explicit.
MANIFEST.in¶
A MANIFEST.in
is needed when you need to package additional files that
are not automatically included in a source distribution. For details on
writing a MANIFEST.in
file, including a list of what's included by
default, see "Including files in source distributions with MANIFEST.in".
For an example, see the MANIFEST.in from the PyPA sample project.
メモ
MANIFEST.in
does not affect binary distributions such as wheels.
LICENSE.txt¶
Every package should include a license file detailing the terms of distribution. In many jurisdictions, packages without an explicit license can not be legally used or distributed by anyone other than the copyright holder. If you're unsure which license to choose, you can use resources such as GitHub's Choose a License or consult a lawyer.
For an example, see the LICENSE.txt from the PyPA sample project.
<your package>¶
Although it's not required, the most common practice is to include your Python modules and packages under a single top-level package that has the same name as your project, or something very close.
For an example, see the sample package that's included in the PyPA sample project.
setup() args¶
As mentioned above, the primary feature of setup.py
is that it contains
a global setup()
function. The keyword arguments to this function are how
specific details of your project are defined.
The most relevant arguments are explained below. Most of the snippets given are taken from the setup.py contained in the PyPA sample project.
name¶
name='sample',
This is the name of your project, determining how your project is listed on PyPI. Per PEP 508, valid project names must:
Consist only of ASCII letters, digits, underscores (
_
), hyphens (-
), and/or periods (.
), andStart & end with an ASCII letter or digit.
Comparison of project names is case insensitive and treats arbitrarily-long
runs of underscores, hyphens, and/or periods as equal. For example, if you
register a project named cool-stuff
, users will be able to download it or
declare a dependency on it using any of the following spellings:
Cool-Stuff
cool.stuff
COOL_STUFF
CoOl__-.-__sTuFF
version¶
version='1.2.0',
This is the current version of your project, allowing your users to determine whether or not they have the latest version, and to indicate which specific versions they've tested their own software against.
Versions are displayed on PyPI for each release if you publish your project.
See Choosing a versioning scheme for more information on ways to use versions to convey compatibility information to your users.
If the project code itself needs run-time access to the version, the simplest
way is to keep the version in both setup.py
and your code. If you'd
rather not duplicate the value, there are a few ways to manage this. See the
"Single-sourcing the package version" Advanced Topics section.
description¶
description='A sample Python project',
long_description=long_description,
long_description_content_type='text/x-rst',
Give a short and long description for your project.
These values will be displayed on PyPI
if you publish your project. On pypi.org
, the user interface displays
description
in the grey banner and long_description
in the section
named "Project Description".
description
is also displayed in lists of projects. For example, it's
visible in the search results pages such as https://pypi.org/search/?q=jupyter,
the front-page lists of trending projects and new releases, and the list of
projects you maintain within your account profile (such as
https://pypi.org/user/jaraco/).
A content type
can be specified with the long_description_content_type
argument, which can
be one of text/plain
, text/x-rst
, or text/markdown
, corresponding
to no formatting, reStructuredText (reST),
and the Github-flavored Markdown dialect of Markdown respectively.
author¶
author='A. Random Developer',
<EMAIL_ADDRESS>Provide details about the author.
license¶
license='MIT',
The license
argument doesn't have to indicate the license under
which your package is being released, although you may optionally do
so if you want. If you're using a standard, well-known license, then
your main indication can and should be via the classifiers
argument. Classifiers exist for all major open-source licenses.
The "license" argument is more typically used to indicate differences from well-known licenses, or to include your own, unique license. As a general rule, it's a good idea to use a standard, well-known license, both to avoid confusion and because some organizations avoid software whose license is unapproved.
classifiers¶
classifiers=[
# How mature is this project? Common values are
# 3 - Alpha
# 4 - Beta
# 5 - Production/Stable
'Development Status :: 3 - Alpha',
# Indicate who your project is intended for
'Intended Audience :: Developers',
'Topic :: Software Development :: Build Tools',
# Pick your license as you wish (should match "license" above)
'License :: OSI Approved :: MIT License',
# Specify the Python versions you support here. In particular, ensure
# that you indicate whether you support Python 2, Python 3 or both.
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
],
Provide a list of classifiers that categorize your project. For a full listing, see https://pypi.org/classifiers/.
Although the list of classifiers is often used to declare what Python versions a project supports, this information is only used for searching & browsing projects on PyPI, not for installing projects. To actually restrict what Python versions a project can be installed on, use the python_requires argument.
project_urls¶
project_urls={
'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/',
'Funding': 'https://donate.pypi.org',
'Say Thanks!': 'http://saythanks.io/to/example',
'Source': 'https://github.com/pypa/sampleproject/',
'Tracker': 'https://github.com/pypa/sampleproject/issues',
},
List additional relevant URLs about your project. This is the place to link to bug trackers, source repositories, or where to support package development. The string of the key is the exact text that will be displayed on PyPI.
packages¶
packages=find_packages(include=['sample', 'sample.*']),
Set packages
to a list of all packages in your
project, including their subpackages, sub-subpackages, etc. Although the
packages can be listed manually, setuptools.find_packages()
finds them
automatically. Use the include
keyword argument to find only the given
packages. Use the exclude
keyword argument to omit packages that are not
intended to be released and installed.
py_modules¶
py_modules=["six"],
If your project contains any single-file Python modules that aren't part of a
package, set py_modules
to a list of the names of the modules (minus the
.py
extension) in order to make setuptools aware of them.
install_requires¶
install_requires=['peppercorn'],
"install_requires" should be used to specify what dependencies a project minimally needs to run. When the project is installed by pip, this is the specification that is used to install its dependencies.
For more on using "install_requires" see install_requires vs requirements files.
python_requires¶
If your project only runs on certain Python versions, setting the
python_requires
argument to the appropriate PEP 440 version specifier
string will prevent pip from installing the project on other Python
versions. For example, if your package is for Python 3+ only, write:
python_requires='>=3',
If your package is for Python 2.6, 2.7, and all versions of Python 3 starting with 3.3, write:
python_requires='>=2.6, !=3.0.*, !=3.1.*, !=3.2.*',
And so on.
メモ
Support for this feature is relatively recent. Your project's source
distributions and wheels (see Packaging your project) must be built
using at least version 24.2.0 of setuptools in order for the
python_requires
argument to be recognized and the appropriate metadata
generated.
In addition, only versions 9.0.0 and higher of pip recognize the
python_requires
metadata. Users with earlier versions of pip will be
able to download & install projects on any Python version regardless of the
projects' python_requires
values.
package_data¶
package_data={
'sample': ['package_data.dat'],
},
Often, additional files need to be installed into a package. These files are often data that’s closely related to the package’s implementation, or text files containing documentation that might be of interest to programmers using the package. These files are called "package data".
The value must be a mapping from package name to a list of relative path names that should be copied into the package. The paths are interpreted as relative to the directory containing the package.
For more information, see Including Data Files from the setuptools docs.
data_files¶
data_files=[('my_data', ['data/data_file'])],
Although configuring package_data is sufficient for most needs, in some
cases you may need to place data files outside of your packages. The data_files
directive allows you to do that.
It is mostly useful if you need to install files which are used by other
programs, which may be unaware of Python packages.
Each (directory, files)
pair in the sequence specifies the installation
directory and the files to install there. The directory
must be a relative
path (although this may change in the future, see
wheel Issue #92).
and it is interpreted relative to the installation prefix
(Python’s sys.prefix
for a default installation;
site.USER_BASE
for a user installation).
Each file name in files
is interpreted relative to the setup.py
script at the top of the project source distribution.
For more information see the distutils section on Installing Additional Files.
メモ
When installing packages as egg, data_files
is not supported.
So, if your project uses setuptools, you must use pip
to install it. Alternatively, if you must use python setup.py
,
then you need to pass the --old-and-unmanageable
option.
scripts¶
Although setup()
supports a scripts
keyword for pointing to pre-made scripts to install, the recommended approach to
achieve cross-platform compatibility is to use console_scripts entry
points (see below).
entry_points¶
entry_points={
...
},
Use this keyword to specify any plugins that your project provides for any named entry points that may be defined by your project or others that you depend on.
For more information, see the section on Advertising Behavior from the setuptools docs.
The most commonly used entry point is "console_scripts" (see below).
console_scripts¶
entry_points={
'console_scripts': [
'sample=sample:main',
],
},
Use "console_script" entry points to register your script interfaces. You can then let the toolchain handle the work of turning these interfaces into actual scripts 2. The scripts will be generated during the install of your distribution.
For more information, see Automatic Script Creation from the setuptools docs.
Choosing a versioning scheme¶
Standards compliance for interoperability¶
Different Python projects may use different versioning schemes based on the needs of that
particular project, but all of them are required to comply with the flexible public version
scheme specified
in PEP 440 in order to be supported in tools and libraries like pip
and setuptools
.
Here are some examples of compliant version numbers:
1.2.0.dev1 # Development release
1.2.0a1 # Alpha Release
1.2.0b1 # Beta Release
1.2.0rc1 # Release Candidate
1.2.0 # Final Release
1.2.0.post1 # Post Release
15.10 # Date based release
23 # Serial release
To further accommodate historical variations in approaches to version numbering, PEP 440 also defines a comprehensive technique for version normalisation that maps variant spellings of different version numbers to a standardised canonical form.
Scheme choices¶
Semantic versioning (preferred)¶
For new projects, the recommended versioning scheme is based on Semantic Versioning, but adopts a different approach to handling pre-releases and build metadata.
The essence of semantic versioning is a 3-part MAJOR.MINOR.MAINTENANCE numbering scheme, where the project author increments:
MAJOR version when they make incompatible API changes,
MINOR version when they add functionality in a backwards-compatible manner, and
MAINTENANCE version when they make backwards-compatible bug fixes.
Adopting this approach as a project author allows users to make use of "compatible release" specifiers, where
name ~= X.Y
requires at least release X.Y, but also allows any later release with
a matching MAJOR version.
Python projects adopting semantic versioning should abide by clauses 1-8 of the Semantic Versioning 2.0.0 specification.
Date based versioning¶
Semantic versioning is not a suitable choice for all projects, such as those with a regular time based release cadence and a deprecation process that provides warnings for a number of releases prior to removal of a feature.
A key advantage of date based versioning is that it is straightforward to tell how old the base feature set of a particular release is given just the version number.
Version numbers for date based projects typically take the form of YEAR.MONTH (for example,
12.04
, 15.10
).
Serial versioning¶
This is the simplest possible versioning scheme, and consists of a single number which is incremented every release.
While serial versioning is very easy to manage as a developer, it is the hardest to track as an end user, as serial version numbers convey little or no information regarding API backwards compatibility.
Hybrid schemes¶
Combinations of the above schemes are possible. For example, a project may combine date based versioning with serial versioning to create a YEAR.SERIAL numbering scheme that readily conveys the approximate age of a release, but doesn't otherwise commit to a particular release cadence within the year.
Pre-release versioning¶
Regardless of the base versioning scheme, pre-releases for a given final release may be published as:
zero or more dev releases (denoted with a ".devN" suffix)
zero or more alpha releases (denoted with a ".aN" suffix)
zero or more beta releases (denoted with a ".bN" suffix)
zero or more release candidates (denoted with a ".rcN" suffix)
pip
and other modern Python package installers ignore pre-releases by default when
deciding which versions of dependencies to install.
Local version identifiers¶
Public version identifiers are designed to support distribution via PyPI. Python's software distribution tools also support the notion of a local version identifier, which can be used to identify local development builds not intended for publication, or modified variants of a release maintained by a redistributor.
A local version identifier takes the form <public version identifier>+<local version label>
.
For example:
1.2.0.dev1+hg.5.b11e5e6f0b0b # 5th VCS commit since 1.2.0.dev1 release
1.2.1+fedora.4 # Package with downstream Fedora patches applied
Working in "development mode"¶
Although not required, it's common to locally install your project in "editable" or "develop" mode while you're working on it. This allows your project to be both installed and editable in project form.
Assuming you're in the root of your project directory, then run:
python -m pip install -e .
Although somewhat cryptic, -e
is short for --editable
, and .
refers
to the current working directory, so together, it means to install the current
directory (i.e. your project) in editable mode. This will also install any
dependencies declared with "install_requires" and any scripts declared with
"console_scripts". Dependencies will be installed in the usual, non-editable mode.
It's fairly common to also want to install some of your dependencies in editable mode as well. For example, supposing your project requires "foo" and "bar", but you want "bar" installed from VCS in editable mode, then you could construct a requirements file like so:
-e .
-e git+https://somerepo/bar.git#egg=bar
The first line says to install your project and any dependencies. The second line overrides the "bar" dependency, such that it's fulfilled from VCS, not PyPI.
If, however, you want "bar" installed from a local directory in editable mode, the requirements file should look like this, with the local paths at the top of the file:
-e /path/to/project/bar
-e .
Otherwise, the dependency will be fulfilled from PyPI, due to the installation order of the requirements file. For more on requirements files, see the Requirements File section in the pip docs. For more on VCS installs, see the VCS Support section of the pip docs.
Lastly, if you don't want to install any dependencies at all, you can run:
python -m pip install -e . --no-deps
For more information, see the Development Mode section of the setuptools docs.
Packaging your project¶
To have your project installable from a Package Index like PyPI, you'll need to create a Distribution (aka "Package") for your project.
Source distributions¶
Minimally, you should create a Source Distribution:
python setup.py sdist
A "source distribution" is unbuilt (i.e. it's not a Built
Distribution), and requires a build step when installed by pip. Even if the
distribution is pure Python (i.e. contains no extensions), it still involves a
build step to build out the installation metadata from setup.py
.
Wheels¶
You should also create a wheel for your project. A wheel is a built package that can be installed without needing to go through the "build" process. Installing wheels is substantially faster for the end user than installing from a source distribution.
If your project is pure Python (i.e. contains no compiled extensions) and natively supports both Python 2 and 3, then you'll be creating what's called a *Universal Wheel* (see section below).
If your project is pure Python but does not natively support both Python 2 and 3, then you'll be creating a "Pure Python Wheel" (see section below).
If your project contains compiled extensions, then you'll be creating what's called a *Platform Wheel* (see section below).
Before you can build wheels for your project, you'll need to install the
wheel
package:
python -m pip install wheel
Universal Wheels¶
Universal Wheels are wheels that are pure Python (i.e. contain no compiled extensions) and support Python 2 and 3. This is a wheel that can be installed anywhere by pip.
To build the wheel:
python setup.py bdist_wheel --universal
You can also permanently set the --universal
flag in setup.cfg
:
[bdist_wheel]
universal=1
Only use the --universal
setting, if:
Your project runs on Python 2 and 3 with no changes (i.e. it does not require 2to3).
Your project does not have any C extensions.
Beware that bdist_wheel
does not currently have any checks to warn if you
use the setting inappropriately.
If your project has optional C extensions, it is recommended not to publish a universal wheel, because pip will prefer the wheel over a source installation, and prevent the possibility of building the extension.
Pure Python Wheels¶
Pure Python Wheels that are not "universal" are wheels that are pure Python (i.e. contain no compiled extensions), but don't natively support both Python 2 and 3.
To build the wheel:
python setup.py bdist_wheel
bdist_wheel
will detect that the code is pure Python, and build a wheel
that's named such that it's usable on any Python installation with the same
major version (Python 2 or Python 3) as the version you used to build the
wheel. For details on the naming of wheel files, see PEP 425.
If your code supports both Python 2 and 3, but with different code (e.g., you
use "2to3") you can run
setup.py bdist_wheel
twice, once with Python 2 and once with Python 3. This
will produce wheels for each version.
Platform Wheels¶
Platform Wheels are wheels that are specific to a certain platform like Linux, macOS, or Windows, usually due to containing compiled extensions.
To build the wheel:
python setup.py bdist_wheel
bdist_wheel will detect that the code is not pure Python, and build a wheel that's named such that it's only usable on the platform that it was built on. For details on the naming of wheel files, see PEP 425.
Uploading your Project to PyPI¶
When you ran the command to create your distribution, a new directory dist/
was created under your project's root directory. That's where you'll find your
distribution file(s) to upload.
メモ
These files are only created when you run the command to create your
distribution. This means that any time you change the source of your project
or the configuration in your setup.py
file, you will need to rebuild
these files again before you can distribute the changes to PyPI.
メモ
Before releasing on main PyPI repo, you might prefer training with the PyPI test site which is cleaned on a semi regular basis. See Using TestPyPI on how to setup your configuration in order to use it.
注意
In other resources you may encounter references to using
python setup.py register
and python setup.py upload
. These methods
of registering and uploading a package are strongly discouraged as it may
use a plaintext HTTP or unverified HTTPS connection on some Python versions,
allowing your username and password to be intercepted during transmission.
ヒント
The reStructuredText parser used on PyPI is not Sphinx!
Furthermore, to ensure safety of all users, certain kinds of URLs and
directives are forbidden or stripped out (e.g., the .. raw::
directive). Before trying to upload your distribution, you should check
to see if your brief / long descriptions provided in setup.py
are
valid. You can do this by running twine check on
your package files:
twine check dist/*
Create an account¶
First, you need a PyPI user account. You can create an account using the form on the PyPI website.
Now you'll create a PyPI API token so you will be able to securely upload your project.
Go to https://pypi.org/manage/account/#api-tokens and create a new API token; don't limit its scope to a particular project, since you are creating a new project.
Don't close the page until you have copied and saved the token — you won't see that token again.
メモ
To avoid having to copy and paste the token every time you
upload, you can create a $HOME/.pypirc
file:
[pypi]
username = __token__
password = <the token value, including the `pypi-` prefix>
Be aware that this stores your token in plaintext.
For more details, see the specification for .pypirc
.
Upload your distributions¶
Once you have an account you can upload your distributions to PyPI using twine.
The process for uploading a release is the same regardless of whether or not the project already exists on PyPI - if it doesn't exist yet, it will be automatically created when the first release is uploaded.
For the second and subsequent releases, PyPI only requires that the version number of the new release differ from any previous releases.
twine upload dist/*
You can see if your package has successfully uploaded by navigating to the URL
https://pypi.org/project/<sampleproject>
where sampleproject
is
the name of your project that you uploaded. It may take a minute or two for
your project to appear on the site.
- 1
Depending on your platform, this may require root or Administrator access. pip is currently considering changing this by making user installs the default behavior.
- 2
Specifically, the "console_script" approach generates
.exe
files on Windows, which are necessary because the OS special-cases.exe
files. Script-execution features likePATHEXT
and the Python Launcher for Windows allow scripts to be used in many cases, but not all.


Preparation time
1-2 hours
Cooking time
over 2 hours
Serves
Serves 10–12
Dietary
While I love a baked cheesecake, I also love the ease of making a cheesecake that sets in the fridge – like this one, which I jazz up with beautiful mini meringues and dehydrated strawberries. It’s the kind of dessert recipe I enjoy most, where the cake itself is easy to make, so I can spend lots of time creating the decorations.
Grease a loose-bottomed 23cm/9in round cake tin and line with baking paper.
For the base, put the crushed biscuits into a bowl with the melted butter and mix together. The mixture should resemble wet sand. Pour into the cake tin and pack tightly using the back of a spoon, then cover and place in the fridge for 15 minutes.
Pour the cream into a large bowl, add the icing sugar and vanilla and whisk into soft peaks. Put the cream cheese into another bowl and stir to slacken.
Add the cream mixture and the freeze-dried strawberry pieces to the cream cheese and fold together gently. Spoon on to the chilled base and level off. Put the cheesecake back into the fridge.
For the strawberry sauce, put the strawberries, icing sugar and lemon juice into a food processor and pulse to a purée. Transfer to a bowl and put in the fridge.
To make the mini meringues, preheat the oven to 120C/100C Fan/Gas ½. Line a baking tray with baking paper. Fit a piping bag with a 1½cm/½in star-tip nozzle and turn inside out. Stand it in a tall glass or jug until you need it.
Put the egg whites into a large clean, glass bowl and whisk with an electric whisk or stand mixer. After 2 minutes the mixture should be frothy and increased in volume. Start adding the sugar a little at a time. Once all the sugar is added, keep whisking until you have stiff peaks.
Using a brush and red food colouring, paint the inside of the piping bag with red stripes, starting with the tip and painting only as far as you will fill the bag. Fill the bag with the meringue mixture and pipe little kisses on to the tray.
Bake the meringues for 1 hour.  Remove them from the oven and take them off the paper.
For the white chocolate-dipped strawberries, gently melt the chocolate in a bowl over a pan of simmering water (do not let the bowl touch the water.) Using the same tray you made the meringues on, flip the paper over. Hold the strawberries by the stalk and dip them into the white chocolate to come three-quarters of the way up. Place on the tray to set – you can put them into the fridge to speed up the setting.
Take the cheesecake out of the fridge, remove from the tin and place on a serving board. Just before serving, pour over enough sauce to just cover the top – you may not need it all. Top with the dipped strawberries, meringues and lustred dehydrated strawberry slices.


Encrypted zip files on OSX
Update: I've since switched to KeePassXC, the community fork of KeePassX, an open source, cross-platorm, local-first, encrypted password storage program.
My passwords and other miscellany are in a plain text file within an encrypted zip. Since starting to use OSX I've been looking for a way to access my passwords such that:
- I get prompted for the decryption password.
- The file gets unzipped, but not in the same directory, because that's synced to Dropbox, so would send my plaintext passwords to them every time I accessed them. Maybe to /tmp?
- The plaintext file within the zip is opened in \$EDITOR.
- Wait for me to close \$EDITOR, then remove my plaintext passwords from the filesystem.
- Before deleting the passwords, check if I've updated them. If so, put the new updated version back into the original zip file.
- Don't forget to keep the updated zip file encrypted, using the same password as before, without prompting for it again.
I failed to find an existing app which would do all this (although I had no trouble on Linux or even on Windows.) Hence, resorting to good old Bash:
#!/bin/bash ZIPDIR="$HOME/docs/org" read -s -p "Password:" key cd $ZIPDIR unzip -P $key passwords.zip passwords.txt -d $TMPDIR if [[ $? != 0 ]] ; then exit 1 fi cd "$TMPDIR" touch passwords.datestamp $EDITOR passwords.txt if [[ passwords.txt -nt passwords.datestamp ]] ; then zip -P $key -r "$ZIPDIR/passwords.zip" passwords.txt fi rm passwords.txt rm passwords.datestamp
I don't expect this to be watertight, but seems good enough for today. I'm happy to hear suggestions.


This Privacy Policy governs the manner in which ERA collects, uses, maintains and discloses information collected from users or research participants (each, a "User") of the ERA mobile application and eraproject.ca website ("Site"). This privacy policy applies to the Site and all products and services offered by eraproject.ca.
Personal identification information
We do not collect personally identifiable information from Users, other than their age, gender and ethnicity for demographic purposes. We collect this information when Users respond to demographic questions as part of participating in research, and in connection with other activities, services, features or resources we make available on our Site. Users may visit our Site anonymously. We will collect personal identification information from Users only if they voluntarily submit such information to us. Users can always refuse to supply personally identification information, except that it may prevent them from engaging in certain Site related activities.
Non-personal identification information
We may collect non-personal identification information about Users whenever they interact with our Site. Non-personal identification information may include the browser name, the type of computer or mobile device and technical information about Users means of connection to our Site, such as the operating system and the Internet service providers utilized and other similar information.
Web browser cookies
Our Site may use "cookies" to enhance User experience. User's web browser places cookies on their hard drive for record-keeping purposes and sometimes to track information about them. User may choose to set their web browser to refuse cookies, or to alert you when cookies are being sent. If they do so, note that some parts of the Site may not function properly.
How we use collected information
eraproject.ca may collect and use Users personal information for the following purposes:
- - To obtain age, gender and ethnicity of participants for research purposes.
How we protect your information
We adopt appropriate data collection, storage and processing practices and security measures to protect against unauthorized access, alteration, disclosure or destruction of your personal information, username, password, transaction information and data stored on our Site.
Sharing your personal information
We do not sell, trade, or rent Users personal identification information to others. We may share generic aggregated demographic information not linked to any personal identification information regarding visitors and users with our business partners, trusted affiliates and advertisers for the purposes outlined above.
Changes to this privacy policy
eraproject.ca has the discretion to update this privacy policy at any time. When we do, we will post a notification on the main page of our Site. We encourage Users to frequently check this page for any changes to stay informed about how we are helping to protect the personal information we collect. You acknowledge and agree that it is your responsibility to review this privacy policy periodically and become aware of modifications.
Your acceptance of these terms
By using this Site, you signify your acceptance of this policy. If you do not agree to this policy, please do not use our Site. Your continued use of the Site following the posting of changes to this policy will be deemed your acceptance of those changes.
Contacting us
If you have any questions about this Privacy Policy, the practices of this site, or your dealings with this site, please contact us at:
ERA Project
C/O Dr. Catherine Ortner
Psychology Department
Thompson Rivers University
900 McGill Road
Kamloops, BC
V2C 6N6
<EMAIL_ADDRESS>eraproject.ca
Policy last updated on March 20, 2015


(#) Specify a range of JobScheduler ids !!! WARNING: Specify a range of JobScheduler ids This is a warning. Id : `SpecifyJobSchedulerIdRange` Summary : Specify a range of JobScheduler ids Severity : Warning Category : Correctness Platform : Android Vendor : Android Open Source Project Identifier : androidx.work Feedback : https://issuetracker.google.com/issues/new?component=409906 Min : Lint 7.0 Compiled : Lint 8.0 and 8.1 Artifact : [androidx.work:work-runtime](androidx_work_work-runtime.md.html) Affects : Kotlin and Java files Editing : This check runs on the fly in the IDE editor Implementation : [Source Code](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:/work/work-lint/src/main/java/androidx/work/lint/SpecifyJobSchedulerIdRangeIssueDetector.kt) Tests : [Source Code](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:/work/work-lint/src/test/java/androidx/work/lint/SpecifyJobSchedulerIdRangeIssueDetectorTest.kt) Copyright Year : 2020 When using `JobScheduler` APIs directly, `WorkManager` requires that developers specify a range of `JobScheduler` ids that are safe for `WorkManager` to use so the `id`s do not collide. For more information look at `androidx.work.Configuration.Builder.setJobSchedulerJobIdRange(int, int)`. (##) Including !!! This is not a built-in check. To include it, add the below dependency to your project. ``` // build.gradle.kts implementation("androidx.work:work-runtime:2.9.0-alpha01") // build.gradle implementation 'androidx.work:work-runtime:2.9.0-alpha01' // build.gradle.kts with version catalogs: implementation(libs.work-runtime) # libs.versions.toml [versions] work-runtime = "2.9.0-alpha01" [libraries] work-runtime = { module = "androidx.work:work-runtime", version.ref = "work-runtime" } ``` 2.9.0-alpha01 is the version this documentation was generated from; there may be newer versions available. [Additional details about androidx.work:work-runtime](androidx_work_work-runtime.md.html). (##) Suppressing You can suppress false positives using one of the following mechanisms: * Using a suppression annotation like this on the enclosing element: ```kt // Kotlin @Suppress("SpecifyJobSchedulerIdRange") fun method() { setJobSchedulerJobIdRange(...) } ``` or ```java // Java @SuppressWarnings("SpecifyJobSchedulerIdRange") void method() { setJobSchedulerJobIdRange(...); } ``` * Using a suppression comment like this on the line above: ```kt //noinspection SpecifyJobSchedulerIdRange problematicStatement() ``` * Using a special `lint.xml` file in the source tree which turns off the check in that folder and any sub folder. A simple file might look like this: ```xml <?xml version="1.0" encoding="UTF-8"?> <lint> <issue id="SpecifyJobSchedulerIdRange" severity="ignore" /> </lint> ``` Instead of `ignore` you can also change the severity here, for example from `error` to `warning`. You can find additional documentation on how to filter issues by path, regular expression and so on [here](https://googlesamples.github.io/android-custom-lint-rules/usage/lintxml.md.html). * In Gradle projects, using the DSL syntax to configure lint. For example, you can use something like ```gradle lintOptions { disable 'SpecifyJobSchedulerIdRange' } ``` In Android projects this should be nested inside an `android { }` block. * For manual invocations of `lint`, using the `--ignore` flag: ``` $ lint --ignore SpecifyJobSchedulerIdRange ...` ``` * Last, but not least, using baselines, as discussed [here](https://googlesamples.github.io/android-custom-lint-rules/usage/baselines.md.html).


Inhee Chung Lab @ GW
Studying cancer metastasis at the single-molecule level
Biophysical Study of Cancer Progression
Inhee Chung Lab at the George Washington University focuses on understanding biophysical mechanisms of cancer metastasis and identifying novel therapeutic targets. Metastasis is the leading cause of death in cancer patients. We believe that characterization and analysis of real-time movements of individual proteins and other biomolecules in living cells will bring us a greater understanding of the molecular basis of cancer initiation and progression. To this end, we use and develop various biophysical methods including single molecule tracking, cutting-edge super-resolution microscopy, and advanced statistical analyses, in conjunction with traditional biochemistry and cell biology techniques and animal models. This integrated approach allows us to reveal details of cell biological and biophysical processes that drive cancer, which cannot be uncovered using traditional methods alone.
We are hiring! We are looking for highly energetic and motivated undergraduate/graduate students and postdocs with a background in physics, chemistry, or biology.
See the join us page for detail.


Manually testing of PositionCalculator
Try out all the options check the result.
Initial placement of reference point. The colored triangle shows your decision.
.calculate()


Purpose
This page is to facilitate running WRF on NIU's GAEA cluster. It is intended for users in the Department of Geography who belong to the spatialcogvis group.
These instructions are adapted from Dr. Victor Gensini's WRF tutorial document.
A big thanks to Dr. Kirk Duffin of the Computer Science department at NIU for setting up WRF and helping us to get started on this project.
Data
This example will use NARR data from 00 UTC on 10 July 2011 to 18 UTC on 11 July 2011 to simulate the progression of a severe Mesoscale Convective System.
Logging on to GAEA
Logging on to GAEA requires establishing an ssh connection to gaea.niu.edu.
| Download PuTTY |
| Open PuTTY and type gaea.niu.edu into the Host Name input field |
| Input username and password (GAEA specific, talk to Alex for more info) |
| Open a terminal |
| Type ssh<EMAIL_ADDRESS>|
| Input username and password (GAEA specific, talk to Alex for more info) |
Getting NARR Data
Data source is the National Centers for Environmental Information
| cd /data1/spatialcogvis |
| mkdir username (this is whatever your username, project, etc., is) |
| cd username |
| mkdir narr |
| cd narr |
| use wget to download the following files: |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_0000_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_0300_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_0600_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_0900_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_1200_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_1500_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_1800_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110710/narra_221_20110710_2100_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_0000_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_0300_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_0600_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_0900_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_1200_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_1500_000.grb |
| wget http://nomads.ncdc.noaa.gov/data/narr/201107/20110711/narra_221_20110711_1800_000.grb |
Defining Simulation Parameters
Two files are required to define things like the spatial domain of the simulation, where output data are stored, and where the processes can find pertinent data and configuration files.
Place the follwing files in your WRF directory:
| namelist.input: For more info on variables in namelist.input, see this ucar page or Dr. Victor Gensini's document here |
| namelist.wps: For more info on variables in namelist.wps, see this ucar page or Dr. Victor Gensini's document here |
These files define several parameters, such as the range of the simulation, the spatial domain, and the spatial and temporal resolution.
For this case, the domain will encompass the following shaded areas with 4x4 km spatial and 3 hourly temporal output:
Preparing for the Simulation
| cd /data1/spatialcogvis/username | |
| ln -sf /data1/local/stow/WPS-3.8.1/Variable_Tables/Vtable.NARR Vtable | |
| mkdir shared_tables | |
| cp /data1/spatialcogvis/WRF/shared_tables/* /data1/spatialcogvis/username/shared_tables | |
| mkdir my_output | |
| ln -sf /data1/local/stow/WPS-3.8.1/bin/link_grib.csh . | |
| ln -sf /data1/local/stow/WRF-3.8.1/run/* .
(You will need to replace your own namelist.input since this will overwrite it.) |
Running Pre-Processing Tasks
Before WRF can be run, four processes need to be executed:
GEOGRID:
| Copy the following job file to your home directory (cd ~): geogrid.job |
| Submit the job to the cluster queue using the command: qsub geogrid.job |
| When this is complete, you should see a file named "geo_em.d01.nc" or similar in your my_output folder. |
UNGRIB (for some reason, ungrib.job does not work. Skip striked steps):
| Link narr grib files to WRF directory using command:
link_grib.csh /data1/spatialcogvis/username/narr/*.grb |
| If this succeeded, you should see files like "GRIBFILE.AAA, GRIBFILE.AAB, etc." in your WRF directory. |
| Manual UNGRIB is performed by running the following commands in your WRF directory: |
| module add wrf/wrf-3.8.1 |
| ungrib.exe |
| When this is complete, you should see files like "FILE:2011-07-11_18, FILE:2011-07-11_15, etc." in your WRF directory. |
METGRID:
| 1) Copy the following job file to your home directory (cd ~): metgrid.job |
| 2) Submit the job to the cluster queue using the command: qsub ungrib.job |
| When this is complete, you should see files like "met_em.d01.2011-07-11_18:00:00.nc" in your my_output directory. |
REAL:
| 1) Link the met_em files to your WRF directory using this command: ln -sf /data1/spatialcogvis/username/my_output/met_em.d* . |
| 2) Copy the following job file to your home directory (cd ~): real.job |
| 3) Submit the job to the cluster queue using the command: qsub real.job |
| When this is complete, you should see two files "wrfbdy_d01" and "wrfinput_d01" in your WRF directory. |
Running WRF
| 1) Copy the following job file to your home directory (cd ~): run_wrf.job |
| 2) Submit the job to the cluster queue using the command: qsub run_wrf.job |
| The provided settings ask for an allocation of 5 nodes with 8 processors per node, for a total of 40 processors. |
| You can check to see if your process is still running by using this command: qstat |
| As this process is running, you will see large netCDF files like “wrfout_d01_2011-07-10_18:00:00.nc” populating your WRF directory. |


BlueAnt has launched 2 new Bluetooth portable wireless speakers – the X1 and X2 speakers
by Alex DennisBlueAnt, an Aussie tech audio company has launched 2 new Bluetooth portable wireless speakers, the X1 and X2 speakers just in time for Christmas.
The new X-series Bluetooth speakers have been designed and made capable of producing bass in the same form factor as other similar larger speakers fail to deliver that are currently in the marketplace.
Taisen Maddern, CEO and Founder of BlueAnt has said:
“The X1 and X2 deliver sound you can literally see; the deep bass is evident the moment you turn the device on and holds through any listening experience,” and “If sound is what people are after, they can now turn to the X1 or X2 which deliver a premium experience at the best price point on the market.”
Spec wise, the two ranges of speakers are more alike than different, but there are some key differences, so lets have a look at what you get for the price for both :
| Devices/Item | X1 Bluetooth Speaker | X2 Bluetooth Speaker |
|---|---|---|
| Wattage | 14 watt | 20 watt |
| Battery | 10 hours | 12 hours |
| Bluetooth Version | 4.2 | 4.2 |
| Audio play-back Options | Bluetooth and Aux playback | Bluetooth and Aux Playback |
| IP Water Rating | IP56 splashproof | IP56 splashproof |
| Audio Drivers/Radiators | 2 x 40mm drivers, 2 x passive radiators | 2 x 45mm drivers, 2 x passive radiators |
| Assistant Integration | Siri/Google Integration | Siri/Google Integration |
| Colours Available | Black, Blue, Red | Black, Blue, Red |
| Price | $79.95 | $99.95 |
| Retail availability | Officeworks, The Iconic, Amazon | Officeworks, Amazon, The iconic |
“We’re betting on bass and both the X1 and the X2 deliver exactly that: pure, deep bass in a form factor and design that can fit in anywhere they’re taken,”
As stated, the BlueAnt X1 and X2 Bluetooth portable speakers are available from Officeworks, The Iconic and Amazon for $79.95 for the X1 Speaker and $99.95 for the X2 Speakers right now.


Exfilled files are uploaded from an agent on a host to the server during an operation are by default stored on the server at {{ exfil_dir }}. You can view and download the files here


Ni Framework (NiFrame) - Version 1.0
Overview:
NiFrame is a web application (or website) starter system.
Simply install NiFrame to your web server and follow the installation wizard. The system is designed so
that features can be added with as little as a new "driver" file or as many class, driver, and HTML
files as needed. HTML is separated from PHP so HTML files can be combined to form new pages or
"conditioned" to remove or add HTML as needed. Driver files can even be constructed or modified
to work with FLASH style GUIs or AJAX(JQUERY) style HTML pages with very little effort. After installing
NiFrame the following system features and functionality are available to you:
Proposed System and Functionality:
- System Installer:
- System Install Wizard ✓
- System Files - Automatically installs required system files on your server. ✓
- MySQL Data - Automatically builds system data tables and default values into your MySQL database. ✓
- Configuration - Choose how to configure the System for specific needs. ⚠
- Mod Selector - Choose which mods to install with the system. ⚠
- System Un-Installer - Removes all NiFrame system files and database tables.⚒
- Style (Template) System:
- HTML File Merging - Combine HTML files to create different pages! ✓
- Variable Injection - Change page data based on user and/or situation! ✓
- Content Includes - Maintain a single content set or swap content while changing styles! ✓
- Dynamic HTML Conditioning - Remove, Repeat and/or Nested Repeat HTML with dynamic values!! ✓
- Automatic form detection and Input Validation for HTML5 inspired types on all browsers! ✓
- Flash GUI Support - Use Flash as your user interface instead of an HTML template! ⚠
- User System:
- Session Handling & Data Security ✓
- User Types(Groups)✓
- User Type Based Permissions✓
- User Statuses (Active, Banned, Misc...)✓
- Registration System ✓
- Basic Profiles ✓
- Action Stalking (tracks what users do and when) ⚠
- Phone SMS Fishing ⚠
- User-Defined Attribute Support:
- Custom Labels - Label attributes how you want to! ✓
- Attribute Ranks - Adding a rank to an attribute allows you to choose where they show up! ✓
(ex: User Profile, Registration, Both, etc...)
- Input Verification - Assign a verification type to your attribute/s for form inputs! ✓
- Default Values - Assign default values to your attributes! ✓
- Interface Design - Mod Devs, add user-defined attributes to any "thing" classes with ease! ✓
(A "thing" has attributes..items, users, etc...)
- Inventory System ⚠:
- Product Inventory
- Product Display and Search
- Service Inventory
- Service Display and Search
- Event System ⚠:
- Event Calendar
- Event Creation and Registration
- User Availability Schedules
- User Event Schedules
- Event Support: Users, Items, Locations
- Administrative Control Panel (ACP):
- System Settings ✓
- Default Time Zone ✓
- Disable - Enable reCAPTCHA feature ✓
-
Select - Deselect - Remove Styles ✓
(change entire website layout, look and content with 1 click!)
- User Management: ✓
- User Settings (Self-Edit) ✓
- Search - Create - Edit - Remove Users ✓
- Create - Edit - Remove Types(Groups) ✓
- Create - Edit - Remove Type(Group) Permissions ✓
- Create - Edit - Remove Statuses ✓
- Add - Remove Permission Access by User Type ✓
- Inventory Management ⚠
- Event Management ⚠
- Mod Support: ⚒
- Search (local) Mod Packages ✓
- Mod Package View ⚒
- Mod Package Installer ✓
- Mod Package Remover ⚒
- Mod Package Updater ⚒
- Programming Languages: PHP v5, SQL, HTML5, CSS3, JavaScript
- Server Platform: Hosted Server Running: Apache, PHP, and MySQL
- Tools Used: Notepad++, FileZilla, phpMyAdmin, Adobe Photoshop, Windows 7
- Browser Support: Internet Explorer, Fire Fox, Chrome


com.johnsnowlabs.nlp
Word Embeddings lookup annotator that maps tokens to vectors
See https://github.com/JohnSnowLabs/spark-nlp/blob/master/src/test/scala/com/johnsnowlabs/nlp/annotators/ner/NerConverterTest.scala for example usage of this API.
Word Embeddings lookup annotator that maps tokens to vectors
See https://github.com/JohnSnowLabs/spark-nlp/blob/master/src/test/scala/com/johnsnowlabs/nlp/annotators/ner/NerConverterTest.scala for example usage of this API.


My Tool Store
Title
Quantity
Price
Categories
Click here to add the deathstar to your inventory of tools
Click here to add inventory tools to your inventory of tools


Money Play. How should Red play 54?
pips Red=129 White=157
(CorrectAnswer= 0/0, ErrorScore= 0)
Over the board I played 13/4* without much thought, seeking to take advantage of a strong home board and sniffing a gammon in the air. However, one should be wary of such hits when there is only direct cover next turn.
It turns out that 24/15 is the better play. It escapes a rear checker and neatly duplicates White's 3's. In fact with virtually all 3's White should anchor rather than hit on his next roll.
If Red does hit he should do so with 8/4*, 8/3, preserving his mid-point. This is still an error while 13/4* is technically a blunder despite some duplication of 1's.
The gain in gammons from hitting doesn't compensate for the additional losses Red suffers after hitting. It goes to show that you can't just play on general theory – you have to examine the specifics of each position.
It turns out that 24/15 is the better play. It escapes a rear checker and neatly duplicates White's 3's. In fact with virtually all 3's White should anchor rather than hit on his next roll.
If Red does hit he should do so with 8/4*, 8/3, preserving his mid-point. This is still an error while 13/4* is technically a blunder despite some duplication of 1's.
The gain in gammons from hitting doesn't compensate for the additional losses Red suffers after hitting. It goes to show that you can't just play on general theory – you have to examine the specifics of each position.
1. Cubeful 2-ply 6/4*/3* Eq.: -0.093 0.540 0.168 0.005 - 0.460 0.136 0.006 2. Cubeful 2-ply 24/22 14/13 Eq.: -0.203 (-0.111) 0.486 0.093 0.002 - 0.514 0.139 0.003 3. Cubeful 2-ply 14/13 6/4* Eq.: -0.213 (-0.121) 0.492 0.125 0.003 - 0.508 0.155 0.007 4. Cubeful 2-ply 14/11 Eq.: -0.250 (-0.157) 0.470 0.106 0.003 - 0.530 0.149 0.005 5. Cubeful 2-ply 24/23 6/4* Eq.: -0.256 (-0.163) 0.486 0.126 0.005 - 0.514 0.179 0.009


The Reflect API could be described as a collection or “central place” which houses all kind of object and function related functions (for creation, property management etc.). Some of the functionalities added on the Reflect object where available before on the Object object.
The Reflect API provides useful methods to create, manipulate and query objects and functions in your JavaScript project.


Coming soon, go watch the demo.
A simple & lovely responsive CSS framework.
How to get involve :
- You can send me an email with suggestions, ideas, or just a sweet word.
- You can test the framework, and open new issues.
- You must the framework.
- You have to test the framework.
Existant stylesheets :
Needed stylesheets :
- If you've got ideas, mail me @ lucas.bonomi[at]gmail.com -
Features
- The framework use Normalize.css
- The grid system use Lemonade
- The framework use weloveiconfonts
Aim and Spirit
The goal of the framework is to bring the best of user interface modules, with simplicity. The spirit of the framework revolves around cleanliness, calm, Flat design & smooth visuals.
Use it
If you want to use EasUI right now.
Just add this line into the <head>
of your doc :
<link rel="stylesheet" type="text/css" href="http://easui.lucasbonomi.com/versions/1/1.3/easui-1.3.early.min.css">
Icons (entypo)
For make the web better, and beautiful, we decided to use WeLoveIconFonts, because its easy to use, and you don't have to download anything, everything is in the cloud and you can easily switch between all icons library .
We're working hard to make all the icons available, but for the demo and pre-releases, we will only use the Entypo icon font. To include icons into you page, just add this line before the framework inclusion :
<link rel="stylesheet" type="text/css" href="http://easui.lucasbonomi.com/versions/1/1.3/icons-easui-1.3.early.min.css">


--- layout: post title: Why WhatsApp Pay is lagging behind Paytm, Amazon, Google in India — Quartz India date: '2020-01-03T15:14:00.001+05:30' author: Sahil Rajput tags: modified_time: '2020-01-03T15:14:36.683+05:30' blogger_id: tag:blogger.com,1999:blog-5250005448924290719.post-6597342000706635207 blogger_orig_url: https://www.jaadujinn.ml/2020/01/why-whatsapp-pay-is-lagging-behind.html ---


Jussie Smollett: Chicago prosecution was malicious
CHICAGO - Former “Empire” actor Jussie Smollett says his $10,000 payment after the close of a criminal case should prevent Chicago from seeking reimbursement for a police investigation of his claim that he was a victim of a racist and homophobic attack.
Smollett’s attorneys filed a response Tuesday to Chicago’s lawsuit in federal court. They also filed a counterclaim against the city, saying Smollett was the victim of a malicious prosecution that caused humiliation and extreme distress.
Smollett told police he was beaten in January by two men who looped a noose around his neck. Chicago police said it was staged, and Smollett was charged with making a false report.
But prosecutors in March dropped the case. Smollett maintains his innocence but agreed to let authorities keep a $10,000 bail.


Realtime Chat App
First Name
Last Name
Email Address
Password
Select Image
Already signed up?
Login now


Honorius, immensely rich, reigned, and had only one son, whom he loved dearly. The fame of this emperor flew throughout the world, because he was honest and just in all things. But he waged a war against a king and devastated him. After that king sustained many attacks and endless damage from the emperor, he finally thought: "I have only one daughter and my enemy only one son. If I could somehow join my daughter to his son then I would obtain everlasting peace." He sent distinguished messengers to the emperor to ask him to grant at least a temporary truce so that he might speak with him in person. The emperor took counsel and granted a one year's truce. Indeed the king came to him in person and offered his own daughter for the other's son. But the emperor said: "I will not do this unless I have two things.  And the king said: "This pleases me well." A charter for the contract was sealed at once. The king bade the emperor farewell. Now when he had come to his own kingdom, he had a ship readied for the purpose of carrying his daughter across the sea to the emperor. When the ship was ready and every needed prepared, the maiden boarded with her rich dowery and five soldiers with ladies and maids. But while they were sailing across the sea a great whale rushed to meet them and tried to swallow the ship. When they saw this the sailors trembled with fear, and the maiden even more so. Indeed the sailors made a huge fire and stood guard day and night. But it fell out after three days that, exhausted from their vigil, they fell asleep. The whale suddenly swallowed the ship with all of its contents. The girl, when she understood that she was in the belly of a whale, cried out loudly. And the others were awoken by her cries. Indeed the sailors said to the maiden and the soldiers: "Dearest ones, take courage, God will save us; let us take good counsel, for we are in the belly of a whale." The maiden said: "Listen to my counsel and we will be saved." And they said: "Tell us." She said: "Let's light a large fire, and have someone injure the whale as deeply as possible and by these two things it will receive its death-blow and will at once float to land, and so by God's grace we will escape." Indeed they fulfilled the maiden's advice in every way. The whale sensed its death and headed for land. Hard by that beach there was a certain soldier stationed, who was taking an after-dinner amble along the seashore. So when he saw the whale floating hither and thither and approaching the land, he calls his servants and they dragged the whale to land. And they began to strike it with tools. The maiden, when she heard the noise spoke before them all and said: "Dearest, strike gently and open the flank of the whale; we here in its belly are the sons of good men of noble birth." The soldier, when he heard the voice of the maiden said to his servants: "Dearest, open the flank of the whale and let us see what might lie hidden within." Indeed when it was opened, the maiden came out first, more dead than alive, and then the soldiers and everyone else. She began to relate whose daughter she was, and that she was destined to be the wife of the emperor's son. On hearing this, the soldier kept her and her retinue with him for several days, until they had recovered their health. After that he sent the maiden with her gifts and her whole retinue to the emperor. The emperor, when he saw her, said: "Dearest daughter, may it go well with you now and forever. But I tell you daughter, before you have my son in holy matrimony, I will test you with a single deed." He immediately had three caskets made. The first was of pure gold and costly stones. And there was such an inscription upon the casket: "He who opens me, will find in me that which he deserves." And the whole casket was filled with the bones of the dead. The second was of pure silver, studded with gems from every part of the world, and which had this inscription: "He who chooses me, will find in me that which nature gives." This casket was filled with dirt. The third casket was of lead, having this inscription: "I choose to be here and to rest, rather than to remain in the king's treasury." In this casket were three precious rings. Then the emperor said to the maiden: "Dearest, here are three caskets; choose whichever one you will; and if you choose well, you will get my son in marriage." Indeed she closely considered the three caskets and said in her heart: "May God, who sees all, give me such grace to choose so that I might not fail of that for which I have worked so hard." And she touched the first casket and read the writing: "He who," etc. She thought: "The casket is outwardly precious, but I know not what might be hidden within it, likewise I am unwilling to choose it." Next she read the second. And she said: "Never did nature give that my father's daughter ought to be joined to the emperor's son." And likewise, etc. The third casket she read, saying: "It is better to me to rest with the son of a king than in my father's treasury." And in a loud voice she cried: "I choose this third casket." The emperor, when he heard, said: "O noble maiden, you have chosen wisely enough. In this casket are my three precious rings; one for me, one for my son, and the third for you in a sign of betrothal." He had the nuptials celebrated at once, and delivered his son to her, and so they finished their lives in peace.
The moral. Dearly beloved, the emperor is God who has long waged war with mankind, in so much as the entire human nature was destroyed through sin. In this way the truce was sent to us through the Lord, that is, Christ. The daughter, who was destined to be betrothed to the son of the emperor, is the soul. Therefore it is right for the ship to be prepared for her with messengers, that is, the body in which the soul resides with the five senses and so forth, the sailors are reason, will, etc. But it is fit to cross the sea, that is, the world. The great whale is the devil, against whom we need to be vigilant. But if it befalls us to fall asleep in our sins then he wil swallow us, body and soul. And so, do as the maiden did; light the fire of devotion and strike with tools, that is, good works, until he withdraws and lets slip his power over you. Then serve the soldiers, that is, the preachers and confessors, who have to strike him, until the maiden, that is, the soul, leaves his power and comes to the court of God. But we must understand what the three caskets represent to her. From the first casket we can understand the power and riches that have such an inscription, that is, when the body and soul are divided, God finds nothing in me but the sins that I have earned, at which we must suffer; woe to those who choose this one. From the second it is understood the sages of the world, whose speeches glitter like silver and on the inside are filled with earthly matters, with such an inscription: "He who chooses me," etc. Nature always seeks after the soul's opposite and those are not wed to Christ. From the third casket are choosen good christians, who are made of lead, that is, that they do not worry about any worldly thing; in which are three rings, of course, faith, hope and charity; he who chooses these, can have the son of God more gladly than to remain in the treasury of the world. Let us so strive.


Acknowledgments
- We are grateful to many open source softwares available, including but not limited to:
RDKit (https://rdkit.org/):
Constrained Embedding - Joshua Meyers’ Notebook, Tim Dudgeon example
Grafting, Peter Schmidtke
OpenMM (https://openmm.org/)
Open Force Field foundation packages (https://openforcefield.org/)
mols2grid (https://mols2grid.readthedocs.io/)
Prody (http://prody.csb.pitt.edu/)
TeachOpenCADD (https://projects.volkamerlab.org/teachopencadd/)
OpenChemistry (https://www.openchemistry.org/, molecules as R-groups)
Py3Dmol (https://github.com/3dmol/3Dmol.js)
PDBFixer (https://github.com/openmm/pdbfixer)
PyTorch (https://pytorch.org/)
openmmforcefields (https://github.com/openmm/openmmforcefields)
openmm-torch (https://github.com/openmm/openmm-torch)
parmed (https://www.parmed.com/)
OpenBabel (https://openbabel.org/)
torchani (https://aiqm.github.io/torchani/)
Please cite the packages accordingly.


RazorBlade ChangeLog
Version 4
Version 4.0 (2022-12)
- Created a new interface
IHtmlTag
which is supported by all generated code, and ensures you have methods such asAdd(...)
orWrap(...)
when using any tag generically.
It is available onToSic.Razor.Blade
so you don't need to add more namespaces - Create a new
ToSic.Razor.Blade.IHtmlTagService
which provides the same functionality as the staticBlade.Tag
API, but with immutable objects (see below) - All generated tags like
Div
,H2
etc. can now be immutable.- The existing
ToSic.Razor.Blade.Tag.TAGNAME(...)
apis continue to deliver mutable objects (like before) - The new
IHtmlTagService
provides immutable objects. This can lead to surprising effects when migrating existing code, so that should best continue to use the oldBlade.Tag...
- The existing
- .net Core build now requires .net6 (previously .net5)
- Removed the
StartUp.RegisterToJson(...)
method which was used at StartUp in special cases to register alternate json-serializer - The
AttributeOptions
andTagOptions
were made read-only for reliable fluid / immutable APIs. This is kind of a breaking change but we believe it won't affect anybody. since it was basically an internal API which nobody used outside of this. - Changed minimum requirement on
Razor.Blade.Dnn
to be DNN 9.6.1
Version 3
Version 3.0 (2019-10-21)
Released V3 which was a complete rework and had a new root namespace.
- Created website with full API documentation Razor-Blade.net
- Created all Html5 tags and quick-accessor using Tag.xxx
Breaking Changes
We really hate to introduce breaking changes, but 3.0 was a good opportunity for this.
- Renamed everything to use the namespace
ToSic.Razor.Blade
from previouslyConnect.Razor.Blade
. This was improtant, because we decided to release RazorBlade as a NuGet package, and the previous namespaceConnect
didn't make any sense. - Renamed the DLL to be in-line with the changes, which also means that previous code still works, because the new namespace can run side-by-side with the previous one
- Reorganized some internal APIs, so they won't disturb in public documentation
- Modified the
Text.First()
method so it could now take an unlimited amount of strings to pick the first one. - Moved primary repo in Github to 2sic
V3.01 2019-12
Minor fixes / changes which required a version bump.
V3.02 2020-04
- Added Tags.SafeUrl()
V3.03 - V3.06 2021
- Added support for .net 5 and Oqtane
- Deprecating support for the
HtmlPage
because it won't work in .net core
V3.07 2021-09
- Created
Tag.RawHtml(...)
Tag.Attr(...)
now can also accept ITag values like prepared attributes- Various null-checks/bugfixes
- Operators to enable adding Tags like
Tag.P() + Tag.Div()
- Adding tag contents with IEnumerable (previously only Arrays worked)
- Fix Json serialization for Oqtane (previously internal ToJson only worked in .net 451)
- Will probably be bundled with 2sxc 12.05
- Removed the
IHtmlPage
interface from the docs as it shouldn't be used any more
V3.08 2022-01
- Improved
Tag.Custom(...)
andTag.RawHtml(...)
V3.09 2022-02
- Added new IScrub system and ca. 100 unit tests
- Implemented DI support
- Added
Text.After(...)
- Added
Text.AfterLast(...)
- Added
Text.Before(...)
- Added
Text.BeforeLast(...)
- Added
Text.Between(...)
V3.10 2022-02
- Minor bugfixes and clean-up of tests
Version 2
Version 2.02 (2019-10-15)
- Improved the
Add
andWrap
on the fluid API AddIconSet(...)
now defaults to using the provided image as the favicon
Version 02.01 (2019-10-14)
HtmlPage
gotAddIcon
andAddIconSet
- see tutorial
Version 2.00 (2019-04-09)
- Released first draft of Fluent Tag API which was later brought to final in 3.0
Version 1
Version 1.02 (2019-04-05)
- Created draft
HtmlTags
API - which was later completed in 3.0
Version 1.01 (2019-02-27)
- Created
HtmlPage
API to read/write DNN header properties and add all kind of headers
Version 1.00 (2019-02-17)
- Released RazorBlade
- Created
Text...
andTags...
API - Released it as a DNN Extension Library on Github