My Experience Writing a Build System
Lately there’s been some interest in build processes among various people — Vellum was announced a while back, Ben has been looking for a tool and looking at Fabric, and Kevin announced Paver. At the same time zc.buildout is starting to gain some users outside of the Zope world, and I noticed Minitage as an abstraction on top of zc.buildout.
A while ago I started working on a build project for Open Plans called fassembler. I think the result has been fairly successful and maintainable, and I thought I’d share some of my own reflections on that tool.
Update: what we were trying to accomplish
I didn’t make it clear in the post just what we were trying to do, and what this build system would accomplish.
Our site (openplans.org) is made up of several separate servers with an HTML-rewriting proxy on the front end. We have a Zope server running a custom application, Apache running WordPress MU, and some servers running Pylons or other Python web applications for portions of our site. We needed a way to consistently reproduce this entire stack, all the pieces, plugged together so that the site would actually work. Two equally important places where we had to reproduce the stack are for developer rigs and the production site.
Our code is primarily Python and we use a lot of libraries, developed both internally and externally. Setting up the site is primarily a matter of installing the right libraries and configuration and setting up any databases (both a ZODB databases and several MySQL databases). We use a few libraries written in C, but distutils handles the compilation of those pretty transparently.
For this case we really don’t care about build tools that focus on compilation. We don’t care about careful dependency tracking because we are compiling very little software.
make doesn’t make sense
Update 2: If you think the make model makes lots of sense, read the preceding section — it makes sense for a different problem set than what we’re doing.
We initially had a system based on BuildIt, which is kind of like make with Python as the control code. It wasn’t really a good basis for our build tool, and I think it added a lot of confusion, compounded by the fact that we weren’t quite sure what we wanted our build to do. Ultimately I think the make model of building doesn’t make sense.
The make model is based on the idea that you really want to save work. So you detect changes and remake things only as necessary. For compilation this might make sense, because you edit code and recompile a lot and it’s tedious to wait. But we are building a website, and installing software, and none of that style of efficiency matters. make-style detection of work to be done doesn’t even save any time. But it does make the build more fragile (e.g., if you define a dependency incorrectly) and much harder to understand, and you constantly find yourself wiping the build and starting from scratch because you don’t trust the system.
The metaphor for the new build system was much simpler: do a list of things, top to bottom. There’s no effort into detecting changes in the build, or changes in the settings, or anything else.
Do things carefully
In the build system almost all actions go through the filemaker module. This is kind of a file abstraction library. But the goals are entirely different than convenience: the goal is transparency and safety. In contrast Paver uses path.py for convenience, but I’m not sure what the win would be if we used a model like that.
filemaker itself is heavily tied to the framework that it’s written for, specifically user interaction and logging. Most tasks just do things, and rely on filemaker to detect problems and ask the user questions. For example, every time a file is written, it checks if the file exists, and if it has the same content. If it exists with other content, it asks the user about what to do. It doesn’t overwrites files without asking (at least by default). I think this makes the tool more humane as the default behavior for a build is to be careful and transparent. The build author has to go out of their way to make things difficult.
Many zc.buildout recipes will blithely overwrite all sorts of files which always made me very uncomfortable with the product. It’s the recipes in zc.buildout which do this, not the buildout framework itself, but because buildout made overwriting the easy thing to do, and didn’t start with humane conventions or tools, this behavior is the norm.
What I think filemaker most accomplished was the ability to do file operations while also asserting the expected state of the system, and so makes build bugs noticeable earlier instead of getting a build process that finishes successfully but creates a buggy build, or having an exception show up far from where the error was originally introduced.
Also, because it won’t overwrite your work in progress this has saved the build from engendering deep feelings of hatred in cases when it might overwrite your work in progress. It’s hard to detect this absence of hatred, but I know that I’ve felt it with other systems.
Update: a corollary: ignore no errors
One question you might wonder about: why not a shell script? We did prototype some things as shell scripts, but we’ve consistently moved to Python at some point, even things that seemed really trivial. The problem with shell scripts is they have horribly bad behavior with respect to errors. Ignoring errors is really really easy, noticing errors is really hard.
This is absolutely unacceptable for builds. Builds must not ignore errors. The build may mostly work despite an error. It might be totally broken, but the error message is lost in all sorts of useless output. The error message probably makes no sense. The context is lost. No suggestion is given to the user.
When builds work, that’s great. Build do not always work. They always fail sometimes, and some poor sucker (usually in some hot potato-like arrangement) has to figure out what went wrong. You have to plan for these problems.
Everything in the build tries to be careful about errors. All places where it is not, it is a bug. The resolution isn’t to see something appear to work, but create a broken build, and say "oh, you forgot to set X". The resolution is to make sure when you forget to set X it gives you an error that tells you to set X.
This is one of the more important and more often ignored principles of a good build/deployment system. Maybe it’s gotten better, but when I first used zc.buildout (very early in its development) the poor handling of errors was by far the biggest problem and it left me with a bad taste in my mouth. easy_install and setuptools in general is also very flawed in this respect.
Log interesting things
I tried to make a compromise between logging very verbosely, and being too quiet. As a user, I want to see everything interesting and leave out everything boring. Determining interesting and boring can be a bit difficult, but really just require some attention and tweaking.
To make it possible to visually parse the output of the tool I found both indentation and color to be very useful. Indentation is used to represent subtasks, and color to make sections and warnings stand out.
The default verbosity setting is not to be completely quiet. Silence is a Unix convention that just doesn’t work for build tools. Silence gets you interactions like this:
$ build-something target-directory/
(much time passes)
Error: cannot write /home/ianb/builds/20080426/target-directory/products/AuxInput/auxinput/config/configuration.xml
Why did it want to write that file? Why can’t it write that file? Is the build buggy? Did I misconfigure it? Does the directory exist?
The typical way of handling this is either to run the build again with logging setup or otherwise make it more verbose, or to get in the habit of always running it verbose.
Mixing code and configuration
BuildIt, which we were using before, had the ability to put variables in settings, and you could read an option from another section with something like ${section/option}. It was limited to simple (but recursive) variable substitution, and had some clever but very confusing rules that created a kind of inheritance.
I liked the ability to do substitution, but wasn’t happy with the compromise BuildIt made. I wasted a lot of time trying to figure out the context of substitutions. So, I saw two directions. One was to remove the cleverness and just do simple substitution. This is the choice zc.buildout made. The other was to go whole-hog. With a bit of trepidation I decided to to go for it, and I made the choice to treat all configuration settings as Tempita templates. All configuration is generally accessed via config.setting_name, and that lazily interpolates the setting (it took me quite a while to figure out how to avoid infinite loops of substitution). Because evaluation is done lazily settings can depend on each other and be overridden and have lots of code in defaults (e.g., a default that is calculated based on the value of another setting), and it works out okay. Most settings just ended up having a smart default, and as a result very little tweaking of the configuration is necessary.
Somewhat ironically the result was a kind of atrophying of the settings, because no one actually set them, instead we just tweaked the defaults to get it right. Now I’m not entirely sure what exactly the "settings" are setting, or who they should really belong to. To the build? To the tasks? While this is conceptually confusing, in practice it isn’t so bad. This mixing of code and configuration has been distinctly useful, and not nearly as problematic to debug as I worried it would be. In some ways it was a way of building lambda into every string, and the lazy evaluation of those strings has been really important. But it’s not clear if they are really settings.
Would normal string interpolation have been enough (e.g., with string.Template)? I’m pretty sure it wouldn’t have been. The ability to do a little math or use functions that read things from the environment has been very important.
Managing Python libraries
fassembler uses virtualenv for building each piece of the stack. Generally it creates several environments and installs things into them — it doesn’t run inside the environments itself. This works fine.
zc.buildout in comparison does some fancy stuff to scripts where specific eggs are enabled when you run a script. Each script has a list of all the eggs to enable. You can’t install things or manage anything manually, even to test — you always have to go through buildout, and it will regenerate the scripts for you. zc.buildout was implemented at the same time as workingenv (the predecessor to virtualenv), and I actually finished virtualenv with fassembler in mind, so I can’t blame zc.buildout for not using virtualenv. That said, I don’t think the zc.buildout system makes any sense. And it’s really complicated and has to access all sorts of not-really-public parts of easy_install to work.
Isolation is only the start. easy_install makes sure each library’s claimed dependencies are satisfied. You might then think easy_install would do all the work to make the stack work. It is nowhere close to making the stack work. setup.py files can/should contain the bare minimum that is known to be necessary to make a package work. But they can’t predict future incompatibilities, and they can’t predict interactions. And you don’t want all your packages changing versions arbitrarily. If you work with a lot of libraries you need those libraries to be pinned, and only update them when you want to update them, not just because an update has been released.
So for each piece of the stack we have a set of "requirements". This is a flat files that indicates all the packages to install. They can have explicit versions, far more restrictive than anything you should put in setup.py. It also can check out from svn, including pinning to revisions. This installation plan can go in svn, you can do diffs on it, you can branch and copy and do whatever. Maybe at some point we could use it to keep cached copies of the libraries. For now it mostly uses easy_install (and python setup.py develop for checkouts).
In parallel we have a command-line program for just installing packages using files like this, called PoachEggs. I want to make this better, and have fassembler use it, but I mostly note it because it implements a feature that can "freeze" all your packages to a requirements file. You take a working build and freeze its requirements, giving explicit (==) versions for packages, and pin all the svn checkouts to a revision, so that the frozen requirements file will install exactly the packages you know work.
An alternative to this is what the Repoze guys are doing, which is to create a custom index that only includes the versions of libraries that you want. You then tell easy_install to use this instead of PyPI. It works with zc.buildout (and anything that uses easy_install), but I can’t get excited about it compared to a simple text file. I also want svn checkouts instead of create tarballs of the checkout — I like an editable environment, because the build is just as much to support developers as to support deployment.
The structure
A big part of the development of fassembler was nailing down the structure of our site, and moving to use tools like supervisor to manage our processes. A lot of these expectations are built into the builds and fassembler itself. This is part of what makes the build Work — the pieces all conform to a common structure with some basic standards. But this isn’t the build tool itself, it’s just a set of conventions.
I don’t know quite what to make of this. Extracting the conventions from the builds leads to a situation where you can more easily misconfigure things, and the installation process ends up being more documentation-based instead of code-based. We do not want to rely on documentation, because documentation is generally because of a flaw in the build process that needs explaining. It’s faster for everyone if the code is just right. Maybe these conventions could be put into code, separate from the build. The abstraction worries me, though — too much to keep track of?
What we don’t get right
The biggest problem is that fassembler is our own system and no one else uses it. If someone wants to use just a piece of our stack they either have to build it manually or they have to use our system which is meant to build all our pieces together with our conventions. There’s some pressure to use zc.buildout to make pieces more accessible to other Zope users. We’ve also found things that build with zc.buildout that we’d like to use (e.g., setups for varnish).
We haven’t figured out how to separate the code for building our stuff from the build software itself. There’s a bootstrapping problem: you need to get the build code to build a project, and so it can’t be part of the project you are building. zc.buildout uses configuration files (that aren’t code, so they lack the bootstrap problem) and it uses recipes (a kind of plugin) and has gone to quite a bit of effort to bootstrap everything. virtualenv also supports a kind of bootstrap which we use to do the initial setup of the environment, but it doesn’t support code organization in the style of zc.buildout.
Builds are also fairly tedious to write. They aren’t horrible, but they feel much longer than they should be. Part of their length, though, is that over time we put in more code to guard against environment differences or build errors, and more code to detect the environment. But compared to zc.buildout’s configuration files, it doesn’t feel quite as nice, and if it’s not as nice sometimes people are lazy and do ad hoc setups.
The future
We haven’t really decided, but as you might have noticed zc.buildout gets a lot of attention here. There’s quite a few things I don’t like about it, but a lot of these have to do with the recipes available. We don’t have to use the standard zc.buildout egg installation recipe. In fact that would be first on the chopping block, replaced with something much simpler that assumes you are running inside a virtualenv environment, and probably something that uses requirement files.
Also, we could extract filemaker into a library and recipes could use that. Possibly logging could be handled the same way (the logging module just isn’t designed for an interactive experience like a build tool). Then if we used other people’s recipes we might feel grumpy, since they’d use neither filemaker or our logging, but it would still work. And our recipes would be full of awesome. The one thing I don’t think we could do is introduce the template-based configuration. Or, if we did, it would be hard.
That said, there is a very different direction we could go, one inspired more by App Engine. In that model we build files under a directory, and that directory is the build. Wherever you build, you get the same files, period. All paths would be relative. All environmental detection would happen in code at runtime. Things that aren’t "files" exactly would simply be standard scripts. E.g., database setup would not be done by the build, but would be a script put in a standard location.
This second file-based model of building is very much different than the principles behind zc.buildout. zc.buildout requires rebuilding when anything changes, and does so without apology. It requires rebuilding to move the directories, or to move to different machines. Using a file-based model requires a lot of push-back into the products themselves. Applications have to be patched to accept smart relative paths. They have to manage themselves a lot more, detect their environment, handle any conflicts or ambiguities, being graceful about stuff like databases, because the files have to be universal. In an extreme case I could imagine going so far as to only keep a template for a configuration file, and write the real configuration file to a temporary location before starting a server (if the server cannot be patched to accept runtime location information).
So this is the choice ahead. I’m not sure when we’ll make this choice (if ever!) — build systems are dull and somewhat annoying, but they are no more dull and annoying than dealing with a poor build system. Actually, they are definitely less dull than working with a build system that isn’t good enough or powerful enough, or one that simply lacks the TLC necessary to keep builds working. So no choice is a choice too, and maybe a bad choice.


VFILES & FILA Team Up for Colorful Tennis-Inspired Capsule Collection
Available on Foot Locker’s Greenhouse app.
by Gabrielle LeungVFILES and FILA are teaming up for a new capsule of sportswear-inspired apparel and a range of playful footwear. The latest collection marks the brands’ first collaboration for Greenhouse, Foot Locker’s new incubator that works with designers and creators to develop limited-edition products.
Drawing from tennis aesthetics, the VFILES x FILA apparel selection includes tracksuits, form-fitting dresses, long sleeves, cropped tees and shorts. Signature FILA designs and silhouettes are combined with VFILES’ vibrant pops of color for a range of retro-style looks. Tracksuits sport bold color blocking, while co-branded long sleeves are paired with matching shorts. An interlocking tennis ball graphic ties the collection together.
The footwear options feature four variations of the FILA Tennis 88. Continuing with the collection’s racket sport inspirations, one version of the shoe is informed by a bright green colorway crafted in a fabric resembling a tennis ball. The three additional sneakers boast pink, yellow and blue hues to complement the apparel selection. Embroidered VFILES logos decorate the heels, while a dual-branded logo is found on the tongue. Sock liners accented with the tennis ball motif give the sneakers a custom finish.
Take a look at the VFILES x FILA lookbook in the gallery above. The entire collection is available to purchase now on the NTWRK and Greenhouse app. Beginning November 22, the items will be available at select Foot Locker stores in the U.S., EU, Canada and Australia.
Elsewhere, HUMAN MADE pays homage to Star Trak with a collaborative apparel collection.


Anguilla
Antigua and Barbuda
Argentina
Aruba
Bahamas
Barbados
Belize
Bermuda
Bolivia, Plurinational State of
Brazil
Canada
Cayman Islands
Chile
Colombia
Costa Rica
Cuba
Dominica
Dominican Republic
Ecuador
El Salvador
Falkland Islands (Malvinas)
French Guiana
Greenland
Grenada
Guadeloupe
Guatemala
Guyana
Haiti
Honduras
Jamaica
Martinique
Mexico
Montserrat
Netherlands Antilles
Nicaragua
Panama
Paraguay
Peru
Puerto Rico
Saint Kitts and Nevis
Saint Lucia
Saint Pierre and Miquelon
Saint Vincent and the Grenadines
Suriname
Trinidad and Tobago
Turks and Caicos Islands
United States
Uruguay
Venezuela, Bolivarian Republic of
Virgin Islands, British
Virgin Islands, U.S.
Albania
Andorra
Austria
Belarus
Belgium
Bosnia and Herzegovina
Bulgaria
Croatia
Czech Republic
Denmark
Estonia
Faroe Islands
Finland
France
Germany
Gibraltar
Greece
Holy See (Vatican City State)
Hungary
Iceland
Ireland
Italy
Latvia
Liechtenstein
Lithuania
Luxembourg
Macedonia, The Former Yugoslav Republic of
Malta
Moldova, Republic of
Monaco
Montenegro
Netherlands
Norway
Poland
Portugal
Romania
Russian Federation
San Marino
Serbia
Slovakia
Slovenia
Spain
Sweden
Switzerland
Ukraine
United Kingdom
Afghanistan
Armenia
Azerbaijan
Bahrain
Bangladesh
Bhutan
Brunei Darussalam
Cambodia
China
Cyprus
Georgia
Hong Kong
India
Indonesia
Iran, Islamic Republic of
Iraq
Israel
Japan
Jordan
Kazakhstan
Korea, Democratic People's Republic of
Korea, Republic of
Kuwait
Kyrgyzstan
Lao People's Democratic Republic
Lebanon
Macao
Malaysia
Maldives
Mongolia
Myanmar
Nepal
Oman
Pakistan
Palestinian Territory, Occupied
Philippines
Qatar
Saudi Arabia
Singapore
Sri Lanka
Syrian Arab Republic
Taiwan, Province of China
Tajikistan
Thailand
Timor-Leste
Turkey
Turkmenistan
United Arab Emirates
Uzbekistan
Viet Nam
Yemen
American Samoa
Australia
Cook Islands
Fiji
French Polynesia
Guam
Kiribati
Marshall Islands
Micronesia, Federated States of
Nauru
New Caledonia
New Zealand
Niue
Norfolk Island
Northern Mariana Islands
Palau
Papua New Guinea
Pitcairn
Samoa
Solomon Islands
Tokelau
Tonga
Tuvalu
Vanuatu
Wallis and Futuna
Algeria
Angola
Benin
Botswana
Burkina Faso
Burundi
Cameroon
Cape Verde
Central African Republic
Chad
Comoros
Congo
Congo, The Democratic Republic of the
Côte d'Ivoire
Djibouti
Egypt
Equatorial Guinea
Eritrea
Ethiopia
Gabon
Gambia
Ghana
Guinea
Guinea-Bissau
Kenya
Lesotho
Liberia
Libya
Madagascar
Malawi
Mali
Mauritania
Mauritius
Mayotte
Morocco
Mozambique
Namibia
Niger
Nigeria
Rwanda
Réunion
Saint Helena
Sao Tome and Principe
Senegal
Seychelles
Sierra Leone
Somalia
South Africa
Sudan
Swaziland
Tanzania
Togo
Tunisia
Uganda
Western Sahara
Zambia
Zimbabwe
Bouvet Island
British Indian Ocean Territory
England
European Union
French Southern Territories
Heard Island and McDonald Islands
Scotland
South Georgia and the South Sandwich Islands
United States Minor Outlying Islands
Wales
Usage:
<img src="assets/images/flags/us.png" alt="United States" />
Output:
Note: Click the icon to copy the image name


After much thinking and wondering around through many solutions I opted for the following stack:
- Webbynode
- Nginx
- Wordpress
- Svbtle
I already had a Webbynode account and this was an easy choice.
My Webby is actually configured with nginx which is also my default webserver for rails deployments: another easy choice.
I fell in love with svbtle layout and administrative interface because I find it very clean and relaxing like the IA Writer I use in my iPad. But svbtle is a closed bunch of geniuses and I’m not that kind of boy, so I began searching for a solution.
There is obtvse a svbtle rails clone but I preferred a solid and rich blogging platform as WordPress for which I already bought some components which will help me quickly setup landing pages and the likes.
So I ended up with wp-svbtle which is an open source template for WordPress.
An so ended the quest of choosing the building blocks.
To deploy an application with RAPP (Rapid Apps) I use the webbynode ruby gem which needs to be a git repo.
So I forked the WordPress git repository on my account and cloned it locally I then initiated the webbynode rapp with a PHP engine and pushed it on my webby and use the change_dns command to point it to my thinkingco.de domain.
The init and push commands take also care of setting up a mysql database and password with the name of your app. But I found myself in need to setup the password for the user and grant him access to the database:
$ mysql -u root -pmy-root-mysql-password
mysql> grant all on app_db_name.* to 'app_user_name'@localhost identified by 'app_user_mysql_password';
Then I pointed my browser to thinkingco.de and inserted the configuration data in the wordpress wp-config.php.
Now I wanted a way to easily install plugins and update wordpress itself so I needed to install the php ssh library:
$ sudo apt-get install libssh2-php
$ sudo /etc/init.d/nginx restart
Then I updated the wp-config.php file adding the following lines:
define('FS_METHOD', 'direct'); // 'ssh' is also an option, but did not work for my setup
define('FTP_BASE', '/opt/local/nginx/html/domain.com/');
define('FTP_CONTENT_DIR', '/opt/local/nginx/html/domain.com/wp- content/');
define('FTP_PLUGIN_DIR ', '/opt/local/nginx/html/domain.com/wp-content/plugins/');
define('FTP_PUBKEY', '/home/username/.ssh/id_rsa.pub');
define('FTP_PRIKEY', '/home/username/.ssh/id_rsa');
define('FTP_USER', 'username');
define('FTP_HOST', 'your-domain.com:22');
Now my wordpress site was able to install plugins/themes or update itself. You could need to update permissions for wordpress files:
$ chown -R www-data /your/wordpress/app
$ chmod g+x /your/wordpress/app
After installing each single plugin I ssh into my webby and from there push back to my github forked repo this keeping my fork updated.
One last thing is to be able to use pretty urls without using rewrite rules in nginx this can be achieved with the try_files code line:
location / {
root /your/app/root;
index index.php index.html index.htm;
try_files $uri $uri/ /index.php;
}
So now you know how this website is built, all the process was quite straightforward and I’m happy with the result.


--- --- {% include header.html %}
{% include navbar.html %} {% include loader.html %} {% include profile.html %} {% include aboutUs.html %} {% include description.html %} {% include leaderboard.html %} {% include projects.html %} {% include map.html %}


Posted by Cai on July 28, 2019
Posted by Cai on July 10, 2019
Posted by Cai on July 7, 2019
Posted by Cai on July 3, 2019
Posted by Cai on July 1, 2019
Posted by Cai on June 25, 2019
Posted by Cai on June 17, 2019
Posted by Cai on June 13, 2019
Posted by Cai on June 12, 2019
猴哥牛逼


--- date: 2011-03-16T00:00:00Z published: true title: An Atomic Rant « Nate Wiger vs Software | Race conditions aren't very fun. url: /2011/03/16/an-atomic-rant-nate-wiger-vs-software-race-conditions-aren-t-very-fun-/ ---
Bottom line: Any operation that can alter a value must return that value in the same operation for it to be atomic. If you do a separate get then set, or set then get, you’re open to a race condition. There are very few systems that support an “increment and return” type operation, and Redis is one of them (Oracle sequences are another).


---
layout: post
title: Very VERY basic Vagrant commands for a n00b
date: '2015-01-09T21:56:00.000-08:00'
author: Mark J. Lehman
tags:
- devops
- vagrant
modified_time: '2015-08-21T10:10:31.413-07:00'
blogger_id: tag:blogger.com,1999:blog-4459370175540830177.post-8524462744973268571
blogger_orig_url: http://spaghettirefactory.blogspot.com/2015/01/very-very-basic-vagrant-commands-for.html
---
This is nothing that can't easily be found in the docs, but it was new to me:
vagrant up
This uses a Vagrantfile to start up a virtual machine (such as starting up an Ubuntu environment using VirtualBox)
vagrant ssh
This will SSH into the virtual machine, but first you need to ensure that SSH keys are configured properly. These can be passed in by setting this in the Vagrantfile:
config.ssh.forward_agent = true


Japan space probe on its way back after asteroid mission
After collecting sub-surface samples that could help scientists seeking the origins of life.
by Staff WriterA Japanese space probe is heading home from an asteroid 250 million km from Earth after collecting sub-surface samples that could help scientists seeking the origins of life, Japan's space agency said on Monday.
Asteroids are believed to have formed at the dawn of the solar system and scientists say the asteroid, called Ryugu, may contain organic matter that may have contributed to life on Earth.
If the return trip is completed successfully, that will be the first time samples from beneath an asteroid's surface have been brought back to Earth, a spokeswoman for the Japan Aerospace Exploration Agency, or JAXA, said.
The unmanned Hayabusa 2, named after a falcon, began leaving Ryugu last week, but it is still sending images back to Earth.
Those observations will be wrapped up on Monday or Tuesday before its main engine is activated for the year-long flight, JAXA said.
"This is us bidding farewell to Ryugu," the spokeswoman said.
Hayabusa 2 is scheduled to return to Earth by the end of 2020. After dropping off a capsule containing the samples, without landing, the probe itself will keep on going and fly away into space, finishing its six-year, 29 billion yen (US$266 million) mission.
($1 = 109.1000 yen)


Terms and conditions
Personal Information
“HelloDr” is the registered trademark of Check Health Private Limited, a company incorporated under the Companies Act, 1956 with its registered office at Seva Nagar, Gandhi Salai, Velachery, Chennai - 600 042. The domain name www.hellodr.net is owned by the Company.
All visitors to www.hellodr.net (Site) are advised to read and understand the Terms of Use carefully, as by accessing the Site you agree to be bound by the same.
If you do not agree with the Terms of Use of the Site , please do not use or access the Site. As such your access or use of the Site implies your acceptance of the said terms of use, as amended from time to time, and constitutes an agreement between you and the Company (User Agreement).
This document is published in accordance with the provisions of Rule 3(1) of the Information Technology (Intermediaries Guidelines) Rules, 2011. The Terms of Use herein are subject to change from time to time by the Company without notice. It is strongly recommended that you periodically review the Terms of Use as available on the Application.
The terms ‘visitor’, ‘user’, ‘you’ hereunder refer to the person visiting, accessing, browsing through and/or using the Site at any point in time.
Should you have any clarifications regarding the Terms of Use, please do not hesitate to contact us at<EMAIL_ADDRESS>Services Overview
As part of the registration process on the Site, the Company may collect the following personally identifiable information about you: Name - including first and last name, email address, mobile phone number and other contact details, demographic profile (like your age, gender, occupation, education, address etc.) and information about the pages on the Site you visit/access, the links you click on the Site, the number of times you access a particular page/feature and any such information. Information collected about you is subject to the Privacy Policy of the Company which is incorporated in these Terms of Use by reference.
Eligibility
Services on the Site would be available to only select geographies in India. Persons who are “incompetent to contract” within the meaning of the Indian Contract Act, 1872 including minors, un-discharged insolvents etc. are not eligible to use the Site.However, if you are a minor, i.e. under the age of 18 years, you may use the Site under the supervision of a parent or legal guardian who agrees to be bound by these Terms of Use. You are prohibited from purchasing any material which is for adult consumption, the sale of which to minors is prohibited. The Company reserves the right to terminate or refuse your registration, or refuse to permit access to the Site, if it is discovered or brought to its notice that you are a minor.
License and Access
The Company grants you a limited sub-license to access and make personal use of the Site, but not to download (other than page caching) or modify it, or any portion of it, except with express written consent of the Company. Such limited sub- license does not include/permit any resale or commercial use of the Site or its contents; any collection and use of any product listings, descriptions, or prices; any derivative use of the Site or its contents; any downloading or copying of information for the benefit of another merchant; or any use of data mining, robots, or similar data gathering and extraction tools. The Application or any portion of the Site may not be reproduced, duplicated, copied, sold, resold, visited, or otherwise exploited for any commercial purpose without express written consent of the Company. You may not frame or utilize framing techniques to enclose any trademark, logo, or other proprietary information (including images, text, page layout, or form) of the Application or of the Company and/or its affiliates without the express written consent of the Company. You may not use any meta tags or any other “hidden text” utilizing the Company’s name or trademarks without the express written consent of the Company. You shall not attempt to gain unauthorized access to any portion or feature of the Site, or any other systems or networks connected to the Site or to any server, computer, network, or to any of the services offered on or through the Site, by hacking, ‘password mining’ or any other illegitimate means.
You hereby agree and undertake not to host, display, upload, modify, publish, transmit, update or share any information:
Account & Registration Obligations
All users have to register and login for interacting on the Site. You must keep your account and registration details current and correct for communications related to your interactions with the Site. By agreeing to the Terms of Use, the user agrees to receive promotional communication and newsletters from the Company and its partners. The user can opt out from such communication and/or newsletters either by unsubscribing on the Site itself, or by contacting the customer services team and placing a request for unsubscribing.
You Agree and Confirm
Reviews, Feedback, Submissions
All reviews, comments, feedback, suggestions, ideas, and other submissions disclosed, submitted or offered on the Site or otherwise disclosed, submitted or offered in connection with use of the Site (collectively, the Comments) shall be and remain the property of the Company. Such disclosure, submission or offer of any Comments shall constitute an assignment to the Company of all worldwide rights, titles and interests in all copyrights and other intellectual properties in the Comments. Thus, the Company shall exclusively own all such rights, titles and interests in the Comments and shall not be limited in any way in its use, commercial or otherwise.
The Company will be entitled to use, reproduce, disclose, modify, adapt, create derivative works from any Comments, and publish, display and distribute any Comments submitted for any purpose whatsoever without restriction and without compensating the user in any way. The Company is and shall be under no obligation to: (i) maintain any Comments in confidence; or (ii) pay compensation for any Comments; or (iii) respond to any Comments. You agree that any Comments submitted by you on the Site will not violate the Terms of Use or any right of any third party, including copyright, trademark, privacy or other personal or proprietary right(s), and will not cause injury to any person or entity. You further agree that no Comments submitted by you on the Site will be or contain libellous or otherwise unlawful, threatening, abusive or obscene material, or contain software viruses, political campaigning, commercial solicitation, chain letters, mass mails or any form of ‘spam’. The Company does reserve the right (but assumes no obligation) to monitor, edit and/or remove any Comments submitted on the Site. You hereby grant the Company the right to use names that you submit in connection with any Comments. You agree not to use a false email address, impersonate any person or entity, or otherwise mislead as to the origin of any Comments you submit. You are, and shall remain, responsible for the content of any Comments you make and you agree to indemnify the Company and its affiliates against all claims, loss and liabilities resulting from any Comments you submit.
Further, any reliance placed on Comments available on the Site from a third party shall be at your sole risk and expense.
Copyright & Trademark
The Company, its suppliers and licensors expressly reserve all intellectual property rights in all text, programs, products, processes, technology, images, content and other materials which appear on the Site. Access to or use of the Site does not confer and should not be considered as conferring upon anyone any license to the Company or any third party’s intellectual property rights. All rights, including copyright, in and to the Site are owned by or licensed to the Company. Any use of the Site or its contents, including copying or storing it or them in whole or part is prohibited without the permission of the Company.
You may not modify, distribute or re-post anything on the Site for any purpose. The names and logos and all related product and service names, design marks and slogans are the trademarks/service marks of the Company, its affiliates, its partners or its suppliers/service providers. All other marks are the property of their respective owners. No trademark or service mark license is granted in connection with the materials contained on the Site. Access to or use of the Site does not authorize anyone to use any name, logo or mark in any manner. References on the Site to any names, marks, products or services of third parties or hypertext links to third party sites or information are provided solely as a convenience to you and do not in any way constitute or imply the Company’s endorsement, sponsorship or recommendation of the third party, the information, its product or services.
The Company is not responsible for the content of any third party sites and does not make any representations regarding the content or accuracy of material on such sites. If you decide to access a link of any third party websites, you do so entirely at your own risk and expense.
Objectionable Material
You understand that by using the Site or any services provided on the Site, you may encounter content that may be deemed by some to be offensive, indecent, or objectionable, which content may or may not be identified as such. You agree to use the Site and any service at your sole risk and that to the fullest extent permitted under applicable law, the Company and its affiliates shall have no liability to you for any content that may be deemed offensive, indecent, or objectionable to you.
Indemnity
You agree to defend, indemnify and hold harmless the Company, its employees, directors, officers, agents and their successors and assigns from and against any and all claims, liabilities, damages, losses, costs and expenses, including attorney's fees, caused by or arising out of claims based upon your actions or inactions, including but not limited to breach of any warranties, representations or undertakings or in relation to the non-compliance with any of your obligations under these Terms of Use, or arising out of a violation of any applicable laws, including but not limited in relation to intellectual property rights, payment of statutory dues and taxes, claims of libel, defamation, violation of rights of privacy or publicity, loss of service by other subscribers and infringement of intellectual property or other rights. This clause shall survive the expiry or termination of this User Agreement.
Limitation of Liability
The aggregate liability of the Company, if any, that can be established and proved pursuant to a claim, shall in no event extend beyond refund of the money charged from a user for purchases made pursuant to an order under which such liability has arisen and been established.
It is acknowledged and agreed that notwithstanding anything to the contrary, the Company shall not be liable, under any circumstances, whether in contract or in tort, for any indirect, special, consequential or incidental losses or damages, including on grounds of loss of profit, loss of reputation or loss of business opportunities.
Termination
This User Agreement is effective unless and until terminated by either you or the Company. You may terminate this User Agreement at any time, provided that you discontinue any further use of the Site. The Company may terminate this User Agreement at any time and may do so immediately without notice, and accordingly deny you access to the Site.
Such termination will be without any liability to the Company. The Company’s right to any Comments and to be indemnified pursuant to the terms hereof, shall survive any termination of this User Agreement. Any such termination of the User Agreement shall not cancel your obligation to pay for product(s) already ordered from the Site or affect any liability that may have arisen under the User Agreement prior to the date of termination.
Governing and Jurisdiction
The User Agreement shall be governed by and construed in accordance with the laws of India, without giving effect to the principles of conflict of laws thereunder.
Any dispute or difference, whether on interpretation or otherwise, in respect of any terms hereof shall be referred to an independent arbitrator to be appointed by the Company. Such arbitrator’s decision shall be final and binding on the parties. The arbitration shall be in accordance with the Arbitration and Conciliation Act, 1996, as amended or replaced from time to time. The seat of arbitration shall be Delhi and the language of the arbitration shall be English.
Subject to the aforesaid, the Courts at Delhi shall have exclusive jurisdiction over any proceedings arising in respect of the User Agreement.
Grievance Policy
In accordance with Information Technology Act, 2000 and the Information Technology (Intermediaries Guidelines) Rules, 2011, the name and contact details of the Grievance Officer who can be contacted for any complaints or concerns pertaining to the Site, including those pertaining to breach of the Terms of Use or and other polices are published as under.
Check Health Pvt Ltd Seva Nagar, No.6, 4th Street, Sevanagar, Gandhi Salai, Velachery, Chennai, Tamil Nadu, India. Pincode 600 042.


Paris police detain rocker Pete Doherty for buying drugs
PARIS (Reuters) - British rocker Pete Doherty has been arrested in Paris for buying drugs, the Paris prosecutor’s office said on Friday.
Doherty, 40, shot to fame as singer for the Libertines in the 2000s and gained a bad boy public image over drugs and run-ins with the police.
“Pete Doherty was placed in custody overnight for the acquisition of narcotic products,” a spokesman for the Paris prosecutor’s office said, without elaborating.
Doherty, the former boyfriend of model Kate Moss, has been arrested for drug offences on numerous occasions.
French media reported the former Babyshambles frontman was detained during an alleged drug deal in the Pigalle neighborhood in northern Paris, a district known for its late-night bars.
The prosecutor’s office did not confirm this.
A representative for Doherty declined to comment.


High Scores of Simon's Friends
Name
Score
Date
No high scores saved yet. Play to see your name here!


Need a theme customized? Brian's got you covered. Using a child theme, he creates the customized look you want, in a lot less time.
If it's WooCommerce, Brian can do it. With skills that range from customizing your shop's look and feel to plugin configuration and integration, he takes care of your WooCommerce needs.
Looking for a developer who Gits it? How about Vagrant? Ruby, Node, NPM? Grunt and Bower? Brian's got you covered with these skills and more.


Reports if statements
which contain else branches and whose conditions are negated.
Flipping the order of the if and else
branches will usually increase the clarity of such statements.
Use the checkbox below to ignore comparisons of the form != null.
Powered by InspectionGadgets


Zika virus (ZIKV) is a mosquito-borne flavivirus first isolated in Uganda in 1947. Although entomological and virologic surveillance have reported ZIKV enzootic activity in diverse countries of Africa and Asia, few human cases were reported until 2007, when a Zika fever epidemic took place in Micronesia. In the context of West Africa, the WHO Collaborating Centre for Arboviruses and Hemorrhagic Fever at Institut Pasteur of Dakar (
Zika fever is a mosquito-borne illness caused by a flavivirus. Human infections with Zika virus (ZIKV) could cause fever, malaise and cutaneous rash. Despite several ZIKV reports since 1947 when it was first isolated at Zika forest in Uganda, molecular evolution of ZIKV as an emerging agent remains poorly understood. Moreover, despite several ZIKV reports from Africa and Asia, few human cases were notified until 2007 when an epidemic took place in Micronesia. In West Africa, surveillance programs have reported periodic circulation of the virus since 1968. To help fill the gap in understanding ZIKV evolution, 43 ZIKV samples were analyzed. We focused on: ( i) adaptive genetic changes including protein glycosylation patterns, ( ii) phylogenetic relationship among isolates and their spatiotemporal patterns of spread across Africa and Asia and, ( iii) dispersion among vertebrate reservoirs and invertebrate vector species. Our results indicated that ZIKV may have experienced recombination in nature and that, after it emerged from Uganda in the early of the 20 th century, it moved to West Africa and Asia in the first half of the century, without any clear preference for host and vector species.
Zika virus (ZIKV) is a mosquito-borne flavivirus, a member of the Spondweni serocomplex, whose natural transmission cycle involves mainly vectors from the Aedes genus ( A. furcifer, A. taylori, A. luteocephalus and A. africanus) and monkeys [1], while humans are occasional hosts. Clinical pictures range from asymptomatic cases to an influenza-like syndrome associated to fever, headache, malaise and cutaneous rash [2], [3]. Likewise, direct contact is also considered a potential route of transmission among humans, probably during sexual intercourse [4]. The first isolation of ZIKV was in 1947 from the blood of a sentinel Rhesus monkey No. 766, stationed in the Zika forest, near the Lake Victoria in Uganda, and in 1948 ZIKV was also isolated in the same forest from a pool of A. africanus mosquitoes [5]. Thereafter, serological and entomological data indicated ZIKV infections in the African continent in Nigeria in 1971 and 1975 [6], Sierra Leone in 1972 [7], Gabon in 1975 [8], Uganda in 1969 and 1970 [9], Central African Republic in 1979 [10], Senegal from 1988 to 1991 [11] and Côte d'Ivoire in 1999 [12]. Recently, ZIKV was detected in Senegal in 2011 and 2012 (unpublished data). In addition, ZIKV infections in Asia were reported in Pakistan [13], Malaysia [14], Indonesia in 1977 and 1978 [15], Micronesia in 2007 [16], [17] and Cambodia in 2010 [18]. Although ZIKV was repeatedly isolated, only 14 human cases were reported before April 2007, when a Zika fever (ZF) epidemic occurred in Yap island in Micronesia, where 49 confirmed cases and 73% of the residents older than 3 years provided serologic evidence for recent ZIKV infection [16]. This outbreak showcased the potential of ZF as an emerging disease, which could be misdiagnosed as dengue fever, as happened during the beginning of the Micronesian outbreak [16], [17].
The ZIKV genome consists of a single-stranded positive sense RNA molecule with 10794 kb of length with 2 flanking non-coding regions (5′ and 3′ NCR) and a single long open reading frame encoding a polyprotein: 5′-C-prM-E-NS1-NS2A-NS2B-NS3-NS4A-NS4B-NS5-3′, that is cleaved into capsid (C), precursor of membrane (prM), envelope (E) and seven non-structural proteins (NS) [19], [20]. The E protein (≈53 kDa) is the major virion surface protein. E is involved in various aspects of the viral cycle, mediating binding and membrane fusion [21]. The NS5 protein (≈103 kDa) is the largest viral protein whose C-terminal portion has RNA-dependent RNA polymerase (RdRP) activity and the N-terminus is involved in RNA capping by virtue of its processing due to methyl transferase activity [21]. The 3′NCR of the ZIKV genome contains about 428 nucleotides, including 27 folding patterns [20] that may be involved in the recognition by cellular or viral factors, translation, genome stabilization, RNA packaging, or cyclization [21]. Although diverse studies have contributed greatly to our understanding of the evolutionary biology of flaviviruses in general [22]– [25], few studies have addressed ZIKV evolutionary biology [17], [26]. Those studies report three main ZIKV lineages, one from Asia and two from Africa. Aiming to fill this gap and gain better insights ZIKV molecular evolution in the 20 th century, we investigated 43 ZIKV strains, sampled from 1947 to 2007 in Africa and Asia, to describe phylogenetic relationships, selective influences, recombination events, phylodynamics, phylogeography, host correlations with viral lineages and glycosylation patterns.
Samples used in this study are part of the Institute Pasteur in Dakar collection (WHO Collaborating Centre for Arboviruses and/or Hemorrhagic Fever Reference and Research). Monkey and human strains (AnD 30332 and HD 78788) were obtained respectively in 1979 and 1991 in Senegal during routine surveillance. None of the data was directly derived from human or animal samples but rather from cell culture supernatant. Therefore all the samples were anonymous and only reference numbers were used during the analysis that originated this study.
ZIKV strains were provided by CRORA at the Institute Pasteur of Dakar. The strains were obtained from mosquitoes, humans and other mammals isolated in Burkina Faso, Central African Republic, Côte d'Ivoire and Senegal in West Africa ( Table S1). Viral stocks were prepared by inoculating viral strains into Aedes pseudoscutellaris clone 61 monolayer in Leibovitz 15 (L-15) growth medium (GibcoBRL, Grand Island, NY, USA) supplemented with 5% fetal bovine serum (FBS) (GibcoBRL, Grand Island, NY, USA), 10% Tryptose Phosphate and antibiotics (Sigma, Gmbh, Germany). Viral infection was confirmed after seven days of propagation by an indirect immunofluorescence assay (IFA) using specific hyper-immune mouse ascitic fluid, as described previously [27]. Cultures supernatants were collected for virus RNA isolation.
RNA was extracted from ZIKV stocks using the QIAamp RNA Viral Kit (Qiagen, Hilden, Germany) according to the manufacturer's recommendations. RNA was eluted in 50 µl of AVE buffer and stored at −80°C until use.
For cDNA synthesis, 10 µl of viral RNA was mixed with 1 µl of each of a reverse primer (2 pmol), 1 µl of deoxynucleotide triphospahte (dNTP) (10 mM each dNTP and the mixture was heated at 65°C for 5 min. Reverse transcription was performed in 20 µl mixture containing mixed of 2.5 U RNasin (Promega, Madison, USA) 5 U of Superscript III reverse transcriptase (Invitrogen, Carlsbad, USA) and incubated at 55°C for 50 min, followed by 70°C for 15 min. PCR products were generated independently using the primers Unifor/Unirev, FD3/FU1 and VD8/EMFI to amplify partial E, NS5 and NS5/3′NC region respectively [28]. Five microliters of cDNA were mixed with 10× buffer, 5 µl of each primer, 5 µl of dNTPs 10 mM, 3 µl of MgCl
PCR products of the expected size were purified from agarose gels with the QiaQuick Gel Extraction Kit (Qiagen, Hilden, Germany) as specified by the manufacturer. Both strands of each PCR product were sequenced directly with the ABI Prism BigDye Terminator Cycle Sequencing Ready Reaction Kit V3.1 on an Applied Biosystems 3100 DNA Analyzer (Applied Bisoystem, Foster City, CA, USA) at the Laboratory of Molecular Evolution and Bioinformatics, Biomedical Sciences Institute, University of Sao Paulo, Brazil. We deposited thirty two 753 bp-long sequences from the E gene (Accession numbers: KF383015-KF383046), thirty one of NS5 (708 bp) (Accession numbers: KF38304-KF383114), thirty seven of 3′NCR (537 bp) (Accession numbers: KF383047-KF383083) and six genomes (10274 bp) (Accession numbers: KF383115–KF383120) in GenBank (
Prior to the analyses, all sequences were aligned with MUSCLE v3.7 [29] and manually edited with SeaView v4.3.3 [30]. To prevent potential biases during phylogenetic inference due to recombination, we first analyzed the sequences of available ZIKV genomes with RDP v4.4.8 program [31] that incorporates RDP [32], GENECONV [33], Chimaera [34], MaxChi [35], Bootscan [36], SiScan [37] and 3Seq [38] methods to uncover evidence for recombination events. Only events with p-values≤0.01 that were confirmed by four or more methods were considered, using the Bonferroni correction to prevent false positive results [39], as implemented in the RDP program [31]. In addition, the occurrence of recombination in genomes was also investigated with the Rec-HMM program that estimates breakpoints based on the Phylo-HMM approach, which models tree topology changes over the columns of a multiple alignment [40]. Moreover, potential intra-gene recombination was also inspected with RDP using individual gene datasets, and the incompatibility among phylogenies inferred from genes (NS5 and E) was also investigated with GiRaF v1.01 [41] that searches incompatible clades among posterior set of trees (PST) obtained from different genomic regions with threshold of 70% for incompatible clades. The PST was obtained during Monte Carlo Markov chain (MCMC) stationarity using four chains, one ‘cold’ and three ‘heated’, after 20 million of generations, sampling every 5000 generations using MrBayes v3.2.1 [42].
The phylogenetic signal content of the sequence datasets to phylogenetic reconstruction was investigated by Likelihood mapping method [43], implemented in TREE-PUZZLE v5.2 [44]. The concordance among gene (E and NS5) datasets without recombinant sequences was further assessed using a permutation test with significance level (α) of 0.05 after 10000 permutations, implemented in the Congruence among Distance Matrices (CADM) package [45]. Phylogenetic trees were generated by Maximum Likelihood (ML) criterion using GARLI v2.0 [46] that uses a stochastic algorithm to estimate simultaneously the best topology, branch lengths and substitution model parameters that maximize the log Likelihood (lnL). The confidence of ML trees was assessed by the convergence of lnL scores from ten independent replicates. We used a substitution model based on general time reversible (GTR) model with gamma-distributed rate variation (Γ) and a proportion of invariant sites (I). Support for the topology was obtained after 1000 non-parametric bootstrap replicates with GARLI. Then, we summarized the bootstrap trees into one consensus tree to access bootstrap values, using Dendropy v3.10.1 [47].
To infer the selection pressures acting on each gene of ZIKV, we estimated the difference between the non-synonymous ( dN) and synonymous ( dS) rates per codon site using the single likelihood ancestor counting (SLAC) algorithm available in HyPhy v0.99 [48], assuming a significance level of 1% (α = 0.01). In the HyPhy output, values of ω are expressed as ω = dN - dS. Therefore, ω smaller than zero (ω<0) indicate purifying, negative selection.
Potential glycosylation sites that may have adaptive value were previously described in ZIKV proteins [17], [20], [26]. Thus, we investigated partial E sequences to detect potential glycosylation sites using NetCGlyc v1.0 [49], NetOGlyc v3.1 [50], YinOYang v1.2 [51] and NetNGlyc v1.0 [51], [52] methods that employ algorithms based in neural networks to predict, respectively, C-mannosylated, mucin-type O-linked, N-acetylglucosamine (GlcNAc) and N-linked glycosylation sites. To infer the structural position of the predicted glycosylation sites, we modeled the tridimensional structures of E regions of viral polyprotein of the Micronesian strain (GenBank accession number ACD75819). We used the homologous sequences from Japanese Encephalitis virus (PDB code 3p54), West Nile virus (PDB code 2i69) and Dengue virus type 3 (PDB code 1uzg). The amino acids sequences were aligned using MUSCLE v3.7 [29], a total of 1000 independent models were generated and optimized using Modeller v9.10 [53], and the best models were validated with PROCHECK v3.5.4 [54].
Maximum Clade Credibility (MCC) trees were inferred using a Markov Chain Monte Carlo (MCMC) Bayesian approach implemented on the program BEAST v1.6.2 [55] under GTR + Γ + I and a relaxed (uncorrelated lognormal) molecular clock [56]. MCMC convergence was obtained for four independent runs with 50 million generations, which were sufficient to obtain a proper sample for the posterior at MCMC stationarity, assessed by effective sample sizes (ESS) above 200 inspected using Tracer v1.5 (
The primary analyses with RDP suggested 13 recombination events in ZIKV complete genomes ( Table S2), Rec-HMM also detected genomic breakpoints with confidence in the following alignment positions: 1044 to 1095, 5181 to 5238, 9007 to 9132 and 9580 to 9631 ( Figure S1). Since the results obtained by both methods revealed breakpoints in the E and NS5 genomic regions, we investigated these evidences with RDP on partial gene sequences. We found a single event in E sequences with estimated breakpoints near to the 414 th and 1065 th site of E gene reaching nine viral strains: ArA986, HD78788, ArA27101, ArA27290, ArA27096, ArA27443, ArA27407, ArA27106 and ArA982. These results were found by Bootscan, Maxchi, Chimaera, SiSscan and 3Seq methods and supported by significant p-values of 1.31E-5, 2.85E-3, 1.59E-3, 1.79E-29 and 6.85E-19, respectively. Likewise, only one recombination event was detected in NS5 sequences with estimated breakpoints near sites 1581 and 2152 of the NS5 gene from strains ArD158084, ArB1362 and ArD157995. These findings were confirmed by Bootscan, Maxchi, Chimaera, SiSscan and 3Seq methods and supported by significant p-values of 9.93E-9, 3.32E-7, 3.32E-7, 5.27E-28 and 7.65E-24, respectively. These potential recombinant sequences were excluded from further analyses to avoid inferential biases [62], [63]. To perform the phylogenetic analysis we concatenated E and NS5 sequences and replaced inferred recombinant fragments with missing data. This is in line with the use of Maximum Likelihood approaches, which is fairly robust to the introduction of gaps [64], [65]. In addition, we found incompatibilities between E and NS5 phylogenies using GiRaF. The three discordant strains (ArD128000, ArA1465 and ArD142623) were excluded, and we used 40 (31 from E and 36 from NS5) concatenated sequences for phylogenetic analysis. Moreover, we also found that the two remaining datasets for E and NS5 have no conflicting phylogenetic signal, as estimated by a CADM test ( p-value = 9.99E-5 and α = 0.05). Given the limited sampling that we investigated, these results indicate that ZIKV may be experiencing recombination in the field, which is uncommon among flaviviruses [66]. These findings remain to be properly evaluated and assessed related to their effects on viral spread, zoonotic maintenance and epidemiologic potential. The possibility that our findings could be a consequence of cross contamination among isolates seems highly improbable given the extreme precautions that were taken. RNA extraction and reverse transcription were done separately for each isolate under BSL-II cabinets, sequenced several times leading to identical sequences, even when processed in different laboratories in Sao Paulo, Brazil, and Dakar, Senegal.
We first investigated the phylogenetic signal content in our data by reconstructing 50000 quartets for each gene segment using the likelihood mapping method (see methods section). Our results indicated that NS5 and E datasets had high phylogenetic signal content given their lower percentage of unresolved quartets (3.2% and 3.4%, respectively), while 3′NCR showed less signal (16.4% of unresolved quartets) and was not considered. The ML trees for E (data not shown), NS5 (data not shown) and the two concatenated genes ( Figure 1) reinforced that ZIKV strains could be classified in three major clusters [17]. Accordingly, the African strains were arranged into two groups: the MR766 prototype strain cluster (yellow sector on Figure 1) and the Nigerian cluster (green sector on Figure 1); and the Micronesian and Malaysian strains clustered together forming the Asian clade ( Figure 1), in agreement with [26]. For West Africa, the strains from Côte d'Ivoire and Senegal were found in both African clusters, suggesting that at least two distinct lineages of ZIKV circulated in these countries. Interestingly, we found that the position of the Senegalese cluster, comprising viruses isolated from 1998 to 2001 associated with A. dalzieli, branching as a sister group of HD78788 isolated in Senegal in 1991, was not simply explained by recombination (with both Giraf and RDP) or poor rooting of the tree, since it did not depend on the inclusion ( Figure 1) or exclusion ( Figure S2) of the Spondweni, which is a bonafide outgroup. It was observed 65% of the time during a highly stringent maximum likelihood (ML) analysis with GARLI, not taking into account dates of isolation, but crucially it had a posterior probability of one during Bayesian Inference (BI) that do take into account dates of isolation. Although we cannot rule out systematic topological errors, BI was certainly better informed than ML, since RNA viruses evolve fast, making their times of isolation important parameters for phylogenetic inference. Moreover, since we did not find compositional or codon usage biases in those sequences and in agreement with the consistent BI results, we could not rule out that the long branch length observed was not due to a detected increase of almost 10 fold increase in the rate of change along that lineage, which was not caused by detectable positive selection, as evaluated using HyPhy.
Consensus tree summarized after 1000 non-parametric bootstrap replicates, with support values greater than 60% shown in the nodes. The cluster the Ugandan MR766 prototype strain was highlighted by the yellow sector and the Nigerian cluster was highlighted by the green sector. The strains from Senegal and Côte d'Ivoire are shown in green and orange, respectively. The tree has been rooted with the Spondweni lineage isolated in South Africa was used as outgroup to root the tree.
Selection analyses of E and NS5 genes uncovered several sites under strong negative selection indicated by ω<0. This suggests frequent purging of deleterious polymorphisms in functionally important genes. Likewise, the lack of positively selected sites, indicated by ω>0, is typical of highly adapted phenotypes and shows no detectable directional change on the available data. Our findings were expected, as the infection and transmission modes of ZIKV allow the accumulation of synonymous mutations and negatively selected sites [67]. The alternation between arthropod vector and mammal hosts may impose several barriers to non-synonymous mutations in important genes [68].
The μ and the highest posterior densities (HPD with 95% of confidence interval) estimated with Beast for E, NS5 and 3′NCR genomic regions were, respectively, 2.135E-3 (2.04E-3 to 2.33221E-3), 7.1789E-4 (6.9466E-4 to 7.417E-4) and 1.1285E-3 (2.708E-4 to 2.504E-3) substitutions per site per year, which are similar to μ estimated other flaviviruses [69]. As evolutionary rates are the result of spontaneous mutations followed by selection, differences per gene are expected and in accordance with their biological role, given that the NS5 is a polymerase and the E is a surface protein. In addition, the root date estimates and 95% HPDs of the phylogenetic trees for E, NS5 and 3′NCR genomic regions were, respectively, 1900 (1851 to 1937), 1927 (1887 to 1940) and 1923 (1874 to 1959). These dates suggest a recent origin for the ZIKV strains (included in this study) near to the beginning of the 20 th century.
Based on our samples we inferred the most likely geographical pathway connecting ZIKV lineages. These results indicated that ZIKV emerged in Uganda around 1920, most probably between 1892 and 1943. This inference is in line with the first known ZIKV isolation in Uganda in 1947 [5]. We found two independent ZIKV introductions into West Africa from the Eastern portion of the continent ( Figures 2 and S2A, and kml file in Dataset S1). The first viral introduction into Côte d'Ivoire (CI) and Senegal (SN) was related to the MR766 cluster (yellow lines in Figure 2), which possibly moved from Uganda around 1940 into Dezidougou (CI). From there, this lineage probably spread to Kedougou in Senegal (SN) around 1985 and to Sokala-Sobara (CI) around 1995. The second introduction was related to a Nigerian cluster (green lines in Figure 2), when ZIKV probably moved from Uganda to the Central African Republic and Nigeria around 1935. From Nigeria, the virus probably spread to Saboya (SN) around 1950 and from there to Dezidougou (CI) and Bandia (SN) around 1960. From Bandia, ZIKV was introduced into Kedougou (SN) around 1965 and from there to Burkina Faso around 1980 and to Dakar (SN) around 1985. Moreover, an additional ZIKV lineage from Uganda probably spread to Malaysia around 1945 and from there, the virus reached Micronesia around 1960, forming the Asian cluster [26]. The correlation between viral location (coded as character states) and phylogenies was strongly supported by significant AI and PS values, p-values≤1.00 E-4 ( Dataset S2). Thus, assuming an origin of ZIKV in Uganda, our findings revealed at least two independent exits from East Africa in agreement with the two previously proposed African clades [17] and also pointed to a viral migratory flow from Eastern Africa to Asia. Although our sampling was the most comprehensive to this date, our conclusions about ZIKV movement are informed conjectures at best on the most plausible hypotheses on ZIKV spreading patterns, which are limited by the inherent biases of this type of analyses.
The directed lines connect the most probable sources and target localities of viral lineages (shown by arrows), with widths proportional to the posterior probabilities and values shown in red. Only plausible routes with probabilities above 50% are shown. The distinct introductions into Senegal and Côte d'Ivoire were represented by different colors. The estimated time to the most recent common ancestor of strains from different countries are shown with 95% posterior time intervals in parenthesis and could be interpreted as the oldest possible year of introduction of that lineage at that locality.
The association of the animal sources with viral lineages ( Figure S2B) suggested that ZIKV dispersed widely among distinct animal species without a clear pattern of preference, maybe associated to the enzootic cycle of ZIKV in Africa, whose natural cycle allows a broad range of hosts [70]. Nevertheless, we found significant MC ( p-value≈1.00 E-4, Dataset S2) for ZIKV strains isolated from A. dalzieli, suggesting a possible important role of this zoophilic vector [71] in West Africa. This association was found to be robust to the exclusion of vertebrate host from the analysis. The plausibility of the putative recombination events we detected ( Table S2), could in part be explained by mosquitoes taking sequential blood meals from distinct animal species harboring distinct ZIKV lineages, which is in line with ours and others host range findings [70]. Also, when analyzing the increase of ZIKV activity in Kedougou, (where most of the viruses analyzed herein were collected), we noticed that ZIKV activity is much more frequent, with an interval of 1–2 years, compared to the 5 to 8 years cycle of dengue and yellow fever virus. Hence from 1972 to 2002, ZIKV emerged in 1973, 1976, 1979, 1980 and 1981. Such frequent activity can also be an opportunity of co-circulation and mixing of multiple genotypes present in the forest and that may favor recombination among them.
The occurrence of recombination among ZIKV strains in time-scaled phylogenetic trees suggested that some ZIKV lineages sampled in Dezidougou (CI) in 1990 (ArA27101, ArA27290, ArA27096, ArA27443, ArA27407 and ArA27106) with recombinant E ( Figure S2C) shared a common ancestor around 1962 (ranging from 1951 to 1967 HPD with 95% of confidence interval). Likewise, the strain ArA982 was also isolated at Dezidougou in 1999 and its sister-group ArA986, which shared a common ancestor with the former around 1992 (ranging from 1981 to 1996 HPD with 95% of confidence interval), was sampled in the neighbor province Sokala-Sobara (CI) in 1999. Together these results indicated that recombination in envelope protein could be an important trend among the enzootic cycle of ZIKV at this region in Côte d'Ivoire, as ZIKV lineages did not show a clear pattern of host preference and recombination requires the infection of the same host by more than one viral strain. Besides, the other E recombinant strain (HD78788), isolated from a human case at Dakar (SN) in 1991, shared a common ancestor around 1984 (ranging from 1976 to 1988 HPD with 95% of confidence interval) with ZIKV strains from Kedougou (SN). Conversely, the three NS5 recombinants did not cluster along phylogenetic trees ( Figure S2C), although two of them were isolated in Kedougou from A. dalzieli mosquitoes in 2001 (ArD157995 and ArD158084) and the other (ArB1362) was isolated in Bouboui, Central African Republic, from A. africanus mosquitoes in 1968. The preferential distribution of recombinant strains along phylogenies was supported by significant p-values of AI and PS ≤2.00E-4 ( Dataset S2) and the adjacency patterns of E and NS5 recombinants were also confirmed by MC statistics ( Dataset S2).
Our analyses predicted several glycosylation sites in the E protein ( Figure 3). We detected a probable motif (Asn-X-Thr) among E sequences from several ZIKV strains ( Figure 3A), which suggests a N-linked glycosylation site in the residue Asn-154, in agreement with [17], [26]. This residue is located on an α-helix in the E protein structure (yellow arrow in Figure 3A and yellow bead in Figure 3B). Our results also pointed several O-linked glycosylation sites in the E protein (red arrows in Figure 3A and red beads Figure 3B) but no C-mannosylated site. We found a probable mucin-type O-linked glycosylated site at residue Thr-170 in E protein from all ZIKV strains, and other mucin sites at residues Thr-245 and Thr-381 in some isolates ( Figure 3A). In addition, we also uncovered probable O-GlcNAc attachment sites at residues Ser-142, Ser-227, Thr-231, Ser-304, Thr-366 and Thr-381 in E from some strains ( Figure 3A).
A) Alignment of E protein showing predicted glycosylation sites. Red arrows point to O-linked glycosylation sites (Ser or Thr residues) and the yellow arrow points to the N-linked glycosylation site (Asn-X-Thr motif). B) Tridimensional structure of E protein. Red beads indicate O-linked glycosylation sites and the yellow bead indicates the unique N-linked glycosylation site.
Given the importance of the N-linked glycosylation site around position 154 of the E protein for infectivity and assembly of flaviviruses [72]– [74] and the fact that we observed polymorphisms in this motif (deletions and substitutions 156 Thr/Iso), we investigated the correlation between the conservation of this motif (Asn-X-Thr) and phylogenies for ZIKV strains. Our results suggested that the acquisition of this glycosylation site is a recurrent event in the history of ZIKV, given the observed changes from Isoleucine to Threonine and vice-versa more than once in the MCC tree ( Figure S2D), supported by p-values for AI and PS ≤7.00E-4 ( Dataset S2). However, our conclusions are limited due to serial passages of the former ZIKV strains ( Figure S2D) in mouse brain [26], which could result in the loss of this glycosylation site, as observed in West Nile virus [75].
Since it was demonstrated that the absence of an N-linked glycosylation site on the E protein enhances viral infectivity for C6/36 mosquito cells [72], [73] and E protein of ZIKV strains from A. dalzieli, which was the unique vector source with significant MC–showed an absence of this glycosylation site, we investigated the correlation between this mosquito-source and N-linked glycosylation patterns of E protein along PST. Our results indicated the changes in glycosylation patterns (presence or absence) and vector ( A. dalzieli or not) were correlated during ZIKV emergence, which was supported by BF for dependent model (BF≈47.004) greater than for them to independent model. These findings could be related to the enzootic cycle of ZIKV in West Africa and the zoophilic behavior of A. dalzieli [71], whose females take blood meals from a broad range of vertebrates, which provides additional evidence for the absence of host preference (as described in Animal sources of ZIKV). Hence, further studies are necessary to understand the consequences of our results to ZIKV transmission cycle in nature.
Our analyses indicated that ZIKV may have experienced several recombination events, which is uncommon among flaviviruses [66]. The recurrent loss and gain of the N-linked glycosylation site in the E protein could be related to mosquito-cell infectivity [73] and the correlated loss of this glycosylation site in ZIKV strains from A. dalzieli also provides indirect evidence for the enzootic cycle, since this vector has a zoophilic behavior [71] that may spread ZIKV among several hosts. Crucially, our results corroborated the notion that at least three distinct ZIKV clusters shared a common ancestor possibly with Ugandan lineages around 1920, followed by two events of East to West Africa spread ( Figure 2): ( i) one related to the MR766 cluster introduction to Côte d'Ivoire and posterior spread to Senegal and; ( ii) other related to the Nigerian cluster introduction in Senegal and posterior dispersion to Côte d'Ivoire and Burkina Faso.
Spread of ZIKV strains in Africa and Asia. A kml file to picture the history of ZIKV movement into Africa and Asia during the time, it is executable in Google Earth program (
(KML)
Click here for additional data file.
Significance of the correlation among phylogenies and attributes of ZIKV lineages.
(DOC)
Click here for additional data file.
Recombination analysis using Rec-HMM along ZIKV genomes. The dashed green lines indicate estimated breakpoints in the genomes.
(TIF)
Click here for additional data file.
Maximum clade credibility (MCC) trees for concatenated sequences summarizing lineage states along a time-scaled tree, with posterior probability values shown near the nodes. ( A) Most probable geographical location coded according to map ( Figure 2): Uganda (UG), Central African Republic (CF), Dezidougou in Côte d'Ivoire (DE), Sokala-Sobara in Côte d'Ivoire (SS), Kedougou in Senegal (KE), Saboya in Senegal (SA), Bandia in Senegal (BA), Dakar in Senegal (DA), Burkina Faso (BF), Nigeria (NG), Malaysia (MY) and Yap Island in the Federated States of Micronesia (FM); ( B) most probable animal source; ( C) recombination events per region; and ( D) glycosylation polymorphisms.
(TIF)
Click here for additional data file.
Source, country and year of isolation from ZIKV strains used in this study.
(DOC)
Click here for additional data file.
Detection of recombination events in ZIKV genomes.
(DOC)
Click here for additional data file.
We thank Dr. Scott Weaver for helpful comments and critical reading of the manuscript.


Charts That Wrap Around
Drag your mouse (or finger on a touch screen) over the charts below to see how they wrap around. Source code on github.
Simple horizontal wrapping - Geographic Projection
An Hoby-Dyer Projection
of the world map.
Only horizontal panning makes sense - panning vertically would need to invert the map to keep adjacencies of continents on the earths surface correct.
We call wrapChart
with a "horizontal"
pan constraint to limit the panning.
Simple horizontal Wrapping Chart, left and bottom axes
Mean rainfall over months of the year since records began.
Having January on the left and December on the right is completely arbitrary.
If we want to look at the summer months (December, January and February) together, we can pan them so the wrap is elsewhere in the year.
We call wrapChart
with a "horizontal"
pan constraint to limit the panning.
Wrappable chart with all axes labels
Average traffic volume data at Cambridge Street, NSW from 2011 to 2020. By hour (horizontal) and day (vertical).
We specify images for top, bottom, left and right axes and no pan constriant.
Vertical pan constraint
A cyclical Sankey diagram, laid-out on a cyclinder so that the cycle wraps around. The original use of Sankey diagrams was to show energy transfer in engines. Such systems often have cycles. The diagram above opens up the cycle so energy transfer direction is always downwards. Thermodynamic analysis of water injection in a micro gas turbine
Diagonal pan constraint
We constraint panning on a symmetric matrix to "diagonal"
because otherwise we lose the symmetry and get lost. Wrapping helps us see that the ordering of the clusters is rather arbitrary.
From Les Misérables Co-occurrence Matrix
Anti-diagonal pan constraint
| Your Outcome: |
||
A directed graph with the special self edges (the draws) mapped to the anti-diagonal. An "antidiagonal"
pan constraint keeps those draws where we can easily track them.
Adapted from A Rock, Paper, Scissors, Lizard, Spock Chart In R.
Images Wikimedia: Creative Commons


This was my first experience with Salvia. I am 18 years old and relatively inexperienced with drugs. I have smoked strong strains of cannibas over the last year, but maybe only 1-3 times a month. I heard about Salvia through a few friends that tried it and said it didn't work out for them, so I decided to investigate for myself. I googled Salvia and absorbed as much knowledge as I could manage to learn how I could safely try it for the first time.
I ended it up purchasing some online a few months after looking into it. I purchased some leaves and a gram of 5x extract for a reasonable price and decided to smoke it earlier this night. I tried to prepare for the experience, but I decided to try it alone so I could be free to react to it uninhibited. I made sure I had water, put on some pleasant music at a low level, and dimmed the lights in my room. I made a home-made pipe out of a juicy pear and I opened up the window wide, so I could blow the smoke out. My room mate is okay with me smoking, and he wasn't even there, but I felt it polite to try to not stink up the place. I packed the bowl with fairly dry but fresh leaves to what could be called a medium/large bowl I suppose. I do not have a scale and I didn't feel it too vital to measure out exact leaves or 5x extract. I decided I'd use my judgement. I closed my eyes, took a deep breath, and tried to relax so my mind would be blank upon smoking.
I lit up and smoked the salvia leaves, keeping the flame of my butane lighter directly on the salvia for the majority of the time I inhaled. The entire bowl burned out on the first hit, very quickly, and as I inhaled I prepared to cough out plumes of smoke as I would've with a cannibas hit that big. I felt my lungs sending warning signals, as if any moment I was about to choke and cough, and burning sensations would come soon. However, I was completely surprised as I kept waiting for the burning only to realize I held a full breath of salvia smoke, and I felt as though I didn't even need to breath. I exhaled after holding my breath for what seemed like about 20 seconds. This was the smoothest thing I've ever smoked. However, I only have cannibas to compare it to. The aroma was actually very pleasant to me and filled my sinuses with almsot a tingling sensation of quiet pleasure.
This was not very unnatural feeling, however, it did seem to be a more rich sense of smell than usual. My vision seemed mostly normal, although there was a certain hint of a fog in the room now, and it was not smoke. I could hear music playing and fairly distant cars driving by in a fairly quiet night, and the room was almost a jazz blue color. I didn't linger long in this experiance, since I still had a bowl ahead of me.
Since I set forth to take a hit of leaves, and extract, I packed a bowl of 5x extract about 30 seconds after the first. This bowl was slightly smaller than I packed of leaves, but still a large/medium bowl. I lit this bowl in a similar fashion, inhaling it all in 1 fairly brisk breath. I was overwhelmed momentarily because of the actual heat, I felt I slightly burned my tongue, but I was fine. Once again the hit went smooth and right into my lungs, without feeling as though it were being rejected.  I honestly felt as though I had breathed in air after the slight burning in my lungs went away. I exhaled at last and began to breath slowly. I looked around the room patiently with out any real expectations, I just immediately felt as though I were searching. I decided there was nothing to find and decided I should close my eyes.
I rested my forehead on the windowsill and bent over to do so. I was sitting on an old computer tower that was just less than half the height of the windowsill, I'd say just over a foot tall. I closed my eyes and observed. My other senses were utterly ignored this whole time, and I suddenly realized how fluid and natural all of my actions had been since I exhaled. It was almost a feeling of instincual behavior, there was no concious or even unconcious decisions or ideas I had to consider in my mind. Things just occured. As I closed my eyes, I saw nothing special. Some two dimensional patterns that I could imagine sober. I found nothing there and so I proceeded to open my eyes.
What happened as I opened my eyes, was nothing like I ever experienced in my life, and I shall never forget it. It made me realize how powerful of a substance, and affirmed my belief that this is not something for recreational use. My reality, and everything as I knew it to be, was completely and utterly altered. My senses, however, were all the exact same. Sight, smell, hearing, touch, and I'm sure taste though it was not involved. My situation, however, defied all logic and invalidated existance. It was absurd, and here is how it seemed to me:
I opened my eyes expecting to see the wall below the windowsill, a dull cream colored stucco with some random bumps and such. Not only this, but I expected to feel all the natural feelings of touch associated with existance. However, I no long felt my bathroom against my skin, I felt something completely different, yet I did not know what that was yet. I could see as soon as I opened my eyes, but the image was so foreign that it was too complex for me to comprehend right away and I was perplexed for an infinite moment. I finally noticed in a blured rush very many things, and a great deal occured. This felt like the time span of maybe 4 seconds.
This is what I experienced in those '4 seconds'. I noticed I was seeing, but had no eyes. I had a global view of all that was around me, as if I were out of my body, it was then I realized I no longer had a body. I did, however, have a physical manifestation. I was a piece, a slice, of my existance. Now, this is literal. My existance that I percieved, was a universe of fleshy mass and membranes, actual human flesh. They were almost finger, or french fry shaped and would wave about in a harmonious way, vibrating gently as well. This background was orange/bronze tanned flesh, nothing like mine. Though I was not touching most of these masses, I could feel all that they felt as though we shared a hive mind, and when they rubbed past each other I could understand it from all of their perspectives. They communicated with their minds that stemmed from their psychies. They were, however, all saying the same thing, as if they were one entity.
This was not a quiet sideline observation by myself. I was a part of this reality, and I was immediately in a certain fear and uncertainty. It had dawned upon me that my entire life as I thought it, was nothing but a dream. I tried to search for reality as I knew it, but this existance in this odd flesh world was all I was aware of. My reality was utterly replaced and I could not accept this so easily. As soon as the rest of the existance realized what I was thinking and feeling, they reverberated in a harmonious and almost ghostly but commanding voice that dominated my reality something that meant:'You thought that was real?' and 'I'll show you what real means'. It proceeded to giggle sendng ripples through my world.
I couldn't believe it and tried to turn around so I could see the rest of my room and reality. I began peeling away almsot violently, but not painfully from the rest of the universe.   We were all, however, still attached. So I tried to get out, and was motivated with a mysterious force I suppose must be willpower.
I was the section of my face just off center from my nose, with the majority of my right eye down to my chin, and I was peeling away from my face, vividly feeling every gentle tear as my flesh detached from the rest of the universe like a slice of an orange coming apart from the whole. My world spun and was consistant, and it seemed to me that this was going to be my life from now on. I went on a quantum tunnel of thought imagining what my purpose would be in such a state and what my thoughts and dreams were. They were too complex and surreal to even comprehend, as if in a language I couldn't understand, but I feel my unconcious took and locked that knowledge away to be later accessed.
As I turned my head further, I looked down at my feet, and I saw the rest of my face as I was coming apart with it. There was a bubble of reality where my face was looking into my room, and it was large enought to fill it height wise. I tried to turn away, at this point there were signs of reality, since I saw my feet and legs, but they were still part of this new existance, and I had to tear away completely. I could see the line where I detached from reality and it made the entire situation crystal clear and amazingly well understood in my head. Until the last moment when I finally turned around 180 degrees and snapped back to reality.
I was so overwhelmed by my experience that all I could say for 5 minutes straight was:'OH MY GOD'. I then realized that I had been screaming at the other fleshy membranes, as if it were one of those locked away memories that I hadn't immediately registered. I was screaming out loud in real life and I thought people might have heard me outside. I briefly heard voices and thought I had disturbed someone. This lasted for maybe 10 seconds and very quickly died down. I collected myself and said oh my god a few more times.
The entire experience, from smoking the second bowl to reverting to relative normalcy, lasted 28 minutes. It was simply as though another reality took place. It was nothing like a lucid dream state. No fog, very clear, very vivid, amazingly complex and almost frightening. I do have to say I did enjoy the experience. Though it was difficult for me to deal with the situation because I felt as though a blind man seeing for the first time or a baby seeing the world for the firs time. I was not really terrified at the idea though, because my reality seemed like a nice one that might've been better than the odd reality we deal with every day.
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.


Families of children with social challenges must have access to many resources in order to in aid their development. Our research investigates if our interactive, specialized, and affordable technology can be a beneficial resource. Our project is aimed at children with autism; many children with autism struggle making eye contact, preventing them from interacting and connecting with others. The beta web application that we have developed seeks to improve eye movement by encouraging users to make and maintain eye contact with an engaging video in order to gain points. The layout of the game leads the user from more basic to more complex and stressful levels, easing the user into more challenging situations as they progress. This teaches eye contact skills through a fun game and aids as a practice mechanism. While the user is working and playing with the application, our eye-tracking software and algorithm is able to track their progress and measure the amount of eye contact the child maintains with the visual. Additionally, our visual encourages the user to answer questions that can help children identify and express their feelings. Our goal is to make interactions feel more comfortable and less stressful. Our entertaining, interactive application can hopefully become a beneficial resource to those with social skill deficits.
Jenna Kronenberg is in the 10th grade at Harvard-Westlake. She is interested in computer programming and robotics. She also dances and plays the flute.
Stephanie Cho enjoys coding and robotics. She is a sophomore at Harvard-Westlake School where she also sings and plays field hockey. She is a big fan of film and Michael Cera.
Caroline Kaleel is a web developer and professional electrical designer. She is a sophomore at Harvard-Westlake, and spends her free time fencing and playing the saxophone.
Andrew Theiss is a robotics coach at Harvard-Westlake. You may think his middle name is Steven but that's fake news, it's actually "Robotics". He's a proud mentor of the robotics team at HW and is excited to assist in it's future in every possible way.


Ween add more tour dates, playing New Haven before NYC
by Andrew SacherWeen continue to gradually announce tour dates, and they just added a New Haven show happening February 13 at College Street Music Hall, which is directly before their two previously announced NYC shows (2/14 & 2/15 at Terminal 5). Tickets for the New Haven show go on sale Thursday (11/21) at 10 AM. Tickets for the NYC shows are still available.
Ween also recently announced a three-night ‘March Mitzvah’ run at Las Vegas’ Brooklyn Bowl, happening 3/19-3/21 (three-day and single-day passes), and they have a previously-announced Boston/Philly run in December. Updated dates are listed below.
Ween — 2019/2020 Tour Dates
12/13 House of Blues Boston, MA
12/14 The Met Philadelphia, PA
2/13 College Street Music hall New Haven, CT
2/14 Terminal 5 New York, NY
2/15 Terminal 5 New York, NY
3/19 Brooklyn Bowl Las Vegas, NV
3/20 Brooklyn Bowl Las Vegas, NV
3/21 Brooklyn Bowl Las Vegas, NV


Ken's Cheese House
34 Chatley Avenue
Seattle, WA 98765
May 27, 2021
Fred Flintstone
Sales Manager
Cheese Specialists Inc.
456 Rubble Road
Rockville, IL 7877
Dear Mr. Flintstone,
With reference to our telephone conversation today, I am writing
to confirm your order for: 120 x Cheddar Deluxe Ref. No. 856.
The order will be shipped wtihin three days via UPS and should
arrive at your store in about 10 days.
Please contact us again if we can help in any way.
Yours sincerely,
Kenneth Beare
Director of Ken's Cheese House


Depending on browser support: A timepicker might pop-up when you enter the input field.
Note: type="time" is not supported in IE12 and earlier.


Thank you for purchasing our template. We hope that you find all your questions regarding this Template answered in this Documentation as much in details as possible. However, if you still need support, do not hesitate to contact us at our support forum for this Template. If you have any questions that are beyond the scope of this help file, please feel free to email me. Thanks so much!
Clinicom is a Responsive quick and easy customizable Modern Multipurpose Medical & Health Template that comes with 18+ valid HTML5 pages and 8 Home page variations. Clinicom offers numerous awesome features like , clinic, cardiology, surgery, dentist, optometrist, laboratory, general hospital, cosmetic surgery, pediatric clinic, veterinary, psychiatrist, physiatrist or your just a Blog Our demos work for one doctor office and private practices with more medical specialtie. Well commented code, well-documented file structure and 24/7 professional and ultra-fast Support.
To edit this template with your info you will need a code editor, i use Sublime Text (http://www.sublimetext.com/3) and a browser i recommend to use Google Chrome.
It is really easy to use. There is multiple home page layouts to chose, also various selection of pages that you can use to create your website, but you can also create your own page layouts very easily (just copy and paste code form the elements examples).
When you start editing the template with your info is good idea to create separate folder, copy the assets folder and 404.html page there, rename one of the index... files to index.html and then move and edit pages that you will use. Also is good practice to create separate styleseet for your edits and load it bellow Clinicom CSS.
Follow the steps below to setup your site template:
HTML/css
- Stylesheet filesHTML/fonts
– Icon font filesHTML/img
- Image filesHTML/js
- Javacript filesOnce you download the template, you can see a folder with several files and sub folders. You can read description of some important files in continue.
Clinicom follows a simple and easy to customize coding structure. Here is the sample for your reference:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Clinicom - Medical & Health Template Template</title>
<!-- ========== Start Stylesheet ========== -->
<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<link href="assets/css/font-awesome.min.css" rel="stylesheet">
<link href="assets/css/themify-icons.css" rel="stylesheet">
<link href="assets/css/magnific-popup.css" rel="stylesheet">
<link href="assets/css/owl.carousel.min.css" rel="stylesheet">
<link href="assets/css/owl.theme.default.min.css" rel="stylesheet">
<link href="assets/css/animate.css" rel="stylesheet">
<link href="assets/css/bootsnav.css" rel="stylesheet">
<link href="assets/style.css" rel="stylesheet">
<link href="assets/css/responsive.css" rel="stylesheet">
<link href="style.css" rel="stylesheet">
</head>
<body>
<!-- Start Navigation -->
<nav class="navbar navbar-default navbar-fixed white no-background bootsnav">
</nav>
<!-- End Navigation-->
<!-- Start Main
============================================= --->
<main>
</main>
<!-- END Main Content -->
<!-- Star Footer
============================================= -->
<footer>
</footer>
<!-- End Footer -->
<!-- jQuery Frameworks
============================================= -->
<script src="assets/js/jquery-1.12.4.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/equal-height.min.js"></script>
<script src="assets/js/jquery.appear.js"></script>
<script src="assets/js/jquery.easing.min.js"></script>
<script src="assets/js/jquery.magnific-popup.min.js"></script>
<script src="assets/js/modernizr.custom.13711.js"></script>
<script src="assets/js/owl.carousel.min.js"></script>
<script src="assets/js/wow.min.js"></script>
<script src="assets/js/progress-bar.min.js"></script>
<script src="assets/js/isotope.pkgd.min.js"></script>
<script src="assets/js/imagesloaded.pkgd.min.js"></script>
<script src="assets/js/count-to.js"></script>
<script src="assets/js/bootsnav.js"></script>
<script src="assets/js/custom.js"></script>
</body>
</html>
Clinicom uses 1 fonts: Inter from the Google Fonts Library. You can change the fonts by following code
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;600;700;800&display=swap');
We would really love to take this opportunity to appreciate guys whose items were helpful to us to make Clinicom a really beautiful theme for our awesome users:


{# ## This file is part of Flask-OAuth2Server ## Copyright (C) 2014 CERN. ## ## Flask-OAuth2Server is free software; you can redistribute it and/or ## modify it under the terms of the Revised BSD License; see LICENSE ## file for more details. #} {%- import "accounts/settings/helpers.html" as helpers with context %} {% extends "page.html" %} {% block body %}
| {{group.grouper}} |
|
{{client.description}}
{% endif %} {% if client.website %}{% endif %}