Hannibal, as a city, may have many sins to answer for, but ingratitude is not one of them, or reverence for the great men she has produced, and as the years go by her greatest son, Mark Twain, or S. L. Clemens as a few of the unlettered call him, grows in the estimation and regard of the residents of the town he made famous and the town that made him famous. His name is associated with every old building that is torn down to make way for the modern structures demanded by a rapidly growing city, and with every hill or cave over or through which he might by any possibility have roamed, while the many points of interest which he wove into his stories, such as Holiday Hill, Jackson's Island, or Mark Twain Cave, are now monuments to his genius. Hannibal is glad of any opportunity to do him honor as he had honored her. So it has happened that the "old timers" who went to school with Mark or were with him on some of his usual escapades have been honored with large audiences whenever they were in a reminiscent mood and condescended to tell of their intimacy with the ordinary boy who came to be a very extraordinary humorist and whose every boyish act is now seen to have been indicative of what was to come. Like Aunt Becky and Mrs. Clemens, they can now see that Mark was hardly appreciated when he lived here and that the things he did as a boy and was whipped for doing were not all bad, after all. So they have been in no hesitancy about drawing out the bad things he did as well as the good in their efforts to get a "Mark Twain" story, all incidents being viewed in the light of his present fame, until the volume of "Twainiana" is already considerable and growing in proportion as the "old timers" drop away and the stories are retold second and third hand by their descendants. With some seventy-three years young and living in a villa instead of a house, he is a fair target, and let him incorporate, copyright, or patent himself as he will, there are some of his "works" that will go swooping up Hannibal chimneys as long as graybeards gather about the fires and begin with, "I've heard father tell," or possibly, "Once when I." The Mrs. Clemens referred to is my mother—was my mother.
And here is another extract from a Hannibal paper, of date twenty days ago:
Miss Becca Blankenship died at the home of William Dickason, 408 Rock Street, at 2.30 o'clock yesterday afternoon, aged 72 years. The deceased was a sister of "Huckleberry Finn," one of the famous characters in Mark Twain's Tom Sawyer. She had been a member of the Dickason family—the housekeeper— for nearly forty-five years, and was a highly respected lady. For the past eight years she had been an invalid, but was as well cared for by Mr. Dickason and his family as if she had been a near relative. She was a member of the Park Methodist Church and a Christian woman.
I remember her well. I have a picture of her in my mind which was graven there, clear and sharp and vivid, sixty-three years ago. She was at that time nine years old, and I was about eleven. I remember where she stood, and how she looked; and I can still see her bare feet, her bare head, her brown face, and her short tow-linen frock. She was crying. What it was about I have long ago forgotten. But it was the tears that preserved the picture for me, no doubt. She was a good child, I can say that for her. She knew me nearly seventy years ago. Did she forget me, in the course of time? I think not. If she had lived in Stratford in Shakespeare's time, would she have forgotten him? Yes. For he was never famous during his lifetime, he was utterly obscure in Stratford, and there wouldn't be any occasion to remember him after he had been dead a week.
"Injun Joe," "Jimmy Finn," and "General Gaines" were prominent and very intemperate ne'er-do-weels in Hannibal two generations ago. Plenty of grayheads there remember them to this day, and can tell you about them. Isn't it curious that two "town drunkards" and one half-breed loafer should leave behind them, in a remote Missourian village, a fame a hundred times greater and several hundred times more particularized in the matter of definite facts than Shakespeare left behind him in the village where he had lived the half of his lifetime?
MARK TWAIN
End of the Project Gutenberg EBook of What Is Man?  AND OTHER STORIES *** ***** This file should be named 70-h.htm or 70-h.zip ***** This and all associated files of various formats will be found in: http://www.gutenberg.org/7/70/ Produced by An Anonymous Volunteer, and David Widger Updated editions will replace the previous one--the old editions will be renamed. Creating the works from public domain print editions means that no one owns a United States copyright in these works, so the Foundation (and you!) can copy and distribute it in the United States without permission and without paying copyright royalties. Special rules, set forth in the General Terms of Use part of this license, apply to copying and distributing Project Gutenberg-tm electronic works to protect the PROJECT GUTENBERG-tm concept and trademark. Project Gutenberg is a registered trademark, and may not be used if you charge for the eBooks, unless you receive specific permission. If you do not charge anything for copies of this eBook, complying with the rules is very easy. You may use this eBook for nearly any purpose such as creation of derivative works, reports, performances and research. They may be modified and printed and given away--you may do practically ANYTHING with public domain eBooks. Redistribution is subject to the trademark license, especially commercial redistribution. *** START: FULL LICENSE *** THE FULL PROJECT GUTENBERG LICENSE PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK To protect the Project Gutenberg-tm mission of promoting the free distribution of electronic works, by using or distributing this work (or any other work associated in any way with the phrase “Project Gutenberg”), you agree to comply with all the terms of the Full Project Gutenberg-tm License (available with this file or online at http://gutenberg.org/license). Section 1. General Terms of Use and Redistributing Project Gutenberg-tm electronic works 1.A. By reading or using any part of this Project Gutenberg-tm electronic work, you indicate that you have read, understand, agree to and accept all the terms of this license and intellectual property (trademark/copyright) agreement. If you do not agree to abide by all the terms of this agreement, you must cease using and return or destroy all copies of Project Gutenberg-tm electronic works in your possession. If you paid a fee for obtaining a copy of or access to a Project Gutenberg-tm electronic work and you do not agree to be bound by the terms of this agreement, you may obtain a refund from the person or entity to whom you paid the fee as set forth in paragraph 1.E.8. 1.B. “Project Gutenberg” is a registered trademark. It may only be used on or associated in any way with an electronic work by people who agree to be bound by the terms of this agreement. There are a few things that you can do with most Project Gutenberg-tm electronic works even without complying with the full terms of this agreement. See paragraph 1.C below. There are a lot of things you can do with Project Gutenberg-tm electronic works if you follow the terms of this agreement and help preserve free future access to Project Gutenberg-tm electronic works. See paragraph 1.E below. 1.C. The Project Gutenberg Literary Archive Foundation (“the Foundation” or PGLAF), owns a compilation copyright in the collection of Project Gutenberg-tm electronic works. Nearly all the individual works in the collection are in the public domain in the United States. If an individual work is in the public domain in the United States and you are located in the United States, we do not claim a right to prevent you from copying, distributing, performing, displaying or creating derivative works based on the work as long as all references to Project Gutenberg are removed. Of course, we hope that you will support the Project Gutenberg-tm mission of promoting free access to electronic works by freely sharing Project Gutenberg-tm works in compliance with the terms of this agreement for keeping the Project Gutenberg-tm name associated with the work. You can easily comply with the terms of this agreement by keeping this work in the same format with its attached full Project Gutenberg-tm License when you share it without charge with others. 1.D. The copyright laws of the place where you are located also govern what you can do with this work. Copyright laws in most countries are in a constant state of change. If you are outside the United States, check the laws of your country in addition to the terms of this agreement before downloading, copying, displaying, performing, distributing or creating derivative works based on this work or any other Project Gutenberg-tm work. The Foundation makes no representations concerning the copyright status of any work in any country outside the United States. 1.E. Unless you have removed all references to Project Gutenberg: 1.E.1. The following sentence, with active links to, or other immediate access to, the full Project Gutenberg-tm License must appear prominently whenever any copy of a Project Gutenberg-tm work (any work on which the phrase “Project Gutenberg” appears, or with which the phrase “Project Gutenberg” is associated) is accessed, displayed, performed, viewed, copied or distributed: This eBook is for the use of anyone anywhere at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org 1.E.2. If an individual Project Gutenberg-tm electronic work is derived from the public domain (does not contain a notice indicating that it is posted with permission of the copyright holder), the work can be copied and distributed to anyone in the United States without paying any fees or charges. If you are redistributing or providing access to a work with the phrase “Project Gutenberg” associated with or appearing on the work, you must comply either with the requirements of paragraphs 1.E.1 through 1.E.7 or obtain permission for the use of the work and the Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or 1.E.9. 1.E.3. If an individual Project Gutenberg-tm electronic work is posted with the permission of the copyright holder, your use and distribution must comply with both paragraphs 1.E.1 through 1.E.7 and any additional terms imposed by the copyright holder. Additional terms will be linked to the Project Gutenberg-tm License for all works posted with the permission of the copyright holder found at the beginning of this work. 1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm License terms from this work, or any files containing a part of this work or any other work associated with Project Gutenberg-tm. 1.E.5. Do not copy, display, perform, distribute or redistribute this electronic work, or any part of this electronic work, without prominently displaying the sentence set forth in paragraph 1.E.1 with active links or immediate access to the full terms of the Project Gutenberg-tm License. 1.E.6. You may convert to and distribute this work in any binary, compressed, marked up, nonproprietary or proprietary form, including any word processing or hypertext form. However, if you provide access to or distribute copies of a Project Gutenberg-tm work in a format other than “Plain Vanilla ASCII” or other format used in the official version posted on the official Project Gutenberg-tm web site (www.gutenberg.org), you must, at no additional cost, fee or expense to the user, provide a copy, a means of exporting a copy, or a means of obtaining a copy upon request, of the work in its original “Plain Vanilla ASCII” or other form. Any alternate format must include the full Project Gutenberg-tm License as specified in paragraph 1.E.1. 1.E.7. Do not charge a fee for access to, viewing, displaying, performing, copying or distributing any Project Gutenberg-tm works unless you comply with paragraph 1.E.8 or 1.E.9. 1.E.8. You may charge a reasonable fee for copies of or providing access to or distributing Project Gutenberg-tm electronic works provided that - You pay a royalty fee of 20% of the gross profits you derive from the use of Project Gutenberg-tm works calculated using the method you already use to calculate your applicable taxes. The fee is owed to the owner of the Project Gutenberg-tm trademark, but he has agreed to donate royalties under this paragraph to the Project Gutenberg Literary Archive Foundation. Royalty payments must be paid within 60 days following each date on which you prepare (or are legally required to prepare) your periodic tax returns. Royalty payments should be clearly marked as such and sent to the Project Gutenberg Literary Archive Foundation at the address specified in Section 4, “Information about donations to the Project Gutenberg Literary Archive Foundation.” - You provide a full refund of any money paid by a user who notifies you in writing (or by e-mail) within 30 days of receipt that s/he does not agree to the terms of the full Project Gutenberg-tm License. You must require such a user to return or destroy all copies of the works possessed in a physical medium and discontinue all use of and all access to other copies of Project Gutenberg-tm works. - You provide, in accordance with paragraph 1.F.3, a full refund of any money paid for a work or a replacement copy, if a defect in the electronic work is discovered and reported to you within 90 days of receipt of the work. - You comply with all other terms of this agreement for free distribution of Project Gutenberg-tm works. 1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm electronic work or group of works on different terms than are set forth in this agreement, you must obtain permission in writing from both the Project Gutenberg Literary Archive Foundation and Michael Hart, the owner of the Project Gutenberg-tm trademark. Contact the Foundation as set forth in Section 3 below. 1.F. 1.F.1. Project Gutenberg volunteers and employees expend considerable effort to identify, do copyright research on, transcribe and proofread public domain works in creating the Project Gutenberg-tm collection. Despite these efforts, Project Gutenberg-tm electronic works, and the medium on which they may be stored, may contain “Defects,” such as, but not limited to, incomplete, inaccurate or corrupt data, transcription errors, a copyright or other intellectual property infringement, a defective or damaged disk or other medium, a computer virus, or computer codes that damage or cannot be read by your equipment. 1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the “Right of Replacement or Refund” described in paragraph 1.F.3, the Project Gutenberg Literary Archive Foundation, the owner of the Project Gutenberg-tm trademark, and any other party distributing a Project Gutenberg-tm electronic work under this agreement, disclaim all liability to you for damages, costs and expenses, including legal fees.   LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a defect in this electronic work within 90 days of receiving it, you can receive a refund of the money (if any) you paid for it by sending a written explanation to the person you received the work from. If you received the work on a physical medium, you must return the medium with your written explanation. The person or entity that provided you with the defective work may elect to provide a replacement copy in lieu of a refund. If you received the work electronically, the person or entity providing it to you may choose to give you a second opportunity to receive the work electronically in lieu of a refund. If the second copy is also defective, you may demand a refund in writing without further opportunities to fix the problem. 1.F.4. Except for the limited right of replacement or refund set forth in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE. 1.F.5. Some states do not allow disclaimers of certain implied warranties or the exclusion or limitation of certain types of damages. If any disclaimer or limitation set forth in this agreement violates the law of the state applicable to this agreement, the agreement shall be interpreted to make the maximum disclaimer or limitation permitted by the applicable state law. The invalidity or unenforceability of any provision of this agreement shall not void the remaining provisions. 1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the trademark owner, any agent or employee of the Foundation, anyone providing copies of Project Gutenberg-tm electronic works in accordance with this agreement, and any volunteers associated with the production, promotion and distribution of Project Gutenberg-tm electronic works, harmless from all liability, costs and expenses, including legal fees, that arise directly or indirectly from any of the following which you do or cause to occur: (a) distribution of this or any Project Gutenberg-tm work, (b) alteration, modification, or additions or deletions to any Project Gutenberg-tm work, and (c) any Defect you cause. Section 2. Information about the Mission of Project Gutenberg-tm Project Gutenberg-tm is synonymous with the free distribution of electronic works in formats readable by the widest variety of computers including obsolete, old, middle-aged and new computers. It exists because of the efforts of hundreds of volunteers and donations from people in all walks of life. Volunteers and financial support to provide volunteers with the assistance they need, are critical to reaching Project Gutenberg-tm's goals and ensuring that the Project Gutenberg-tm collection will remain freely available for generations to come. In 2001, the Project Gutenberg Literary Archive Foundation was created to provide a secure and permanent future for Project Gutenberg-tm and future generations. To learn more about the Project Gutenberg Literary Archive Foundation and how your efforts and donations can help, see Sections 3 and 4 and the Foundation web page at http://www.pglaf.org. Section 3. Information about the Project Gutenberg Literary Archive Foundation The Project Gutenberg Literary Archive Foundation is a non profit 501(c)(3) educational corporation organized under the laws of the state of Mississippi and granted tax exempt status by the Internal Revenue Service. The Foundation's EIN or federal tax identification number is 64-6221541. Its 501(c)(3) letter is posted at http://pglaf.org/fundraising. Contributions to the Project Gutenberg Literary Archive Foundation are tax deductible to the full extent permitted by U.S. federal laws and your state's laws. The Foundation's principal office is located at 4557 Melan Dr. S. Fairbanks, AK, 99712., but its volunteers and employees are scattered throughout numerous locations. Its business office is located at 809 North 1500 West, Salt Lake City, UT 84116,<PHONE_NUMBER>, email<EMAIL_ADDRESS>Email contact links and up to date contact information can be found at the Foundation's web site and official page at http://pglaf.org For additional contact information: Dr. Gregory B. Newby Chief Executive and Director<EMAIL_ADDRESS>Section 4. Information about Donations to the Project Gutenberg Literary Archive Foundation Project Gutenberg-tm depends upon and cannot survive without wide spread public support and donations to carry out its mission of increasing the number of public domain and licensed works that can be freely distributed in machine readable form accessible by the widest array of equipment including outdated equipment. Many small donations ($1 to $5,000) are particularly important to maintaining tax exempt status with the IRS. The Foundation is committed to complying with the laws regulating charities and charitable donations in all 50 states of the United States. Compliance requirements are not uniform and it takes a considerable effort, much paperwork and many fees to meet and keep up with these requirements. We do not solicit donations in locations where we have not received written confirmation of compliance. To SEND DONATIONS or determine the status of compliance for any particular state visit http://pglaf.org While we cannot and do not solicit contributions from states where we have not met the solicitation requirements, we know of no prohibition against accepting unsolicited donations from donors in such states who approach us with offers to donate. International donations are gratefully accepted, but we cannot make any statements concerning tax treatment of donations received from outside the United States. U.S. laws alone swamp our small staff. Please check the Project Gutenberg Web pages for current donation methods and addresses. Donations are accepted in a number of other ways including checks, online payments and credit card donations. To donate, please visit: http://pglaf.org/donate Section 5. General Information About Project Gutenberg-tm electronic works. Professor Michael S. Hart is the originator of the Project Gutenberg-tm concept of a library of electronic works that could be freely shared with anyone. For thirty years, he produced and distributed Project Gutenberg-tm eBooks with only a loose network of volunteer support. Project Gutenberg-tm eBooks are often created from several printed editions, all of which are confirmed as Public Domain in the U.S. unless a copyright notice is included. Thus, we do not necessarily keep eBooks in compliance with any particular paper edition. Most people start at our Web site which has the main PG search facility: http://www.gutenberg.org This Web site includes information about Project Gutenberg-tm, including how to make donations to the Project Gutenberg Literary Archive Foundation, how to help produce our new eBooks, and how to subscribe to our email newsletter to hear about new eBooks.


Things You'd Like to Know!
It uses utility classes for typography and spacing to space content out within the larger container.
Learn more


Michelle Visage was lined up for EastEnders: 'I believe I am Kat's cousin'
Michelle Visage has revealed she was once asked to join EastEnders for a guest role and suddenly we’ve never wanted anything more.
The Drag Race superstar – who finally cleared up her supposed ‘feud’ with Cheryl this week – is an icon wherever she steps foot and would no doubt go down a storm with the residents of Walford.
Could Michelle be Kat Moon’s long lost American twin? Easily, and the Strictly Come Dancing star revealed her cameo was agonisingly close to happening until former showrunner Dominic Treadwell-Collins stepped down as EastEnders boss.
However, the offer is still on the table and she’s ready for her soap debut.
Advertisement Advertisement
She told Good Housekeeping magazine that she prefers EastEnders to Coronation Street because ‘I believe I am Kat [Moon’s] American cousin.’
‘I’m still vying for that guest role,’ she teased.
Naturally, Jessie Wallace is totally on board too and tweeted: ‘I believe this too! @michellevisage.’
Michelle was eliminated from Strictly Come Dancing on Sunday night after her impassioned nod to the LGBTQ+ community fell on deaf ears.
The mum-of-two vogued to Madonna as a nod to her gay brothers and sisters, but was slammed by viewers who claimed ‘voguing isn’t dancing’.
Understandably, the force of nature fired back with a heroic post.
EastEnders continues tonight at 8pm on BBC One. Strictly Come Dancing returns tomorrow at 7pm, also on BBC One.
Got a showbiz story?
If you've got a story, video or pictures get in touch with the Metro.co.uk Entertainment team by emailing us<EMAIL_ADDRESS>calling 020 3615 2145 or by visiting our Submit Stuff page - we'd love to hear from you.


I was asked to provide the list of food sources that I mentioned in my FutureRuby presentation. So here they are. My source for the information is Prescription for Nutritional Healing by Balch & Balch. I used the third edition but I believe the fourth edition is the most current. This is one of my most used reference books when it comes to nutrition.
Calcium
:: dairy foods,salmon (with bones), sardines, seafood, dark green leafy vegetables, almonds, asparagus, blackstrap molasses, brewer's yeast, broccoli, buttermilk, cabbage, carob, cheese, collards, dandelion greens, dulse, figs, filberts, goat's milk, kale, kelp, milk, mustard greens, oats, prunes, sesame seeds, soybeans, tofu, turnip greens, watercress, whey and yogurt
Iron
:: eggs, fish, liver, meat, poultry, green leafy vegetables, whole grains, enriched breads & cereals, almonds, avocados, beets, blackstrap molasses, brewer's yeast, dates, dulse, kelp, kidney beans, lima beans, lentils, millet, peaches, pears, prunes, pumpkin, raisins, rice bran, wheat bran, sesame seeds, soybeans, watercress
Sodium
:: most foods
Potassium
:: dairy foods, fish, fruit, legumes, meat, poultry, vegetables, whole grains, apricots, avocados, bananas, lima beans, blackstrap molasses, brewer's yeast, brown rice, dates, dulse, figs, dried fruit, garlic, nuts, potatoes, raisins, spinach, winter squash, tortula yeast, wheat bran, yams, yogurt
B Vitamins
:: brown rice, egg yolks, fish, legumes, liver, peanuts, peas, pork, poultry, rice bran, wheat germ, whole grains, asparagus, avocados, brewer's yeast, broccoli, brussel sprouts, cheese, currants, dandelion greens, dates, dulse, kelp, molasses, milk, nuts, oatmeal, plums, prunes, raisins, royal jelly, spinach, spirulina, sunflower seeds, walnuts, watercress
Vitamin D
:: fish liver oil, fatty saltwater fish, dairy products, eggs, butter, dandelion greens, halibut, liver, milk, oatmeal, salmon, sardines, sweet potatoes, tuna, vegetable oil; your body can also manufacture Vitamin D from sunshine on your skin
Essential Fatty Acids
:: emu oil, fish oil, flaxseeds & flaxseed oil, hempseeds & hempseed oil, grapeseed oil, borage oil, olive oil


Touhcless Access Page
Click the anmeity you would like to use
QR Code Reader
Touchless ID Card access


Since I'm engaged with the problems caused by distributed system I want to extend my knowledge towards that direction. One programing language that is created for this purpose is Erlang / Elixir. The other language I'm interested in is Golang since it solves the two biggest disadvantage of Node.js which are: lack of type system and single threaded nature.
I'm also interested in robotics, and bionics, I would like to learn about those things and use my skills outside of virtual context


Cloudiolab
The guy you are looking for is not here.
Please go to the main URL:
https://me.cloudiolab.com/
.


User Information
Name:
Age:
Country of Origin:
Diagonal Screen Size:
in
Screen Resolution:
x
px
Distance from Screen:
mm
Date:
Time (24 hr):
Download form as text file:
Previous
Next


Docker with Pycharm
In this tutorial we will learn how to use pycharm along with Docker and we are also going to learn how to use the docker as a interpreter in pycharm for compiling the code.
Docker
Many developers are struggling with the deployment of their programs. Sometimes it is easy to deliver a program, but to deliver the running environment for that program is not that easy. Docker is the delivery of environments, and we can also use these predefined environments to run specific programs, such as Ubuntu and Apache (a server end program). Docker is a sort of flexible “virtual machine”, providing the minimum environment for your programs, and the environment has little relationship with the host/local physical machine.
Pycharm
PyCharm is an integrated development environment (IDE) used in computer programming, specifically for the Python language. It is developed by the Czech company JetBrains. It provides code analysis, a graphical debugger, an integrated unit tester, integration with version control systems (VCSes), and supports web development with Django as well as data science with Anaconda. PyCharm is cross-platform, with Windows, macOS and Linux versions. The Community Edition is released under the Apache License,[8] and there is also Professional Edition with extra features – released under a proprietary license. We are mostly going to use the pycharm professional as they provide it free for the students.
Install Docker to your PC
In this tutorial, I am going to install docker in Windows and Mac
Install Docker. The only component we have to install. Download the installer from the Windows, Mac download page and run it. After the installation, reboot the computer.
You can also refer Docker Tutorial for step by step method explaining how to install the docker version to your workstation.
To Get Started
In order to get started open the pycharm and run the docker desktop
1. Click on File --> Settings --> Build, Execution, Deployment --> Docker
2. Select the docker and add the docker container inside the window using + icon
3. Once the connection is successful now we can create the Dockerfile without any file extension
Type the following code in the Dockerfile
FROM python:3
ADD src /src
RUN pip install pystrich
CMD [ "python", "./src/myscript.py" ]
commit the changes
create the myscript.py(it has to be reference of file we entered inside Dockerfile.
Type the following code in the myscript.py
# Sample taken from pyStrich GitHub repository
# https://github.com/mmulqueen/pyStrich
from pystrich.datamatrix import DataMatrixEncoder
encoder = DataMatrixEncoder('This is a DataMatrix.')
encoder.save('./datamatrix_test.png')
print(encoder.get_ascii())
Commit the changes
In order to run the configuration, first we have to press on Edit Run/Debug Configuration
Click on the + mark and then click on Dockerfile
As the Dockerfile is selected we have to edit the configurations as
As we selected everything click on apply and ok
When we press Run Dockerfile. The docker service start running installing the necessary packages and the file is output
As all the process is done successfully. The interpreter can be added by clicking on edit python intepreter
As we click on add interpreter select Docker --> [image name: pythonprogramimage] which is same as the image tag of the intepreter used to run Dockerfile
Commit and push the changes to github


| Interface | Description |
|---|---|
| DecoderListener |
Listener interface for handling a multiple decode result from the Decoder API
|
| Class | Description |
|---|---|
| DecodeOptions |
Decode options class defining various decode settings
|
| Decoder | |
| DecoderConfigValues |
These are the various classes used for configuring the decoder functionality
|
| DecoderConfigValues.EngineID |
Engine ID class that defines the engine ID.
|
| DecoderConfigValues.EngineType |
Engine Type class that defines the engine type
|
| DecoderConfigValues.LightsMode |
Lights Mode class that defines the lights mode settings
|
| DecoderConfigValues.OCRMode |
OCR Mode class that defines the mode settings
|
| DecoderConfigValues.OCRTemplate |
OCR Template class that defines the OCR predefined templates
|
| DecoderConfigValues.SymbologyID |
Symbology ID class that defines the supported symbology IDs.
|
| DecodeResult |
Used to store decoded results data
|
| DecoderException.ResultID |
Exception result codes for all functions.
|
| DecodeWindowing |
Used for configuring a Decode Window
|
| DecodeWindowing.DecodeWindow |
Decode Window coordinate settings.
|
| DecodeWindowing.DecodeWindowLimits |
Decode Window Min/Max Limits that are allowed to be
specified.
|
| DecodeWindowing.DecodeWindowMode |
Decode Window Mode setting.
|
| DecodeWindowing.DecodeWindowShowWindow |
Show Decode Window setting to ensure the appropriate
window is being set for application (for debug purposes).
|
| ExposureValues | |
| ExposureValues.ConformImage |
ConformImage class that defines whether or not the image should conform
to exposure settings.
|
| ExposureValues.ExposureMethod | Deprecated
ExposureMethod class that defines the auto exposure method that will be
used during image capture.
|
| ExposureValues.ExposureMode |
ExposureMode class that defines the exposure mode that will be
used during image capture.
|
| ExposureValues.ExposureSettings |
ExpsoureSettings class that defines most common setting used during image
acquisition.
|
| HalInterface |
Decode options class defining various decode settings
|
| ImageAttributes |
Image Attributes class defining image information
|
| ImagerProperties |
Imager properties of connected engine.
|
| IQImagingProperties |
IQ Imaging Class
|
| IQImagingProperties.IQImageFormat |
Defines the supported image formats for Intelligent Imaging
|
| SymbologyConfig |
Symbology configuration for setting symbology settings.
|
| Exception | Description |
|---|---|
| DecoderException |
Decode Exception error code.
|


Yeah, so it turns out you can’t give everyone a free lambo with linear rewards and then quadruple the Dank Amps (rewards) of those mega votes without consequences. In this case we’re watching the rewards pool drain.
Definition
auto-self
vo- vote
rotic- sexy time
Asphiyxiation- Death by lack of air
What we’re doing
We’re literally strangling ourselves right now. The Circle Jerk was sooo huge that it’s just started eating the rewards pool. That first day when we were giving $8K to some of the biggest authors is more akin to promising them like 7% of the rewards pool, but we did it to multiple authors, and everyone else was making more, so we promised more than 100% of the rewards pool that day. So, it drained.
@me-tarzan and his reward pool tracking
That image is from his post this week of - https://steemit.com/steemit/@me-tarzan/rewards-pool-i-have-charted-the-waters-for-you-june-27-2017
As you can see the reward pool is going down. Look at the slope of that curve.
(@me-tarzan Thanks for tracking that. I should probably ask you about including it here, but I’m also promoting you and your post. I’m a little unclear on the ethics. HMU if you feel robbed by me in addition to robbed by the pool)
My rewards were shrinking after my post earned
That slope remind you of any other?  It looks kinda looks like the drain on the reward pool! Correlation isn’t causation, but I’m going out on a limb and saying what I’m seeing are linked.
So, what happens next?
What happens next is that the reward pool is going to drain until it reaches equilibrium with the speed with which these mega votes are draining it. It’ll look like the post rewards in trending and other places have stabilized and are now lower (/cheer) but what has happened is the biggest giveaway to already rich posters and that much given to them has lowered the rewards of everyone else and will continue to do so until it stabilizes more (/stopcheeringandcryinside).
Funs over everyone. Go back to where you were before. Yes your minnow vote is worth more, but with the pool drained by the top posters it’s gonna even out and ultimately not really help you. Sorry your views are down, sorry you can’t vote on more than 10 things a day without draining your voting power, and sorry this may have killed your inter-minnow communication thing too. But we handed out a lot of steem to the richest among us and biggest users among us. So it was all worth it!
It’s gonna look like a victory cause trending is down, but we just handed a lot higher of a percent to the biggest authors of what is now a much smaller pool for everyone. I think I remember reading someone suggesting there might be issues with this HF and some unintended consequences of it…
Side note Curation and Comments are up!!!
Hey, well at least here’s a victory everyone will agree is a great thing. Commenting has gone up TWOFOLD since this hardfork. People are now actively commenting more and literally twice as much of the reward pool is going there.
It’s probably just self voting and stealing more from all of us
Yeah, so you noticed all those $100+ comments peeps are spraying all over themselves now? Yeah… well it turns out that drains the pool too. Pretty sure we didn’t all miraculously decide to love one another’s posts more and spend twice as much in the comments section on someone else. We’re now just mooning our own comments. So, sad panda on that.
A radical idea
Can we go back to 40 votes for starters? It seems part, if not all of this, was a bad idea. I remember someone saying something about this being a bad idea before I got here too… Here’s some perspective from the white paper (@dantheman).
In order to realign incentives and discourage individuals from simply voting for themselves, money must be distributed in a nonlinear manner. For example a quadratic function in votes, i.e., someone with twice the votes of someone else should receive four times the payout and someone with three times the votes should receive nine times the payout. In other words, the reward is proportional to votes2rather than votes. This mirrors the value of network effect which grows with n2the number of participants, according to Metcalfe’s Law
Assuming all users have equal stake, someone who only receives their own vote will receive much less than someone who receives votes from 100 different users. This encourages users to cooperate to vote for the same things to maximize the payout. This system also creates financial incentive to collude where everyone votes on one thing and then divides the reward equally among themselves.
Other than that Everything IS AWESOME!!!!
We ultimately have a distribution problem. Back end hacking linear rewards was meant to fix that. It appears to have worked out well in some ways and had some pretty crappy consequences in others
Vote for @aggroed for witness.
This page is synchronized from the post: ‘Autovorotic Asphyxiation- The MEGA CIRCLE JERK is choking-out itself through the rewards pool’


Ipsum dolor amet tongue short ribs strip steak cupim, ground round turducken corned beef kevin sausage pork belly turkey pork chop burgdoggen.
Bacon ipsum dolor amet cow burgdoggen landjaeger jerky turducken rump beef doner beef ribs capicola shoulder corned beef short loin. Fatback tail cow burgdoggen, porchetta pork ham hamburger biltong. Doner sausage pork ham, pastrami porchetta meatball beef ribs sirloin tri-tip prosciutto ham hock. Doner turducken ham hock alcatra bresaola burgdoggen capicola beef ribs. Chuck pork chop prosciutto, chicken pancetta meatloaf ground round spare ribs strip steak beef flank picanha short ribs.  Shank short loin tongue andouille pork loin hamburger.
Venison frankfurter short loin t-bone pork ground round filet mignon hamburger cupim tail corned beef shankle. Andouille cow beef, salami picanha venison sausage leberkas. Beef ribs meatball doner ham, ground round burgdoggen kielbasa chuck. Hamburger tail spare ribs chicken. Pig drumstick kielbasa chuck kevin ham, shoulder filet mignon picanha strip steak t-bone pancetta hamburger.


Read temperature and salinity from the PML POLCOMS-ERSEM NetCDF model output files and interpolate onto the open boundaries in Mobj. function Mobj = get_POLCOMS_tsobc(Mobj, ts, polcoms_bathy, varlist) DESCRIPTION: Interpolate temperature and salinity values onto the FVCOM open boundaries at all sigma levels. INPUT: Mobj = MATLAB mesh structure which must contain: - Mobj.siglayz - sigma layer depths for all model nodes. - Mobj.lon, Mobj.lat - node coordinates (lat/long). - Mobj.obc_nodes - list of open boundary node inidices. - Mobj.nObcNodes - number of nodes in each open boundary. ts = Cell array of PML POLCOMS-ERSEM NetCDF file(s) in which 4D variables of temperature and salinity (called 'ETWD' and 'x1XD') exist. Their shape should be (y, x, sigma, time). NOTES: - If you supply multiple files in ts, there are a few assumptions: - Variables are only appended if there are 4 dimensions; fewer than that, and the values are assumed to be static across all the given files (e.g. longitude, latitude). The fourth dimension is time. - The order of the files given should be chronological. - The NetCDF files used here are those from the PML POLCOMS-ERSEM model output. OUTPUT: Mobj = MATLAB structure in which three new fields (called temperature, salinity and ts_times). temperature and salinity have sizes (sum(Mobj.nObcNodes), sigma, time). The time dimension is determined based on the input NetCDF file. The ts_time variable is just the input file times in Modified Julian Day. EXAMPLE USAGE Mobj = get_POLCOMS_tsobc(Mobj, ts) Author(s): Pierre Cazenave (Plymouth Marine Laboratory) Revision history 2013-02-07 First version. 2013-02-27 Change the vertical interpolation to be scaled within the POLCOMS-ERSEM depth range for the current node. The net result is that the vertical profiles are squashed or stretched to fit within the FVCOM depths. This means the full profile structure is maintained in the resulting FVCOM boundary input despite the differing depths at the FVCOM boundary node. 2013-06-03 Fix some bugs in the way the open boundary node values were stored (the order in which they were stored did not match the order of the nodes in Casename_obc.dat). Also fix the order of the vertically interpolated values so that FVCOM starts at the surface instead of mirroring POLCOMS' approach (where the first value is the seabed). The effect of these two fixes (nodes and vertical) should match what FVCOM expects. Also add a set of figures (commented out) at the end for diagnostic purposes. ==========================================================================
0001 function Mobj = get_POLCOMS_tsobc(Mobj, ts) 0002 % Read temperature and salinity from the PML POLCOMS-ERSEM NetCDF model 0003 % output files and interpolate onto the open boundaries in Mobj. 0004 % 0005 % function Mobj = get_POLCOMS_tsobc(Mobj, ts, polcoms_bathy, varlist) 0006 % 0007 % DESCRIPTION: 0008 % Interpolate temperature and salinity values onto the FVCOM open 0009 % boundaries at all sigma levels. 0010 % 0011 % INPUT: 0012 % Mobj = MATLAB mesh structure which must contain: 0013 % - Mobj.siglayz - sigma layer depths for all model nodes. 0014 % - Mobj.lon, Mobj.lat - node coordinates (lat/long). 0015 % - Mobj.obc_nodes - list of open boundary node inidices. 0016 % - Mobj.nObcNodes - number of nodes in each open boundary. 0017 % ts = Cell array of PML POLCOMS-ERSEM NetCDF file(s) in which 4D 0018 % variables of temperature and salinity (called 'ETWD' and 0019 % 'x1XD') exist. Their shape should be (y, x, sigma, time). 0020 % 0021 % NOTES: 0022 % 0023 % - If you supply multiple files in ts, there are a few assumptions: 0024 % 0025 % - Variables are only appended if there are 4 dimensions; fewer than 0026 % that, and the values are assumed to be static across all the given 0027 % files (e.g. longitude, latitude). The fourth dimension is time. 0028 % - The order of the files given should be chronological. 0029 % 0030 % - The NetCDF files used here are those from the PML POLCOMS-ERSEM model 0031 % output. 0032 % 0033 % OUTPUT: 0034 % Mobj = MATLAB structure in which three new fields (called temperature, 0035 % salinity and ts_times). temperature and salinity have sizes 0036 % (sum(Mobj.nObcNodes), sigma, time). The time dimension is 0037 % determined based on the input NetCDF file. The ts_time variable 0038 % is just the input file times in Modified Julian Day. 0039 % 0040 % EXAMPLE USAGE 0041 % Mobj = get_POLCOMS_tsobc(Mobj, ts) 0042 % 0043 % Author(s): 0044 % Pierre Cazenave (Plymouth Marine Laboratory) 0045 % 0046 % Revision history 0047 % 2013-02-07 First version. 0048 % 2013-02-27 Change the vertical interpolation to be scaled within the 0049 % POLCOMS-ERSEM depth range for the current node. The net result is that 0050 % the vertical profiles are squashed or stretched to fit within the 0051 % FVCOM depths. This means the full profile structure is maintained in 0052 % the resulting FVCOM boundary input despite the differing depths at the 0053 % FVCOM boundary node. 0054 % 2013-06-03 Fix some bugs in the way the open boundary node values were 0055 % stored (the order in which they were stored did not match the order of 0056 % the nodes in Casename_obc.dat). Also fix the order of the vertically 0057 % interpolated values so that FVCOM starts at the surface instead of 0058 % mirroring POLCOMS' approach (where the first value is the seabed). The 0059 % effect of these two fixes (nodes and vertical) should match what FVCOM 0060 % expects. Also add a set of figures (commented out) at the end for 0061 % diagnostic purposes. 0062 % 0063 %========================================================================== 0064 0065 subname = 'get_POLCOMS_tsobc'; 0066 0067 global ftbverbose; 0068 if ftbverbose 0069 fprintf('\n') 0070 fprintf(['begin : ' subname '\n']) 0071 end 0072 0073 wasOpened = false; 0074 if license('test', 'Distrib_Computing_Toolbox') 0075 % We have the Parallel Computing Toolbox, so launch a bunch of workers. 0076 if matlabpool('size') == 0 0077 % Force pool to be local in case we have remote pools available. 0078 matlabpool open local 0079 wasOpened = true; 0080 end 0081 end 0082 0083 varlist = {'lon', 'lat', 'ETWD', 'x1XD', 'time', 'depth', 'pdepthD'}; 0084 0085 % Data format: 0086 % 0087 % pc.ETWD.data and pc.x1XD.data are y, x, sigma, time 0088 % 0089 pc = get_POLCOMS_netCDF(ts, varlist); 0090 0091 [~, ~, nz, nt] = size(pc.ETWD.data); 0092 0093 % Make rectangular arrays for the nearest point lookup. 0094 [lon, lat] = meshgrid(pc.lon.data, pc.lat.data); 0095 0096 %oNodes = Mobj.obc_nodes(Mobj.obc_nodes ~= 0); 0097 % Change the way the nodes are listed to match the order in the 0098 % Casename_obc.dat file. 0099 tmpObcNodes = Mobj.obc_nodes'; 0100 oNodes = tmpObcNodes(tmpObcNodes ~= 0)'; 0101 0102 fvlon = Mobj.lon(oNodes); 0103 fvlat = Mobj.lat(oNodes); 0104 0105 % Number of boundary nodes 0106 nf = sum(Mobj.nObcNodes); 0107 % Number of sigma layers. 0108 fz = size(Mobj.siglayz, 2); 0109 0110 fvtemp = nan(nf, fz, nt); % FVCOM interpolated temperatures 0111 fvsal = nan(nf, fz, nt); % FVCOM interpolated salinities 0112 0113 if ftbverbose 0114 tic 0115 end 0116 for t = 1:nt 0117 if ftbverbose 0118 fprintf('%s : %i of %i timesteps... ', subname, t, nt) 0119 end 0120 % Get the current 3D array of PML POLCOMS-ERSEM results. 0121 pctemp3 = pc.ETWD.data(:, :, :, t); 0122 pcsalt3 = pc.x1XD.data(:, :, :, t); 0123 0124 % Preallocate the intermediate results arrays. 0125 itempz = nan(nf, nz); 0126 isalz = nan(nf, nz); 0127 idepthz = nan(nf, nz); 0128 0129 for j = 1:nz 0130 % Now extract the relevant layer from the 3D subsets. Transpose the 0131 % data to be (x, y) rather than (y, x). 0132 pctemp2 = pctemp3(:, :, j)'; 0133 pcsalt2 = pcsalt3(:, :, j)'; 0134 pcdepth2 = squeeze(pc.depth.data(:, :, j, t))'; 0135 0136 % Create new arrays which will be flattened when masking (below). 0137 tpctemp2 = pctemp2; 0138 tpcsalt2 = pcsalt2; 0139 tpcdepth2 = pcdepth2; 0140 tlon = lon; 0141 tlat = lat; 0142 0143 % Create and apply a mask to remove values outside the domain. This 0144 % inevitably flattens the arrays, but it shouldn't be a problem 0145 % since we'll be searching for the closest values in such a manner 0146 % as is appropriate for an unstructured grid (i.e. we're assuming 0147 % the PML POLCOMS-ERSEM data is irregularly spaced). 0148 mask = tpcdepth2 > 20000; 0149 tpctemp2(mask) = []; 0150 tpcsalt2(mask) = []; 0151 tpcdepth2(mask) = []; 0152 % Also apply the masks to the position arrays so we can't even find 0153 % positions outside the domain, effectively meaning if a value is 0154 % outside the domain, the nearest value to the boundary node will 0155 % be used. 0156 tlon(mask) = []; 0157 tlat(mask) = []; 0158 0159 % Preallocate the intermediate results arrays. 0160 itempobc = nan(nf, 1); 0161 isalobc = nan(nf, 1); 0162 idepthobc = nan(nf, 1); 0163 0164 % Speed up the tightest loop with a parallelized loop. 0165 parfor i = 1:nf 0166 % Now we can do each position within the 2D layer. 0167 0168 fx = fvlon(i); 0169 fy = fvlat(i); 0170 0171 [~, ii] = sort(sqrt((tlon - fx).^2 + (tlat - fy).^2)); 0172 % Get the n nearest nodes from PML POLCOMS-ERSEM data (more? 0173 % fewer?). 0174 ixy = ii(1:16); 0175 0176 % Get the variables into static variables for the 0177 % parallelisation. 0178 plon = tlon(ixy); 0179 plat = tlat(ixy); 0180 ptemp = tpctemp2(ixy); 0181 psal = tpcsalt2(ixy); 0182 pdepth = tpcdepth2(ixy); 0183 0184 % Use a triangulation to do the horizontal interpolation. 0185 tritemp = TriScatteredInterp(plon', plat', ptemp', 'natural'); 0186 trisal = TriScatteredInterp(plon', plat', psal', 'natural'); 0187 triz = TriScatteredInterp(plon', plat', pdepth', 'natural'); 0188 itempobc(i) = tritemp(fx, fy); 0189 isalobc(i) = trisal(fx, fy); 0190 idepthobc(i) = triz(fx, fy); 0191 0192 % Check all three, though if one is NaN, they all will be. 0193 if isnan(itempobc(i)) || isnan(isalobc(i)) || isnan(idepthobc(i)) 0194 warning('FVCOM boundary node at %f, %f is outside the PML POLCOMS-ERSEM domain. Setting to the closest PML POLCOMS-ERSEM value.', fx, fy) 0195 itempobc(i) = tpctemp2(ii(1)); 0196 isalobc(i) = tpcsalt2(ii(1)); 0197 idepthobc(i) = tpcdepth2(ii(1)); 0198 end 0199 end 0200 0201 % Put the results in the intermediate array. 0202 itempz(:, j) = itempobc; 0203 isalz(:, j) = isalobc; 0204 idepthz(:, j) = idepthobc; 0205 0206 end 0207 0208 % Now we've interpolated in space, we can interpolate the z-values 0209 % to the sigma depths. 0210 0211 % Preallocate the output arrays 0212 fvtempz = nan(nf, fz); 0213 fvsalz = nan(nf, fz); 0214 0215 for pp = 1:nf 0216 % Get the FVCOM depths at this node 0217 tfz = Mobj.siglayz(oNodes(pp), :); 0218 % Now get the interpolated PML POLCOMS-ERSEM depth at this node 0219 tpz = idepthz(pp, :); 0220 0221 % To ensure we get the full vertical expression of the vertical 0222 % profiles, we need to normalise the POLCOMS-ERSEM and FVCOM 0223 % depths to the same range. This is because in instances where 0224 % FVCOM depths are shallower (e.g. in coastal regions), if we 0225 % don't normalise the depths, we end up truncating the vertical 0226 % profile. This approach ensures we always use the full 0227 % vertical profile, but we're potentially squeezing it into a 0228 % smaller depth. 0229 A = max(tpz); 0230 B = min(tpz); 0231 C = max(tfz); 0232 D = min(tfz); 0233 norm_tpz = (((D - C) * (tpz - A)) / (B - A)) + C; 0234 0235 % Get the temperature and salinity values for this node and 0236 % interpolate down the water column (from PML POLCOMS-ERSEM to 0237 % FVCOM). I had originally planned to use csaps for the 0238 % vertical interplation/subsampling at each location. However, 0239 % the demo of csaps in the MATLAB documentation makes the 0240 % interpolation look horrible (shaving off extremes). interp1 0241 % provides a range of interpolation schemes, of which pchip 0242 % seems to do a decent job of the interpolation (at least 0243 % qualitatively). 0244 if ~isnan(tpz) 0245 fvtempz(pp, :) = interp1(norm_tpz, itempz(pp, :), tfz, 'pchip', 'extrap'); 0246 fvsalz(pp, :) = interp1(norm_tpz, isalz(pp, :), tfz, 'pchip', 'extrap'); 0247 else 0248 warning('Should never see this... ') % because we test for NaNs when fetching the values. 0249 warning('FVCOM boundary node at %f, %f is outside the PML POLCOMS-ERSEM domain. Skipping.', fvlon(pp), fvlat(pp)) 0250 continue 0251 end 0252 end 0253 0254 % The horizontally- and vertically-interpolated values in the final 0255 % FVCOM results array. 0256 fvtemp(:, :, t) = fvtempz; 0257 fvsal(:, :, t) = fvsalz; 0258 0259 if ftbverbose 0260 fprintf('done.\n') 0261 end 0262 end 0263 if ftbverbose 0264 toc 0265 end 0266 0267 Mobj.temperature = fvtemp; 0268 Mobj.salt = fvsal; 0269 0270 % Convert the current times to Modified Julian Day (this is a bit ugly). 0271 pc.time.all = strtrim(regexp(pc.time.units, 'since', 'split')); 0272 pc.time.datetime = strtrim(regexp(pc.time.all{end}, ' ', 'split')); 0273 pc.time.ymd = str2double(strtrim(regexp(pc.time.datetime{1}, '-', 'split'))); 0274 pc.time.hms = str2double(strtrim(regexp(pc.time.datetime{2}, ':', 'split'))); 0275 0276 Mobj.ts_times = greg2mjulian(... 0277 pc.time.ymd(1), ... 0278 pc.time.ymd(2), ... 0279 pc.time.ymd(3), ... 0280 pc.time.hms(1), ... 0281 pc.time.hms(2), ... 0282 pc.time.hms(3)) + (pc.time.data / 3600 / 24); 0283 0284 % Close the MATLAB pool if we opened it. 0285 if wasOpened 0286 matlabpool close 0287 end 0288 0289 if ftbverbose 0290 fprintf(['end : ' subname '\n']) 0291 end 0292 0293 0294 %% 0295 % Plot a vertical profile for a boundary node (for my Irish Sea case, this 0296 % is one of the ones along the Celtic Sea boundary). Also plot the 0297 % distribution of interpolated values over the POLCOMS data. Add the 0298 % location of the vertical profile (both FVCOM and POLCOMS) to the plot. 0299 % nn = 55; % open boundary index 0300 % tt = 1; % time index 0301 % 0302 % % Get the corresponding indices for the POLCOMS data 0303 % [~, xidx] = min(abs(lon(1, :) - fvlon(nn))); 0304 % [~, yidx] = min(abs(lat(:, 1) - fvlat(nn))); 0305 % 0306 % % close all 0307 % 0308 % figure 0309 % clf 0310 % subplot(2,2,1) 0311 % plot(Mobj.temperature(nn, :, 1), Mobj.siglayz(oNodes(nn), :), 'x-') 0312 % xlabel('Temperature (^{\circ}C)') 0313 % ylabel('Depth (m)') 0314 % title('FVCOM') 0315 % 0316 % subplot(2,2,2) 0317 % % Although POLCOMS stores its temperature values from seabed to surface, 0318 % % the depths are stored surface to seabed. Nice. 0319 % plot(squeeze(pc.ETWD.data(xidx, yidx, :, 1)), squeeze(pc.depth.data(xidx, yidx, :, 1)), 'rx-') 0320 % xlabel('Temperature (^{\circ}C)') 0321 % ylabel('Depth (m)') 0322 % title('POLCOMS') 0323 % 0324 % subplot(2,2,3) 0325 % plot(Mobj.temperature(nn, :, tt), 1:fz, 'x-') 0326 % xlabel('Temperature (^{\circ}C)') 0327 % ylabel('Array index') 0328 % title('FVCOM') 0329 % 0330 % subplot(2,2,4) 0331 % plot(squeeze(pc.ETWD.data(xidx, yidx, :, tt)), 1:nz, 'rx-') 0332 % xlabel('Temperature (^{\circ}C)') 0333 % ylabel('Array index') 0334 % title('POLCOMS') 0335 % 0336 % % Figure to check everything's as we'd expect. Plot first time step with 0337 % % the POLCOMS surface temperature as a background with the interpolated 0338 % % boundary node surface values on top. 0339 % 0340 % figure 0341 % clf 0342 % % Plot POLCOMS surface data (last sigma layer) 0343 % dx = mean(diff(pc.lon.data)); 0344 % dy = mean(diff(pc.lat.data)); 0345 % pcolor(pc.lon.data - (dx / 2), pc.lat.data - (dy / 2), ... 0346 % squeeze(pc.ETWD.data(:, :, 1, tt))') 0347 % shading flat 0348 % axis('equal', 'tight') 0349 % daspect([1.5, 1, 1]) 0350 % hold on 0351 % % Add the interpolated surface data (first sigma layer) 0352 % scatter(Mobj.lon(oNodes), Mobj.lat(oNodes), 40, Mobj.temperature(:, 1, tt), 'filled', 'MarkerEdgeColor', 'k') 0353 % axis([min(Mobj.lon(oNodes)), max(Mobj.lon(oNodes)), min(Mobj.lat(oNodes)), max(Mobj.lat(oNodes))]) 0354 % caxis([6, 20]) 0355 % plot(lon(yidx, xidx), lat(yidx, xidx), 'rs') % polcoms is all backwards 0356 % plot(Mobj.lon(oNodes(nn)), Mobj.lat(oNodes(nn)), 'wo') 0357 % colorbar


--- layout: default title: Getting Help slug: help lead: "With a little help from my friends." base_url: "../" ---
The SunPy documentation should be your first stop to get your question answered. We strive to provide a rich and comprehensive set of docs. The documentation is included in the code itself which you can access through code reference and we also have a number of guides which take you through specific topics. If you do not find your answer there read on!
Sometimes the best way to get your question answered is just by asking someone. SunPy has two mailing lists; a general mailing list for general issues and a developer mailing list. If you have a general question about how SunPy works use the main list. If, on the other hand, you have a question about the inner workings of SunPy or how SunPy is organized or have a question about developing some new feature please use the developer mailing list.
We have a chat room on IRC (#sunpy) hosted on freenode where you can talk with SunPy users and developers in real time. If you are unfamiliar with IRC we recommend you simply use Kiwi IRC's web chat client which will open directly in your browser, or use the embedded client below. Stop by and say hello. Also, most chat programs can connect to the chat room (hostname = irc.freenode.net, channel = #sunpy).


The attractive town of Portree is in a superb natural setting, being surrounded by high ground and cliffs and is the capital of the spectacular island of Skye. The main part of the town lies above and behind the harbour, which forms the centre of activity here.
Position 57° 24'40"N, 006° 11'04"W
The harbour is sheltered in all but strong S/SW'lies. There are visitors' mooring buoys and anchorages just east of the pier (in about 2.5m) or further over by the eastern shore (in about 4m).
( photo of Portree harbour from Andrus of S/Y Suwena)
There is also a short stay pontoon for water and for dinghies.
Last updated January 2016.


Home
Gallery
About
Contact
Capture the beauty of nature in your camera.
System Support by
Tasin
Album
129 Photos
Album
129 Photos
Album
129 Photos
Album
129 Photos
Album
129 Photos
Album
128 Photos
Album
127 Photos
Album
126 Photos
Album
125 Photos
Album
124 Photos
Album
123 Photos
Album
122 Photos
Album
121 Photos
Album
120 Photos
Album
129 Photos
Album
128 Photos
Album
127 Photos
Album
126 Photos
Album
125 Photos
Album
124 Photos
Album
123 Photos
Album
122 Photos
Album
121 Photos
Album
121 Photos


Zigbee2MQTT - Native to Docker migration
A long time ago I started using Zigbee2MQTT - somewhere around 1.2 or 1.3. Back then I thought that it was easiest to run Zigbee2MQTT with a manual install, which was (and still is) the default instructions you’ll find.
Since then I’ve seen the light. Docker makes upgrades, and downgrades, so much easier. Installing a new version is no longer a nightmare with compiling and installing packages - it’s two commands and a short wait.
But, if you’ve started with a manual install, how do you migrate without having to re-pair everything?
The answer is that it’s pretty much the same as for when you migrate Home Assistant from a venv to Docker:
- Install Docker and Docker Compose
- Configure your container to use the existing config folder
- Done (well, mostly)
Install
Install Docker CE which these days comes with Compose saving us a few steps.
Next you’ll want to pick a folder to keep all your Docker configs in. I like to use /data
for the top level, and /data/docker for my compose file(s). Other people use
/docker` for their compose files and folders under there for the container’s config folders.
Now you can follow the official Zigbee2MQTT docs, though you will already know where your USB stick is (just look in the existing config).
Configure
Next step is to write your docker-compose.yml
file, which will look something like this:
version: '3'
services:
zigbee2mqtt:
container_name: zigbee2mqtt
image: koenkk/zigbee2mqtt
restart: unless-stopped
network_mode: host
volumes:
- /opt/zigbee2mqtt/data:/app/data
devices:
- /dev/serial/by-id/usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0018E1F2ED-if00:/dev/ttyACM0
environment:
- TZ=Europe/London
healthcheck:
test: ["CMD", "/usr/bin/wget", "-q", "-O -", "http://<IP_ADDRESS>:8080"]
interval: 60s
timeout: 5s
retries: 3
Change the device path to suit your USB stick, and the timezone to suit you.
Finish
Now it’s time to disable and stop the old install, and then start your new container.
cd /data/docker
sudo docker-compose pull
sudo systemctl disable zigbee2mqtt
sudo systemctl stop zigbee2mqtt
sudo docker-compose up -d
You can check the logs now either by looking in the config folder, as before, or by using docker compose logs -f zigbee2mqtt
when in the folder with your compose file.
When it comes time to update Zigbee2MQTT you just repeat the pull and up steps:
docker-compose pull
docker-compose up -d
If you need to revert to the manual install for any reason then you can easily do that.


Home
Political Science
Congress
Campaigns & Elections
War & Security
Law
Economics & Sociology
Current Events
Fact Checkers
Privacy Policy
Contact Developers
War
War & Security
Council on Foreign Relations
Defense One
Duck of Minerva
Fifth Domain
National Interest
Political Violence at a Glance
The Texas National Security Review
War on the Rocks


[viewBag] title = "Créditos" url = "/creditos" layout = "form" is_hidden = 0 navigation_hidden = 0 ==


{% trans "Sorry, this part of the resource if strict permission or blocked for future days" %}
{% blocktrans %}
Please do not panic, someday it will be free to use for everyone, or something like this.
If you have problems with login or register, be patient and read{% endblocktrans %}: Frequently asked questions.
{% trans "Thank you for your patience." %}
{% endblock %}


PubSubHubbub is a simple, open, web-hook-based pubsub (publish/subscribe) protocol.
Decentralized and free. Anybody can run a PubSubHubbub server or anybody can use an open server.
PubSubHubbub is just a protocol, not a service, but we're running this as an open test server for anybody to use to help bootstrap the protocol. Feel free to publish to or subscribe from this hub. You can migrate in the future when you want to run your own hub server, or you can just keep using this one.
See the project for details. This presentation has an overview:
From here you can,
These legal disclaimers are here because this Hub is run by Google as a service. If you don't want to agree to these terms you should just run your own hub. The PubSubHubbub protocol is decentralized and free.


This app is the "hello world" of Pusher Platform. The app subscribes to a feed. The latest items are shown below. You can append things to the feed using the form below it. View source or see the repository for more info.


In the open source world, different project comes with different workflow, using
different medium. For instance, Linux Kernel development, use mailing list to
gather patches for many developer around the world. The maintainer pick
patches from developer with careful supervision. Then, they maintain release of
the stable version, while Linus Torvalds himself maintain the mainline stream.
Other project, Git – a revision control system. It use same model as Linux
Kernel, patches and conversations go to mailing list. With additional part, for
the Continuous Integration system, it is recommended to use Github and Travis
CI. Although they will reject all pull request from there.
Another example, Wget2 used Github mainly to perform collaboration (Because GNU
not allowed their project to use Github, their move it to Gitlab [0]). Issues are
discussed here. Pull request also getting merged here. Although, it also have
mailing list to discuss issues and problems.
Here I share my experience how I contribute to open source, so my code could be
merged in the project upstream. For an example, I will write several steps of
my way doing Wget2 project for my GSoC 2017 application. Below are some points I
follow:
Obtain Source Code
Startup procedures:
Fork project so you can modify yourself via Gitlab interface.
git clone https://gitlab.com/dstw/wget2
git remote add upstream<EMAIL_ADDRESS>Create an own branch for each ‘task’ you are working on and make your commits within it. When done, sync with upstream, rebase/merge and create your patches via format-patch.
Do not make changes to your branch ‘master’ - this should always reflect the original repo. This makes it easy for you to update your ‘master’ branch with changes from the ‘original/upstream’ master branch on Savannah.
 As soon as your patch has been accepted, remove the branch ‘new-feature’ locally and from Gitlab.
Build the Executables
As prerequisite, install all mandatory software as listed in README.md.
Find the Problems
I usually look at Wget2 Gitlab issues pages to find issues and problems which appropriate to newcomer like me.
Make Changes to the Code
In this part, my knowledge in coding skill are truly challenged. Wget2 use C as its programming language. In my case, I just add some test based on requirements and of course with help from other contributors.
Create Pull/Merge Request
After I feel my code ready to merge, I push my commit to upstream and make a pull request from Gitlab interface.
Wait for Review
After create a merge request, I wait for feedback, criticism, suggestions, etc.
from other developer.
Respond to it! and follow up with improved versions of your change. Even for a
trivial patch you shouldn’t be surprised if it takes two or more iterations
before your patch is accepted. This is the best part of participating in the Git
community; it is your chance to get personalized instruction from very
experienced peers!
Propose New Change
After getting a review, do some improvement. After all, make a new commit. Here, there is option to overwrite my existing commits or create new merge commits to keep history.
git push origin new-feature
If there is a conflict, Git will ask me to resolve the problem this. Then, try to push and merge commits. This won’t remove any existing commits. And if I don’t want to keep any commits history, I usually force to push:
git push -f origin new-feature
This is considered a little bit harmful. Before I do this, I will make sure
that I know what I do. Also, forcing commits is should only do if it believed to
final commits or at least near final, I should not do any more change to it.
Just make sure that I don’t force push to the master branch of the project,
otherwise, is safe.
Finally, after some iteration, if project maintainer agree with my changes, then they will merge it into their repository. If not, I should be take a look on my proposed changes more carefully, what could be wrong and what should be fixed. And the best of it all, I could learn a lot from the process.
References:
[0] (http://lists.gnu.org/archive/html/bug-wget/2017-04/msg00052.html)


Ideally, the activation token value or activation link could be sent by email after the registration progress is done.
In this example input 123 for test purpose.
Token value:


Introduction
Harvard Map Collection
Harvard Library
Sidebar for popup content
Click on a place to learn more
Thumbnail
Full embed


Phase-2
July 24, 2017
Phase 2 is coming to an end today (24’th of July, 11:30 PM IST). It had been an intensive and healthy work-period with a high steep-learning curve. Let me reflect on my journey throughout the month.
Overview
- Differentiate between classes and functions
- Allow running “python -m vulture”
- Choose whitelists depending on used imports
- Implement a method for source range acquisition
- Let item inherit from object rather than str
- Create whitelist files for popular Python frameworks like Django
Differentiating between functions and classes
vulture previously saved the defined_classes
in the defined_functions
list.
I just needed to change the visitClassDef
function which is triggered
whenever ast
finds any Class Definition node.
Allow running “python -m vulture”
Changing the entry_point did the work. :-)
Choose whitelists depending on used imports
So, our plan was to make whitelists for some modules default based on whether or not thaat corresponding module was imported or not.
In the previous phase, we started shipping vulture as a package. Because of the change, we could now ship additional data with the package, like the
Source Range Acquisition
Perhaps, the most important part of my GSoC Proposal. The idea was to implement such a function which if given an ast node could find it’s end. For demo purposes, we started source. From the first commit [here] to the current implementation, there is affiliated an impressive amount of research, debigging and creativity (special credits to @jendrikseipp).
Let item inherit from object rather than str
vulture stores dead code in a special data structure - Item
- a lightwight
representation of the ast node
. Previously, Item
inherited from str
although there was no absolute need of doing so, and changing it would give us
more command and flexibilty with the design. So, we decided to change it.
The implementation was pretty basic. You may see the changes here:commit
Create whitelist files for popular Python frameworks like Django
This required me to run vulture over a few web-apps powered by both, flask
and django. Analysing flasky, the book on flask, we uncovered several
interesting facts and surprisingly, we ended up making a whitelist for
the unittest
library.
Other things
I read @damngamerz post on EuroPython and felt pretty thrilled. I also recieved the news that we are gonna hack PyCon India (or Pune) and make it coalaCon. We will also get coala stickers. Yay!
It has been a pretty awesome journey up till now. I really accredit this to both, my mentor @jendrikseipp and student-admin @jayvdb and to the awesome coala community where every one is so open minded and intelligent.
Thanks! :-)


Barcamp Bangkhen is an annual unconference which attracts over 500 participants from various internet communities to contribute over 40 sessions and learn new things together. We provide venue, t-shirts, lunch and party, but can only do so with assistance from Kasetsart University and our sponsors.
Sessions listBarcamp is an ad-hoc unconference born from the desire for people to share and learn in an open environment. It is an intense event with discussions, demos and interaction from attendees. Anyone with something to contribute or with the desire to learn is welcome and invited to join.
→ Official Barcamp websiteAttendees must give a demo, a session, or help with one, or otherwise volunteer/contribute in some way to support the event. All presentations are scheduled the day they happen. Prepare in advance, but come early to get a slot on the wall. The people present at the event will select the demos or presentations they want to see.
→ The rules of BarcampAt Barcamp Bangkhen there is no entrance ticket and we have free food, WiFi and T-shirts for you. The only thing we ask is your participation in the event not just spectating.
View on: Google Maps, OpenStreetMap, KU
24 26 29 39 51 52 59 63 104 107 114
126 129 177 185 186 522 524 528 545
14 40 62 79
1 2 4


@*
* Copyright 2021 HM Revenue & Customs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*@
@import uk.gov.hmrc.traderservices.controllers.routes
@this(
govukLayout: uk.gov.hmrc.traderservices.views.html.templates.GovukLayoutWrapper,
html: uk.gov.hmrc.traderservices.views.components.html
)
@(postAction: Call)(implicit request: Request[_], messages: Messages)
@govukLayout(
pageTitle = pageTitle("view.beta.title")) {
@html.h1(messages("view.beta.heading"), classes = "govuk-heading-l")
@html.p { @messages("view.beta.lede") }
@html.p { @messages("view.beta.paragraph1") }
@html.p { @messages("view.beta.paragraph2") }
@html.p { @messages("view.beta.paragraph3") }


See: Description
| Package | Description |
|---|---|
| edu.cmu.sphinx.alignment | |
| edu.cmu.sphinx.alignment.tokenizer | |
| edu.cmu.sphinx.api | |
| edu.cmu.sphinx.decoder |
Provides a set of high level classes that can
be used to configure and initiate the speech recognition decoding
process.
|
| edu.cmu.sphinx.decoder.adaptation | |
| edu.cmu.sphinx.decoder.pruner |
Provides an interface that represents the pruning facility
|
| edu.cmu.sphinx.decoder.scorer |
Provides an interface that represents entities that can be
scored, and an interface and several implementations of a scorer that
can score these entities.
|
| edu.cmu.sphinx.decoder.search |
Provides classes and interfaces that are used to manage the search
through the search graph.
|
| edu.cmu.sphinx.decoder.search.stats | |
| edu.cmu.sphinx.frontend |
Provides a set of high level classes and interfaces that are used
to perform digital signal processing for speech recognition.
|
| edu.cmu.sphinx.frontend.databranch |
This package contains some classes to create a subbranch of a FronEnd at an arbitrary position.
|
| edu.cmu.sphinx.frontend.denoise | |
| edu.cmu.sphinx.frontend.endpoint |
Provides classes and interfaces used for speech endpointing.
|
| edu.cmu.sphinx.frontend.feature |
Provides classes that processes features.
|
| edu.cmu.sphinx.frontend.filter |
Provides classes that implement frequency filters.
|
| edu.cmu.sphinx.frontend.frequencywarp |
Provides classes that perform frequency warping.
|
| edu.cmu.sphinx.frontend.transform |
Provides classes that transform data from one domain into another.
|
| edu.cmu.sphinx.frontend.util |
Provides classes that are generally useful to the various frontend
classes.
|
| edu.cmu.sphinx.frontend.window |
Provides classes that implement windowing functions.
|
| edu.cmu.sphinx.fst |
Provides the basic fst classes.
|
| edu.cmu.sphinx.fst.operations |
Provides classes for fst operations.
|
| edu.cmu.sphinx.fst.semiring |
Provides semiring related classes.
|
| edu.cmu.sphinx.fst.sequitur | |
| edu.cmu.sphinx.fst.utils |
Provides a set of utility classes.
|
| edu.cmu.sphinx.instrumentation |
Provides a set of classes that monitor and track operational aspects of the Sphinx system.
|
| edu.cmu.sphinx.jsgf | |
| edu.cmu.sphinx.jsgf.parser | |
| edu.cmu.sphinx.jsgf.rule | |
| edu.cmu.sphinx.linguist |
Provides a set of interfaces and classes that are used to define the
search graph used by the decoder.
|
| edu.cmu.sphinx.linguist.acoustic |
Provides classes that represent the acoustic model.
|
| edu.cmu.sphinx.linguist.acoustic.tiedstate |
Provides classes that represent acoustic model in terms of a set of
tied states.
|
| edu.cmu.sphinx.linguist.acoustic.tiedstate.HTK | |
| edu.cmu.sphinx.linguist.acoustic.tiedstate.kaldi | |
| edu.cmu.sphinx.linguist.acoustic.tiedstate.tiedmixture | |
| edu.cmu.sphinx.linguist.acoustic.tiedstate.trainer |
Provides classes that represent a trainable acoustic model.
|
| edu.cmu.sphinx.linguist.acoustic.trivial |
Provides classes that represent a trivial acoustic model.
|
| edu.cmu.sphinx.linguist.aflat | |
| edu.cmu.sphinx.linguist.allphone | |
| edu.cmu.sphinx.linguist.dflat | |
| edu.cmu.sphinx.linguist.dictionary |
Provides a generic interface to a dictionary as well as several
implementations.
|
| edu.cmu.sphinx.linguist.flat |
Provides an implementation of the
Linguist that
statically represents the search space as a flat graph, where each
word in the vocabulary has its own branch. |
| edu.cmu.sphinx.linguist.g2p |
Provides classes that implement the g2p decoding functionality.
|
| edu.cmu.sphinx.linguist.language.classes | |
| edu.cmu.sphinx.linguist.language.grammar |
Provides classes and interfaces that can be used to represent a graph of words and word transitions.
|
| edu.cmu.sphinx.linguist.language.ngram |
Provides classes and interfaces that represent a stochastic language model
|
| edu.cmu.sphinx.linguist.language.ngram.large |
Provides an implementation of the LanguageModel interface.
|
| edu.cmu.sphinx.linguist.lextree |
Provides an implementation of the
Linguist that
represents the search space as a lex tree. |
| edu.cmu.sphinx.linguist.util |
Provides a set of classes that are useful by implementations of the
Linguist interface. |
| edu.cmu.sphinx.recognizer |
Provides a set of high level classes and interfaces that are used
to perform speech recognition with the Sphinx-4 speech recognition system.
|
| edu.cmu.sphinx.result |
Provides a set of classes that represent the result of a recognition.
|
| edu.cmu.sphinx.speakerid | |
| edu.cmu.sphinx.tools.aligner | |
| edu.cmu.sphinx.tools.audio |
Provides an tool that records and displays the waveform and
spectrogram of an audio signal.
|
| edu.cmu.sphinx.tools.bandwidth | |
| edu.cmu.sphinx.tools.batch |
Provides an tool that performs batch-mode speech recognition.
|
| edu.cmu.sphinx.tools.endpoint | |
| edu.cmu.sphinx.tools.feature |
Description
|
| edu.cmu.sphinx.tools.live |
Provides an tool that performs pseudo-live-mode speech recognition.
|
| edu.cmu.sphinx.trainer |
Provides a set of high level classes that can
be used to configure and initiate the speech recognition training
process.
|
| edu.cmu.sphinx.util |
Provides a set of general purpose utility classes for Sphinx.
|
| edu.cmu.sphinx.util.machlearn |
Provides a set of classes and interfaces which aim to unify the different probabilistic modeling approaches spread over the
S4-library into a common probabilistic framework.
|
| edu.cmu.sphinx.util.props |
Provides a mechanism for managing persistent configuration data.
|
| edu.cmu.sphinx.util.props.tools |
Copyright © 2017. All rights reserved.


--- layout: post title: And I ve moved, again.. date: 2011-08-08 02:58:24.000000000 +02:00 categories: [] tags: [] status: publish type: post published: true meta: _edit_last: '1' author: ---
And its time again for the next @indiblogger meetup.
And this meetup prompted me to get my blog up and running again :P I ve moved from slicehost to the parent company rackspace owing to
Even though slicehost itself is about to integrate into the rackspace infrastructure, meaning slicehost will be moving to rackspace cloud and will be charging similar prices, I, as always, being impatient couldn't wait and moved :P
I guess the downside of that being that I had to manually move and setup everything myself. Vs maybe slicehost and rackspace would ve provided moving support had I waited for them :P
but anyways, its the next @indiblogger meetup about the samsung galaxy tab that has got me interested in blogging again. I ve my exams in the next week and I woke up this morning with intent to read, but I took the wrong step of opening up twitter. One thing lead to another and here I am blogging. But considering that the entire thing happened in less than two hours, I think it was a pretty efficient usage of time. Time to get ready for office, and then back and then try to study and blog and tweet and all as usual :)
Good thing be that grandmom aka amma is here now. So I dont ve to worry about dining plans :)
PS: There is a new domain as well, hackalyst.info. Right now anshprat.info and hackalyst.info both point to the same site. Maybe I ll merge, maybe I ll let it be.
And the new site is called muddle-muggle. Muddle - coz of the ever presence confusion. Muggle - coz I wish I was a wizard, or atleast had some super powers :P


Payment Controls
Minimum Payment
Payment Approval
Payment Method
Default
Check
Direct Deposit
Override $
Honor
First *
Middle
Last *
Suffix
Signatory ->
TransType *
Routing # *
Account # *
Acct Type *
Signed *
Received *
Submitted
Pre-note
Add
Change
Delete
Checking
Saving


1. Introduction
This section is not normative.
Web applications often need to work with strings of HTML on the client side,
perhaps as part of a client-side templating solution, perhaps as part of
rendering user generated content, etc. It is difficult to do so in a safe way,
however; the naive approach of joining strings together and stuffing them into
an Element
's innerHTML
is fraught with risk, as that can and
will cause JavaScript execution in a number of unexpected ways.
Libraries like [DOMPURIFY] attempt to manage this problem by carefully parsing and sanitizing strings before insertion by constructing a DOM and walking its members through an allow-list. This has proven to be a fragile approach, as the parsing APIs exposed to the web don’t always map in reasonable ways to the browser’s behavior when actually rendering a string as HTML in the "real" DOM. Moreover, the libraries need to keep on top of browsers' changing behavior over time; things that once were safe may turn into time-bombs based on new platform-level features.
The browser has a fairly good idea of when it is going to execute code. We can improve upon the user-space libraries by teaching the browser how to render HTML from an arbitrary string in a safe manner, and do so in a way that is much more likely to be maintained and updated along with the browser’s own changing parser implementation. This document outlines an API which aims to do just that.
1.1. Goals
-
Mitigate the risk of DOM-based cross-site scripting attacks by providing developers with mechanisms for handling user-controlled HTML which prevent direct script execution upon injection.
-
Make HTML output safe for use within the current user agent, taking into account its current understanding of HTML.
-
Allow developers to override the defaults set of elements and attributes. Adding certain elements and attributes can prevent script gadget attacks.
1.2. Examples
let userControlledInput= "" ; // Create a DocumentFragment from unsanitized input: let s= new Sanitizer(); let sanitizedFragment= s. sanitize( userControlledInput); // Replace an element’s content from unsanitized input: element. replaceChildren( s. sanitize( userControlledInput));
2. Framework
2.1. Sanitizer API
The core API is the Sanitizer
object and the sanitize method. Sanitizers can
be instantiated using an optional SanitizerConfig
dictionary for options.
The most common use-case - preventing XSS - is handled by default,
so that creating a Sanitizer with a custom config is necessary only to
handle additional, application-specific use cases.
[Exposed =(Window ),SecureContext ]interface {
Sanitizer constructor (optional SanitizerConfig = {});
config DocumentFragment sanitize (SanitizerInput );
input DOMString sanitizeToString (SanitizerInput ); };
input
-
The
new Sanitizer(config)
constructor steps are to create a new Sanitizer instance, and to retains a copy of config as its configuration object. -
The
sanitize(input)
method steps are to return the result of running the sanitize algorithm on input, -
The
sanitizeToString(input)
method steps are to return the result of running sanitizeToString algorithm on input.
Example:
// Replace an element’s content from unsanitized input: element. replaceChildren( new Sanitizer(). sanitize( userControlledInput));
2.2. Input Types
The sanitization methods support three input types: DOMString
, Document
,
and DocumentFragment
. In all cases, the sanitization will work on a DocumentFragment
internally, but the work-fragment will be created by
parsing, cloning, or using the fragment as-is, respectively.
typedef (DOMString or DocumentFragment or Document );
SanitizerInput
Note: Sanitizing a string will use the HTML Parser to parse the input,
which will perform some degree of normalization. So even
if no sanitization steps are taken on a particular input, it cannot be
guaranteed that the output of sanitizeToString
will be
character-for-character identical to the input.
Examples would be character regularization ("ß"
to "ß"
),
or light processing for some elements ("<image>"
to ""
);
2.3. The Configuration Dictionary
The Sanitizer’s configuration object is a dictionary which describes modifications to the sanitize operation. If a Sanitizer has not received an explicit configuration, for example when being constructed without any parameters, then the default configuration value is used as the configuration object.
dictionary {
SanitizerConfig sequence <DOMString >;
allowElements sequence <DOMString >;
blockElements sequence <DOMString >;
dropElements AttributeMatchList ;
allowAttributes AttributeMatchList ;
dropAttributes boolean ; };
allowCustomElements
- allowElements
-
The element allow list is a sequence of strings with elements that the sanitizer should retain in the input.
- blockElements
-
The element block list is a sequence of strings with elements where the sanitizer should remove the elements from the input, but retain their children.
- dropElements
-
The element drop list is a sequence of strings with elements that the sanitizer should remove from the input, including its children.
- allowAttributes
-
The attribute allow list is an attribute match list, which determines whether an attribute (on a given element) should be allowed.
- dropAttributes
-
The attribute drop list is an attribute match list, which determines whether an attribute (on a given element) should be dropped.
- allowCustomElements
-
allow custom elements option determines whether custom elements are to be considered. The default is to drop them. If this option is true, custom elements will still be checked against all other built-in or configured configured checks.
Note: allowElements
creates a sanitizer that defaults to dropping elements,
while blockElements
and dropElements
defaults to keeping unknown
elements. Using both types is possible, but is probably of little practical
use. The same applies to allowAttributes
and dropAttributes
.
Examples:
const sample= "Some text with <blink>tags</blink>." ; // "Some text with text tags." new Sanitizer({ allowElements: [ "b" ]). sanitizeToString( sample); // "Some text with <blink>tags</blink>." new Sanitizer({ blockElements: [ "b" ]). sanitizeToString( sample); // "Some text <blink>tags</blink>." new Sanitizer({ dropElements: [ "b" ]). sanitizeToString( sample); // Note: The default configuration handles XSS-relevant input: // Non-scripting input will be passed through: new Sanitizer(). sanitizeToString( sample); // Will output sample unmodified. // Scripts will be blocked: "abc alert(1) def" new Sanitizer(). sanitizeToString( "abc  def" );
2.3.1. Attribute Match Lists
An attribute match list is a map of attribute names to element names,
where the special name "*" stands for all elements. A given attribute belonging to an element matches an attribute match list, if the
attribute’s local name is a key in the match list, and element’s local name
or "*"
are found in the attribute’s value list.
typedef record <DOMString ,sequence <DOMString >>;
AttributeMatchList
Examples for attributes and attribute match lists:
const sample= "hello" ; // Allow only : "..." new Sanitizer({ allowAttributes: { "style" : [ "span" ]}}). sanitizeToString( sample); // Allow style, but not on span: "..." new Sanitizer({ allowAttributes: { "style" : [ "div" ]}}). sanitizeToString( sample); // Allow style on any elements: "..." new Sanitizer({ allowAttributes: { "style" : [ "*" ]}}). sanitizeToString( sample); // Block : "..."; new Sanitizer({ blockAttributes: { "id" : [ "span" ]}}). sanitizeToString( sample); // Block id, everywhere: "..."; new Sanitizer({ blockAttributes: { "id" : [ "*" ]}}). sanitizeToString( sample);
2.4. Algorithms
SanitizerInput
,
run these steps:
-
Let fragment be the result of running the create a document fragment algorithm on input.
-
Run the sanitize a document fragment algorithm on fragment.
-
Return fragment.
SanitizerInput
, run these steps:
-
Let fragment be the result of the create a document fragment algorithm on input.
-
Let sanitized be the result of running the sanitize algorithm on fragment.
-
Let result be the result of running the HTML Fragment Serialization Algorithm with sanitized as the
node
argument. -
Return result.
SanitizerInput
, run these steps:
-
Switch based on input’s type:
-
If input is of type
DocumentFragment
, then:-
Let node refer to input.
-
-
If input is of type
Document
, then:-
Let node refer to input’s
documentElement
.
-
-
If input is of type
DOMString
, then:-
Let node be the result of running the
parseFromString
algorithm with input as first parameter (string
), and"text/html"
as second parameter (type
).
-
-
-
Let clone be the result of running clone a node on node with the
clone children flag
set totrue
. -
Let
fragment
be the result ofcreateDocumentFragment
. -
Append the node clone to the parent fragment.
-
Return fragment.
It’s unclear whether we can assume a generic
context for parseFromString
, or if we need to re-work the API to take
the insertion context of the created fragment into account. <https://github.com/WICG/sanitizer-api/issues/42>
-
Let m be a map that maps nodes to a sanitize action
-
Let nodes be a list containing the inclusive descendants of fragment, in tree order.
-
For each node in nodes:
-
Let action be the result of running the sanitize a node algorithm on node.
-
Insert node and action into m
-
-
For each node in nodes:
-
If m[node] is
drop
, remove the node and all children from fragment. -
If m[node] is
block
, replace the node with all of its element and text node children from fragment. -
If m[node] is
keep
, do nothing.
-
-
Let sanitizer be the current Sanitizer.
-
If node is an element node:
-
Let element be node’s element.
-
For each attr in element’s attribute list:
-
Let attr action be the resulf of running the effective attribute configuration algorithm on sanitizer, attr, and element.
-
If attr action is different from
keep
, remove attr from i element.
-
-
Run the steps to handle funky elements on element.
-
Let action be the resulf of running the effective element configuration algorithm on sanitizer and element.
-
Return action.
-
-
Return 'keep'
Some HTML elements require special treatment in a way that can’t be easily expressed in terms of configuration options or other algorithms. The following algorithm collects these in one place.
-
If element’s element interface is
HTMLTemplateElement
:-
Run the steps of the sanitize a document fragment algorithm on element’s content attribute, and replace element’s content attribute with the result.
-
Drop all child nodes of element.
-
-
If element’s element interface has a
HTMLHyperlinkElementUtils
mixin, and if element’sprotocol
property is "javascript:":-
Remove the
href
attribute from element.
-
-
if element’s element interface is
HTMLFormElement
, and if element’saction
attribute is a [URL] withjavascript:
protocol:-
Remove the
action
attribute from element.
-
-
if element’s element interface is
HTMLInputElement
orHTMLButtonElement
, and if element’sformaction
attribute is a [URL] withjavascript:
protocol-
Remove the
formaction
attribute from element.
-
2.4.1. The Effective Configuration
A Sanitizer is potentially complex, so we will define a helper construct, the effective configuration. This is mostly a specification convenience and allows us to explain a Sanitizer’s operation in two steps: One, how to derive the effective configuration, and two, define the Sanitzer’s operation based on it.
An effective configuration maps a given element or a given pair of element and attribute to a sanitize action.
A sanitize action can have the values keep
, drop
, or block
.
To determine the stricter action of two sanitize actions, pick
the 'larger' of the two actions assuming a transitively defined order with drop
> block
, and block
> keep
.
-
Let config be sanitizer’s configuration object.
-
Let baseline action be the result of running the steps of the determine the baseline configuration for an element algorithm for the element element.
-
Let config action be the result of running the steps of the determine the effective configuration for an element algorithm for the element element and the config config.
-
Return the stricter action of baseline action and config action.
Note: The definition of stricter actions ensures that the built-in baseline configuration cannot be overriden, and therefor forms a hard guarantee for all Sanitizer instances. (Likewise for attributes.)
-
Let config be sanitizer’s configuration object.
-
Let baseline action be the result of running the steps of the determine the baseline configuration for an attribute algorithm on the attribute attr.
-
Let config action be the result of running the steps of the determine the effective configuration for an attribute algorithm on the attribute attr, with the element element and the config config.
-
Return the stricter action of baseline action and config action.
Before describing how an effective configuration is derived, we need a helper definition:
regular
, unknown
, or custom
. Let element kind be:
-
custom
, if element’s tag name is a valid custom element name, -
unknown
, if element is not in the [HTML] namespace or if element’s tag name denotes an unknown element — that is, if the element interface the [HTML] specification assigns to it would beHTMLUnknownElement
, -
regular
, otherwise.
regular
or unknown
. Let attribute kind be:
-
unknown
, if the [HTML] specifcation does not assign any meaning to attribute’s name. -
regular
, otherwise.
The spec currently treats MathML and SVG as unknown
content and therefore blocked by default. This needs to be fixed. <https://github.com/WICG/sanitizer-api/issues/72>
-
If element’s element kind is
custom
and if config’s allow custom elements option is unset or set to anything other thantrue
: Returndrop
. -
Let name be element’s tag name.
-
If name is in config’s element drop list: Return
drop
. -
If name is in config’s element block list: Return
block
. -
If config has a non-empty element allow list and name is not in config’s element allow list: Return
block
. -
If config does not have a non-empty element allow list and name is not it the default configuration's element allow list: Return
block
. -
Return
keep
.
-
if config’s attribute drop list contains attr’s local name as key, and the associated value contains either element’s tag name or the string
"*"
: Returndrop
. -
If config has a non-empty attribute allow list and it does not contain attr’s local name, or attr’s associated value contains neither element’s tag name nor the string
"*"
: Returndrop
. -
if config does not have a non-empty attribute allow list and default configuration's attribute allow list does not contain attr’s local name, or attr’s associated value contains neither element’s tag name nor the string
"*"
: Returndrop
. -
Return
keep
.
2.4.2. Baseline and Defaults
The sanitizer baseline and defaults need to be carefully vetted, and are still under discussion. The values below are for illustrative purposes only.
-
if element’s element kind is
regular
and if element’s tag name is not in the baseline element allow list: Returndrop
. -
Return
keep
.
-
If attr’s attribute kind is
regular
and if attr’s name is not in the baseline attribute allow list: Returndrop
-
Return
keep
.
The sanitizer has a built-in default configuration, which is stricter than the baseline and aims to eliminate any script-injection possibility, as well as legacy or unusual constructs.
The defaults and baseline are defined by three JSON constants, baseline element allow list, baseline attribute allow list, default configuration. For better readability, these have been moved to an appendix A.
3. Security Considerations
The Sanitizer API is intended to prevent DOM-Based Cross-Site Scripting by traversing a supplied HTML content and removing elements and attributes according to a configuration. The specified API must not support the construction of a Sanitizer object that leaves script-capable markup in and doing so would be a bug in the threat model.
That being said, there are security issues which the correct usage of the Sanitizer API will not be able to protect against and the scenarios will be laid out in the following sections.
3.1. Server-Side Reflected and Stored XSS
This section is not normative.
The Sanitizer API operates solely in the DOM and adds a capability to traverse and filter an existing DocumentFragment. The Sanitizer does not address server-side reflected or stored XSS.
3.2. DOM clobbering
This section is not normative.
DOM clobbering describes an attack in which malicious HTML confuses an
application by naming elements through id
or name
attributes such that
properties like children
of an HTML element in the DOM are overshadowed by
the malicious content.
The Sanitizer API does not protect DOM clobbering attacks in its
default state, but can be configured to remove id
and name
attributes.
3.3. XSS with Script gadgets
This section is not normative.
Script gadgets is a technique in which an attacker uses existing application code from popular JavaScript libraries to cause their own code to execute. This is often done by injecting innocent-looking code or seemingly inert DOM nodes that is only parsed and interpreted by a framework which then performs the execution of JavaScript based on that input.
The Sanitizer API can not prevent these attacks, but requires page authors to
explicitly allow attributes and elements that are unknown to HTML and markup
that is known to be widely used for templating and framework-specific code,
like data-
and slot
attributes and elements like <slot>
and <template>
.
We believe that these restrictions are not exhaustive and encourage page
authors to examine their third party libraries for this behavior.
3.4. Mutated XSS
This section is not normative.
Mutated XSS or mXSS describes an attack based on parser mismatches when parsing an HTML snippet without the correct context. In particular, when a parsed HTML fragment has been serialized to a string, the format is not guaranteed to be parsed and interpreted exactly the same when inserted into a different parent element. An example for carrying out such an attack is by relying on the change of parsing behavior for foreign content or misnested tags.
The Sanitizer API does not protect against mutated XSS, however we encourage
authors to use the sanitize()
function of the API which returns a
DocumentFragment and avoids risks that come with serialization and additional
parsing. Directly operating on a fragment after sanitization also comes with a
performance benefit, as the cost of additional serialization and parsing is
avoided.
4. Acknowledgements
Cure53’s [DOMPURIFY] is a clear inspiration for the API this document
describes, as is Internet Explorer’s window.toStaticHTML()
.
Appendix A: Built-in Constants
This appendix is normative.
These constants define core behaviour of the Sanitizer algorithm.
Note: The normative values of these constants are found below. They have been derived with the [DEFAULTS] script. It is expected that these values will be updated to include additional HTML elements as they are introduced in user agents.
The Baseline Element Allow List
The built-in baseline element allow list has the following value:
The Baseline Attribute Allow List
The baseline attribute allow list has the following value:
The Default Configuration Object
The built-in default configuration has the following value:


Settings
Swagger UI
Health Check
URL
Status
Headers
Result
Send
File Upload
URL
Status
Headers
Result
Send
File Download
URL
Status
Headers
Result
Download