GitHub is a great place to store all of your coding projects, but let's be honest, their profile formats is not appealing whatsoever. Show off all of your repositories and your hardwork in an easy-to-read way with Showcase!
In order to create your beautiful, interactive profile (and coming soon - your GitHub resume), we need certain information from you that we cannot retrieve from your GitHub profile.
This infomation would include your:
This information is not provided via GitHub's public API. We need this information in order to populate your contact info in regards to your address.
This information is not provided via GitHub's public API. We need this information in order to populate your contact info in regards to your phone number.
We do not need your name as we will pull this from your GitHub profile. If you don't use your real name on GitHub, we would suggest that you change this on GitHub.
We do not need your Twitter username. If this is available we will pull this from your GitHub profile as well.
We do all the work for you. Simply fill out the form and submit it.
Want a particular look and feel? We offer several different themes!
These terms of service outline the rules and regulations for the use of Showcase's Website.
GIt Profile ShowcaserBy accessing this website we assume you accept these terms of service in full. Do not continue to use Showcase's website if you do not accept all of the terms of service stated on this page.
The following terminology applies to these Terms of Service, Privacy Statement and Disclaimer Notice and any or all Agreements: "Client", "You" and "Your" refers to you, the person accessing this website and accepting the Company's terms of service. "The Company", "Ourselves", "We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves, or either the Client or ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner, whether by formal meetings of a fixed duration, or any other means, for the express purpose of meeting the Client's needs in respect of provision of the Company's stated services/productamplify-jss, in accordance with and subject to, prevailing law of United States of America. Any use of the above terminology or other words in the singular, plural, capitalisation and/or he/she or they, are taken as interchangeable and therefore as referring to same.
We employ the use of cookies. By using Showcase's website you consent to the use of cookies in accordance with Showcase's privacy policy.
Most of the modern day interactive web sites use cookies to enable us to retrieve user details for each visit. Cookies are used in some areas of our site to enable the functionality of this area and ease of use for those people visiting. Some of our affiliate / advertising partners may also use cookies.
Unless otherwise stated, Showcase and/or it's licensors own the intellectual property rights for all material on Showcase. All intellectual property rights are reserved. You may view and/or print pages from https://showcase.bsdadm.com for your own personal use subject to restrictions set in these terms of service.
You must not:
Redistribute content from Showcase (unless content is specifically made for redistribution).
We will approve link requests from these organizations if we determine that: (a) the link would not reflect unfavorably on us or our accredited businesses (for example, trade associations or other organizations representing inherently suspect types of business, such as work-at-home opportunities, shall not be allowed to link); (b)the organization does not have an unsatisfactory record with us; (c) the benefit to us from the visibility associated with the hyperlink outweighs the absence of Showcase; and (d) where the link is in the context of general resource information or is otherwise consistent with editorial content in a newsletter or similar product furthering the mission of the organization.
These organizations may link to our home page, to publications or to other Web site information so long as the link: (a) is not in any way misleading; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and it products or services; and (c) fits within the context of the linking party's site.
If you are among the organizations listed in paragraph 2 above and are interested in linking to our website, you must notify us by sending an e-mail to<EMAIL_ADDRESS>Please include your name, your organization name, contact information (such as a phone number and/or e-mail address) as well as the URL of your site, a list of any URLs from which you intend to link to our Web site, and a list of the URL(s) on our site to which you would like to link. Allow 2-3 weeks for a response.
Approved organizations may hyperlink to our Web site as follows:
No use of Showcase's logo or other artwork will be allowed for linking absent a trademark license agreement.
We reserve the right at any time and in its sole discretion to request that you remove all links or any particular link to our Web site. You agree to immediately remove all links to our Web site upon such request. We also reserve the right to amend these terms of service and its linking policy at any time. By continuing to link to our Web site, you agree to be bound to and abide by these linking terms of service.
If you find any link on our Web site or any linked web site objectionable for any reason, you may contact us about this. We will consider requests to remove links but will have no obligation to do so or to respond directly to you.
Whilst we endeavour to ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we commit to ensuring that the website remains available or that the material on the website is kept up to date.
We shall have no responsibility or liability for any content appearing on your Web site. You agree to indemnify and defend us against all claims arising out of or based upon your Website. No link(s) may appear on any page on your Web site or within any context containing content or materials that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights.
To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website (including, without limitation, any warranties implied by law in respect of satisfactory quality, fitness for purpose and/or the use of reasonable care and skill). Nothing in this disclaimer will:
The limitations and exclusions of liability set out in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer or in relation to the subject matter of this disclaimer, including liabilities arising in contract, in tort (including negligence) and for breach of statutory duty.
To the extent that the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature.
If you have any queries regarding any of our terms, please contact us.
It is Showcase's policy to respect your privacy regarding any information we may collect while operating our website. This Privacy Policy applies to https://showcase.bsdadm.com (hereinafter, "us", "we", or "https://showcase.bsdadm.com"). We respect your privacy and are committed to protecting personally identifiable information you may provide us through the Website. We have adopted this privacy policy ("Privacy Policy") to explain what information may be collected on our Website, how we use this information, and under what circumstances we may disclose the information to third parties. This Privacy Policy applies only to information we collect through the Website and does not apply to our collection of information from other sources.
This Privacy Policy, together with the Terms of service posted on our Website, set forth the general rules and policies governing your use of our Website. Depending on your activities when visiting our Website, you may be required to agree to additional terms of service.
Like most website operators, Showcase collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. Showcase's purpose in collecting non-personally identifying information is to better understand how Showcase's visitors use its website. From time to time, Showcase may release non-personally-identifying information in the aggregate, e.g., by publishing a report on trends in the usage of its website.
Showcase also collects potentially personally-identifying information like Internet Protocol (IP) addresses for logged in users and for users leaving comments on https://showcase.bsdadm.com blog posts. Showcase only discloses logged in user and commenter IP addresses under the same circumstances that it uses and discloses personally-identifying information as described below.
Certain visitors to Showcase's websites choose to interact with Showcase in ways that require Showcase to gather personally-identifying information. The amount and type of information that Showcase gathers depends on the nature of the interaction. For example, we ask visitors who sign up for a blog at https://showcase.bsdadm.com to provide a username and email address.
The security of your Personal Information is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Information, we cannot guarantee its absolute security.
Our Service may contain links to external sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy and terms of service of every site you visit.
We have no control over, and assume no responsibility for the content, privacy policies or practices of any third party sites, products or services.
Although most changes are likely to be minor, Showcase may change its Privacy Policy from time to time, and in Showcase's sole discretion. Showcase encourages visitors to frequently check this page for any changes to its Privacy Policy. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.
If you have any questions about this Privacy Policy, please contact us via email or phone.
Showcase is a GitHub Profile Showcaser. Use your GitHub username and personal contact information to dynamically build a simple and beautiful GitHub Profile that shows your latest repositories.
Later versions plan to bring server-side persistance, and a custom URL to show off your custom Showcase to perspective employers.
You can even get a random cat fact. Just click on the paw print, within the informational sections below.
A cat fact will also be automatically generated and displayed with the Material Cards theme as well.


Right Click Arrows
First lets make sure we are just getting 1 click for each left click in the air
We can test this code by left and right clicking. You should see a server message increment by 1 for each left click in the air.
Now lets add in the arrows and change to right click on air
Remember that vectors for entitites are stored at their location rather than with the entity
You should see arrows flying on a right click


Boundary conditions¶
Offshore waves¶
Offshore wave conditions should be given as a wavetimeseries objet. Data sources include offshore wave buoys and model data. To simulate relative long periods, hindcast data are one of the best options, so the procedure is detailed below.
Using ERA5 based ocean wave hindcast¶
ERA5 is the fifth generation ECMWF (European Centre for Medium-Range Weather Forecasts) atmospheric reanalysis of the global climate and have a horizontal resolution of 0.5 \(^{\circ}\) x 0.5 \(^{\circ}\) for waves.
Warning
Prior to download the wave data make sure that the CDS API and xarray package are properly installed.
See Prerequisites to download ERA5 data through CDS API for details.
1 - Data selection and downloading¶
The best way to navigate to the available data is to open ERA5 download page and in the download tab select the desired data. In the bottom of the same panel click on the Show API request button and copy the code to a python file.
Example
Example of a code for downloading a grib file with wave significant height, mean period and mean direction, for a region offshore mainland Portugal, for all available hours of day 01-April-2020. Data will be download to a file named download.grib.
import cdsapi
c = cdsapi.Client()
c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type': 'reanalysis',
'format': 'grib',
'variable': [
'mean_wave_direction', 'mean_wave_period', 'significant_height_of_combined_wind_waves_and_swell',
],
'year': '2020',
'month': '04',
'day': '01',
'time': [
'00:00', '01:00', '02:00',
'03:00', '04:00', '05:00',
'06:00', '07:00', '08:00',
'09:00', '10:00', '11:00',
'12:00', '13:00', '14:00',
'15:00', '16:00', '17:00',
'18:00', '19:00', '20:00',
'21:00', '22:00', '23:00',
],
'area': [
43, -13, 36,
-7,
],
},
'download.grib')
Output on pyton console
2020-05-15 19:26:36,562 INFO Welcome to the CDS
2020-05-15 19:26:36,567 INFO Sending request to https://cds.climate.copernicus.eu/api/v2/resources/reanalysis-era5-single-levels
2020-05-15 19:26:39,209 INFO Request is queued
2020-05-15 19:26:44,134 INFO Request is running
2020-05-15 19:26:52,695 INFO Request is completed
2020-05-15 19:26:52,697 INFO Downloading http://<IP_ADDRESS>/cache-compute-0008/cache/data5/adaptor.mars.internal-1589567202.6668167-11772-35-ea112760-394c-4211-a63e-bdfd778e233c.grib to download.grib (33.8K)
2020-05-15 19:26:52,876 INFO Download rate 190.7K/s
2 - Loading and converting the data to a wavetimeseries


Guidance
Types of apprenticeships that you can apply for in the equine sector.
This apprenticeship gives you the opportunity for working in livery yards, riding schools, racing yards, training yards or using harnessed horses.
Your training will focus on either general horse care, racehorse care or harness horse care, depending on your employer.
As an apprentice, you could find yourself in one of many jobs like stable hand, groom, stud assistant or riding instructor. You’ll learn how to take care of horses, which will include everything from feeding and grooming through to exercising.
There are 2 types of equine apprenticeships.
Advanced level apprenticeship
You can become an apprentice in England if you’re:
Published: 12 April 2012


Injured man rescued from under ride on lawn mower
Ambulance and fire crews were sent to the A377 in Umberleigh after the call came in at 4:15pm.
by Richard BoothEmergency service rushed to North Devon on Sunday afternoon after a man became injured and stuck under a ride on lawn mower.
Ambulance and fire crews were sent to the A377 in Umberleigh after the call came in at 4:15pm.
One fire engine from Chulmleigh and one from South Molton were sent to the scene.
Devon & Somerset Fire & Rescue Service said they were called to a report of a male stuck beneath a ride on lawn mower.
Adding: "Liaising with Paramedics, Fire crews released the injured casualty from beneath the lawn mower. The male was taken to hospital by ambulance."
Updates as we have them.


You've been logged in successfully!
Saving please wait...
Title
Logo/Photo
Description
Current Deals


--- title: bioRxiv Scraper keywords: fastai sidebar: home_sidebar summary: "A simple web scraper for scraping articles and their metadata from bioRxiv." ---
git clone https://github.com/JohnGiorgi/biorxiv_scraper.git
cd biorxiv-scraper
pip install -e .
Everything happens via the bioRxivScraper
class. Begin by creating an instance
from biorxiv_scraper.core import bioRxivScraper
scraper = bioRxivScraper()
You can then call its various methods for scraping bioRxiv. For example, to scrape all articles uploaded in 2019 under the subject area "Animal Behavior and Cognition"
scraped_content = scraper.by_year(2019, subject_areas="Animal Behavior and Cognition")
scraped_content
is a dictionary keyed by doi, that contains the scraped data and metadata for each article


--- status: ready title: "Proofpoint Set - scroll version" text: ---
La Trobe is in the top 1% of universities worldwide
Find out more
Our Career Ready program is co-designed with industry
We conduct ground-breaking cancer research
Employers give La Trobe top marks
We’re rated at, above or well above world standard in all our broad research areas


About Me
I grew up in Vancouver and studied Computer Engineering at the University of Waterloo. The co-op program at Waterloo gave me the unique opportunity to intern at exceptional companies including Apple, LinkedIn, and Uber. I’ll soon begin the next chapter of my life, where I will be moving to San Francisco to join the Search Platform team at LinkedIn. I’m a perpetual learner — I firmly believe that if I am not learning, then I must take corrective action to make changes in my life. I’m also an optimist by nature and believe that virtually any problem can be deconstructed and solved through the collective hard work and brainpower of people.
Motivation
During my teenage years, society sharply transitioned into an increasingly digital lifestyle. Platforms such as Facebook and Twitter acted as a virtual playground for millennials around the globe with access to the Internet. These platforms allowed me, as well as my peers, to propagate opinions, beliefs, and interests to the rest of the world in the click of a button. However, as time passed, the consumption patterns of these platforms drastically changed among my demographic. These platforms no longer provide a safe space for honest opinions and earnest debates. One of the main motivations for the creation of this website is to fill this void. I also think that it would be of value — mostly for my future self — to virtualize some of my thoughts, beliefs, and personal research on topics I take a deep interest in.


| HTML {htmltools} | R Documentation |
Marks the given text as HTML, which means the tag functions will know not to perform HTML escaping on it.
HTML(text, ..., .noWS = NULL)
text |
The text value to mark with HTML |
... |
Any additional values to be converted to character and concatenated together |
.noWS |
Character vector used to omit some of the whitespace that would
normally be written around this HTML. Valid options include |
The same value, but marked as HTML.
el <- div(HTML("I like <u>turtles</u>")) cat(as.character(el))


A MODERN MASTERPIECE
When Paul Renner designed Futura in 1927 it looked chic and ahead of its time. Futura is dazzling in its simplicity, welcoming in its rationality. It’s simple and beautiful. Many fonts come and go. Many fonts find the spotlight for a time, but Futura has remained as relevant and innovative as it was when it was created 90 years ago.
A TRIBUTE FOR THE DIGITAL ERA
Renner* was built from the ground up to work in the digital age. In designing Renner*, nothing about Paul Renner’s design for Futura was taken for granted. Letters were created to be the best possible iterations of themselves, while extreme precaution was taken to ensure that as a collective family, Renner* functions seamlessly. This has resulted in numerous notable differences between Renner* and Futura. Renner*’s weighting system is a bit different, to make it more inline with the typefaces of today. Renner* also has more balanced capital forms, for a better flow, especially at text sizes. It does this while retaining the elegance that defines Futura.
FREE AS IN FREEDOM
For those of us looking for a free and legal alternative to Futura, I got you. I’ve elected to release Renner* under the SIL open font licence, meaning it’s not only free to use for personal uses, it’s free to use for comercial uses, and even modify and distribute, assuming the licence follows it.
MULTI-WEIGHTED
Renner* doesn't just come with a book and bold weight. It comes with five weights, spanning from light to black. This doesn’t just make it handy in its expressivity, it also allows it to adapt to all manner of context and media.
TRUE ITALICS
Renner* has true italics! Each of the letters in Renner* was reconsidered and redesigned for its italic counterpart, something often skipped in sans serif fonts. This means letterforms that worked for the roman version, are sometimes entirely different for the italic. By going this extra mile, italics don’t just look slanty, they feel italic-y.
KERNING
The kerning is really something to boast about. Kerning didn't just stop at the obvious, like AV
. Kerning pairs include subtle combos, like rs
. What results is kerning that you don't have to think about. Everything just works.
 You don't have to pay anything if you don't want to! You can always come back and pay what it's worth.


Select a joint to visualize in the graph to the left.
Hover your mouse over the graph to select a timepoint in the video.
Javanese context
Kambeng-dhengklik are proud and strong monkeys. Their arm positions are symmetrical and their bodies bounce when stepping. They faced diagonally downward (Soedarsono, 1985, 228). An example from Sendratari Ramayana is Hanuman.


Unlike Hayden, I was born outside Canada, in Colombia's capital, Bogota. I lived there my entire life until now that I decided to start a new life project here in London, Ontario.
My mother and I have always loved photograpy, and it wouldn't be me if I didn't share some baby photos.
Since I was a child I have always liked the arts world. I remember the time while I was in elementary school, I paticipated in dance, singing,painting, and sports competitions.Currently I consider that none of this has changed in my life, on the contrary, I have been developing it more and more.
One of my most recent drawing works which I am proud of is the following one:
Here you could find my social media links so you can get to know me a little bit more:


You can search the forum or use the form below to open a ticket for assistance. Thank you for being our valued customer!
Feel free to contact us anytime.
Though feedback will be provided within the below working hours.
| Day(s) | Hours |
|---|---|
| Monday - Friday | 08:00 - 18:00 GMT+3 |
| Saturday | No customer service will be offered. |
| Sunday | 14:00 - 18:00 GMT+3 |


Guard Jacob:
Ah, you still have the honey I made you. Please be careful, as the bottle may break rather easily.


How to setup a public web-server
There are many public minecraft servers available. Most are very similar.
It all comes down to cost versus playability
Here is the price chart for apexminecrafthosting.com:
Servers use file transfer protocol (FTP) to move files from your personal computer to the web-site:
You need to copy scriptcraft.jar to the plugins directory, and copy over the files in your world directory
Then use the console to restart the server


new Service_(serviceName)
Creates a new OAuth2 service.
Parameters:
| Name | Type | Description |
|---|---|---|
serviceName |
string | The name of the service. |
Methods
exchangeGrant_()
Obtain an access token using the custom grant type specified. Most often
this will be "client_credentials", and a client ID and secret are set an
"Authorization: Basic ..." header will be added using those values.
fetchToken_(payload, optUrlopt) → {Object}
Fetches a new token from the OAuth server.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
payload |
Object | The token request payload. | |
optUrl |
string |
<optional> |
The URL of the token endpoint. |
Returns:
The parsed token.
- Type
- Object
generateCodeVerifier() → (non-null) {Service_}
Sets the code verifier to a randomly generated challenge string.
Returns:
This service, for chaining
- Type
- Service_
getAccessToken() → {string}
Gets an access token for this service. This token can be used in HTTP
requests to the service's endpoint. This method will throw an error if the
user's access was not granted or has expired.
Returns:
An access token.
- Type
- string
getAuthorizationUrl(optAdditionalParameters) → {string}
Gets the authorization URL. The first step in getting an OAuth2 token is to
have the user visit this URL and approve the authorization request. The
user will then be redirected back to your application using callback function
name specified, so that the flow may continue.
Parameters:
| Name | Type | Description |
|---|---|---|
optAdditionalParameters |
Object | Additional parameters that should be stored in the state token and made available in the callback function. |
Returns:
The authorization URL.
- Type
- string
getIdToken() → {string}
Gets an id token for this service. This token can be used in HTTP
requests to the service's endpoint. This method will throw an error if the
user's access was not granted or has expired.
Returns:
An id token.
- Type
- string
getLastError() → {Exception}
Gets the last error that occurred this execution when trying to automatically
refresh or generate an access token.
Returns:
An error, if any.
- Type
- Exception
getRedirectUri() → {string}
Returns the redirect URI that will be used for this service. Often this URI
needs to be entered into a configuration screen of your OAuth provider.
Returns:
The redirect URI.
- Type
- string
getStorage() → {Storage_}
Gets the storage layer for this service, used to persist tokens.
Custom values associated with the service can be stored here as well.
The key
null
is used to to store the token and should not
be used.
Returns:
The service's storage.
- Type
- Storage_
getToken(optSkipMemoryChecknullable) → {Object}
Gets the token from the service's property store or cache.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
optSkipMemoryCheck |
boolean |
<nullable> |
If true, bypass the local memory cache when fetching the token. |
Returns:
The token, or null if no token was found.
- Type
- Object
handleCallback(callbackRequest) → {boolean}
Completes the OAuth2 flow using the request data passed in to the callback
function.
Parameters:
| Name | Type | Description |
|---|---|---|
callbackRequest |
Object | The request data recieved from the callback function. |
Returns:
True if authorization was granted, false if it was denied.
- Type
- boolean
hasAccess() → {boolean}
Determines if the service has access (has been authorized and hasn't
expired). If offline access was granted and the previous token has expired
this method attempts to generate a new token.
Returns:
true if the user has access to the service, false
otherwise.
- Type
- boolean
refresh()
Refreshes a token that has expired. This is only possible if offline access
was requested when the token was authorized.
reset()
Resets the service, removing access and requiring the service to be
re-authorized. Also removes any additional values stored in the service's
storage.
setAdditionalClaims(additionalClaims) → (non-null) {Service_}
Sets additional JWT claims to use for Service Account authorization.
Parameters:
| Name | Type | Description |
|---|---|---|
additionalClaims |
Object.<string, string> | The additional claims, as key-value pairs. |
Returns:
This service, for chaining.
- Type
- Service_
setAuthorizationBaseUrl(authorizationBaseUrl) → (non-null) {Service_}
Sets the service's authorization base URL (required). For Google services
this URL should be
https://accounts.google.com/o/oauth2/auth.
Parameters:
| Name | Type | Description |
|---|---|---|
authorizationBaseUrl |
string | The authorization endpoint base URL. |
Returns:
This service, for chaining.
- Type
- Service_
setCache(cache) → (non-null) {Service_}
Sets the cache to use when persisting credentials (optional). Using a cache
will reduce the need to read from the property store and may increase
performance. In most cases this should be a private cache, but a public cache
may be appropriate if you want to share access across users.
Parameters:
| Name | Type | Description |
|---|---|---|
cache |
CacheService.Cache | The cache to use when persisting credentials. |
Returns:
This service, for chaining.
- Type
- Service_
setCallbackFunction(callbackFunctionName) → (non-null) {Service_}
Sets the name of the authorization callback function (required). This is the
function that will be called when the user completes the authorization flow
on the service provider's website. The callback accepts a request parameter,
which should be passed to this service's
handleCallback()
method
to complete the process.
Parameters:
| Name | Type | Description |
|---|---|---|
callbackFunctionName |
string | The name of the callback function. |
Returns:
This service, for chaining.
- Type
- Service_
setClientId(clientId) → (non-null) {Service_}
Sets the client ID to use for the OAuth flow (required). You can create
client IDs in the "Credentials" section of a Google Developers Console
project. Although you can use any project with this library, it may be
convinient to use the project that was created for your script. These
projects are not visible if you visit the console directly, but you can
access it by click on the menu item "Resources > Advanced Google services" in
the Script Editor, and then click on the link "Google Developers Console" in
the resulting dialog.
Parameters:
| Name | Type | Description |
|---|---|---|
clientId |
string | The client ID to use for the OAuth flow. |
Returns:
This service, for chaining.
- Type
- Service_
setClientSecret(clientSecret) → (non-null) {Service_}
Sets the client secret to use for the OAuth flow (required). See the
documentation for
setClientId()
for more information on how to
create client IDs and secrets.
Parameters:
| Name | Type | Description |
|---|---|---|
clientSecret |
string | The client secret to use for the OAuth flow. |
Returns:
This service, for chaining.
- Type
- Service_
setCodeChallengeMethod(method) → (non-null) {Service_}
Set the code challenge method for PKCE. The default value method
when a code verifier is set is S256.
Parameters:
| Name | Type | Description |
|---|---|---|
method |
string | Challenge method, either "S256" or "plain" |
Returns:
This service, for chaining
- Type
- Service_
setCodeVerififer(codeVerifier) → (non-null) {Service_}
Set the code verifier used for PKCE. For most use cases,
prefer `generateCodeVerifier` to automatically initialize the
value with a generated challenge string.
Parameters:
| Name | Type | Description |
|---|---|---|
codeVerifier |
string | A random challenge string |
Returns:
This service, for chaining
- Type
- Service_
setExpirationMinutes(expirationMinutes) → (non-null) {Service_}
Sets number of minutes that a token obtained through Service Account
authorization should be valid. Default: 60 minutes.
Parameters:
| Name | Type | Description |
|---|---|---|
expirationMinutes |
string | The expiration duration in minutes. |
Returns:
This service, for chaining.
- Type
- Service_
setGrantType(grantType) → (non-null) {Service_}
Sets the OAuth2 grant_type to use when obtaining an access token. This does
not need to be set when using either the authorization code flow (AKA
3-legged OAuth) or the service account flow. The most common usage is to set
it to "client_credentials" and then also set the token headers to include
the Authorization header required by the OAuth2 provider.
Parameters:
| Name | Type | Description |
|---|---|---|
grantType |
string | The OAuth2 grant_type value. |
Returns:
This service, for chaining.
- Type
- Service_
setIssuer(issuer) → (non-null) {Service_}
Sets the issuer (iss) value to use for Service Account authorization.
If not set the client ID will be used instead.
Parameters:
| Name | Type | Description |
|---|---|---|
issuer |
string | This issuer value |
Returns:
This service, for chaining.
- Type
- Service_
setLock(lock) → (non-null) {Service_}
Sets the lock to use when checking and refreshing credentials (optional).
Using a lock will ensure that only one execution will be able to access the
stored credentials at a time. This can prevent race conditions that arise
when two executions attempt to refresh an expired token.
Parameters:
| Name | Type | Description |
|---|---|---|
lock |
LockService.Lock | The lock to use when accessing credentials. |
Returns:
This service, for chaining.
- Type
- Service_
setParam(name, value) → (non-null) {Service_}
Sets an additional parameter to use when constructing the authorization URL
(optional). See the documentation for your service provider for information
on what parameter values they support.
Parameters:
| Name | Type | Description |
|---|---|---|
name |
string | The parameter name. |
value |
string | The parameter value. |
Returns:
This service, for chaining.
- Type
- Service_
setPrivateKey(privateKey) → (non-null) {Service_}
Sets the private key to use for Service Account authorization.
Parameters:
| Name | Type | Description |
|---|---|---|
privateKey |
string | The private key. |
Returns:
This service, for chaining.
- Type
- Service_
setPropertyStore(propertyStore) → (non-null) {Service_}
Sets the property store to use when persisting credentials (required). In
most cases this should be user properties, but document or script properties
may be appropriate if you want to share access across users.
Parameters:
| Name | Type | Description |
|---|---|---|
propertyStore |
PropertiesService.Properties | The property store to use when persisting credentials. |
Returns:
This service, for chaining.
- Type
- Service_
setRedirectUri(redirectUri) → (non-null) {Service_}
Sets the URI to redirect to when the OAuth flow has completed. By default the
library will provide this value automatically, but in some rare cases you may
need to override it.
Parameters:
| Name | Type | Description |
|---|---|---|
redirectUri |
string | The redirect URI. |
Returns:
This service, for chaining.
- Type
- Service_
setRefreshUrl(refreshUrl) → (non-null) {Service_}
Sets the service's refresh URL. Some OAuth providers require a different URL
to be used when generating access tokens from a refresh token.
Parameters:
| Name | Type | Description |
|---|---|---|
refreshUrl |
string | The refresh endpoint URL. |
Returns:
This service, for chaining.
- Type
- Service_
setScope(scope, optSeparatoropt) → (non-null) {Service_}
Sets the scope or scopes to request during the authorization flow (optional).
If the scope value is an array it will be joined using the separator before
being sent to the server, which is is a space character by default.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
scope |
string | Array.<string> | The scope or scopes to request. | |
optSeparator |
string |
<optional> |
The optional separator to use when joining multiple scopes. Default: space. |
Returns:
This service, for chaining.
- Type
- Service_
setSubject(subject) → (non-null) {Service_}
Sets the subject (sub) value to use for Service Account authorization.
Parameters:
| Name | Type | Description |
|---|---|---|
subject |
string | This subject value |
Returns:
This service, for chaining.
- Type
- Service_
setTokenFormat(tokenFormat) → (non-null) {Service_}
Sets the format of the returned token. Default: OAuth2.TOKEN_FORMAT.JSON.
Parameters:
| Name | Type | Description |
|---|---|---|
tokenFormat |
OAuth2.TOKEN_FORMAT | The format of the returned token. |
Returns:
This service, for chaining.
- Type
- Service_
setTokenHeaders(tokenHeaders) → (non-null) {Service_}
Sets the additional HTTP headers that should be sent when retrieving or
refreshing the access token.
Parameters:
| Name | Type | Description |
|---|---|---|
tokenHeaders |
Object.<string, string> | A map of header names to values. |
Returns:
This service, for chaining.
- Type
- Service_
setTokenMethod(tokenMethod) → (non-null) {Service_}
Sets the HTTP method to use when retrieving or refreshing the access token.
Default: "post".
Parameters:
| Name | Type | Description |
|---|---|---|
tokenMethod |
string | The HTTP method to use. |
Returns:
This service, for chaining.
- Type
- Service_
setTokenPayloadHandler(tokenHandler) → (non-null) {Service_}
Sets an additional function to invoke on the payload of the access token
request.
Parameters:
| Name | Type | Description |
|---|---|---|
tokenHandler |
tokenHandler | tokenHandler A function to invoke on the payload of the request for an access token. |
Returns:
This service, for chaining.
- Type
- Service_
setTokenUrl(tokenUrl) → (non-null) {Service_}
Sets the service's token URL (required). For Google services this URL should
be https://accounts.google.com/o/oauth2/token.
Parameters:
| Name | Type | Description |
|---|---|---|
tokenUrl |
string | The token endpoint URL. |
Returns:
This service, for chaining.
- Type
- Service_


Mehakpreet Kaur
Hi guys, I'm Mehakpreet Kaur.(I go by Mehak) I'm currently a freshman at NJIT majoring in Computing and Business.
This is my first website for which I'm collaborating with two of my friends, Noura and Tejasree.
This website counts as a major project for my Information Systems Class in Website Development.
I'm
a coder, with a fluent hand in Python and some experience in coding in C++ as well. Other than
coding abilities, I also believe I've a good hand at writing poems and short stories and am thus a part
of the writing committee in NJIT's Yearbook club (NUCLEUS). I also like reading, playing tennis and going on adventures (I go hiking on Sundays!)


Daily Solidity Update - PHP-based ERC20 token transfers, multi-sigs, Medium posts, the Berlin Council, and more!
May 30, 2018
Heya Developers!
Happy Wednesday. Just a few days until we can get to our side projects this weekend… how are you going going to decentralize?
Solidity community updates
There’s a nice question and answer on how to make ERC20 token transfer in PHP on Stackoverflow. Apparently someone Furqan Siddiqui was kind enough to write a PHP library for it (erc20-php). Love this community.
On Github, dsys got a lot of love for the new solidity library for verifying Ethereum message multi-signatures (dsys/solidity-sigutils.)
Lots of good new stuff on Medium today. Here are just a couple: Doug Crescenzi wrote an in depth post on the msg object with some surprising details you might have missed if all you did was copy and paste from some tutorials (e.g., when’s the last time you used msg.sig, the “first four bytes of the calldata for a function that specifies the function to be called”?). Christian Reitwiessner (@chriseth) writes a dense but short post explaining unexpected reverts starting with Solidity 0.4.22 – especially useful for those implementing the ERC20 interface.
On Twitter Murilo Costa says, “Can’t wait to see all the javascript/ #Ethereum #solidity programmers writing c++ $EOS smart contracts. This is going a ‘out of bounds’ festival.” Seriously. And if you’re in Berlin there’s a meetup on the upcoming solidity 0.5.0 features. Wish I had enough points to fly out.
The Council of Berlin agenda is taking shape (or is it the Berlin Council?). Seems like a nice time to be in Germany….


Protect yourself
Live a stress free life
Designed to cover the costs and losses and reduce the risk associated with unexpected events incurred while traveling.
Provides a financial protection against physical or bodily injury resulting from ownership and or use of motor vehicle for physical accidental, collisions and against liability that could arise therefrom.
Is a specially designed savings plan for you to make provisions for your retirement
Is a means of ensuring that your family or dependants are financially secure after your death.
General insurance or non-life insurance policies, including automobile and homeowners policies, provide payments depending on the loss from a particular financial event.
Provides a financial protection against physical or bodily injury resulting from ownership and or use of motor vehicle for physical accidental, collisions and against liability that could arise therefrom.
Takaful is a type of Islamic insurance, where members contribute money into a pool system in order to guarantee each other against loss or damage. Takaful-branded insurance is based on sharia, Islamic religious law
Health insurance is insurance that covers the whole or a part of the risk of a person incurring medical expenses, spreading the risk over a large number of persons
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Itaque earum nostrum suscipit ducimus nihil provident, perferendis rem illo, voluptate atque, sit eius in voluptates, nemo repellat fugiat excepturi! Nemo, esse.


When archived or played back, the script tag in this page should use top-level cookies to log out the current user.


--- layout: archive ---
Josephine (Joey) is a designer, facilitator, sometimes-technologist, and graduate student researcher with the Tactile and Tactical (TAT) Design Lab in the Department of Human Centered Design & Engineering at the University of Washington. Josephine's work is motivated by a desire to help imagine and engineer emancipatory sociotechnical systems, designed and adopted with enthusiastic consent by the individuals and communities who will live with them, and with consideration and regard for future generations, non-human life, and our world .
Joey’s current research in infrastructuring for solidarity and radical care draws from participatory design traditions, community organizing, and collective imaginings (such as speculative fiction and theatre).


Home
Daily Expenses
Monthly Expenses
About
Contact
Contact US
A site to organize the payment of salary in a good way
And direct it to provide a part of it .


Ionic API Docs
Ionic takes everything you know and loved about Ionic V1, and builds on top of it to provide a much more flexible framework.
In the API docs, you’ll find two kinds of doc pages: Component and Service APIs.
The Component APIs include classes like Checkbox
, Toggle
or Item
and show you how to use them, in addition to listing their selectors, available properties and events.
The Service APIs are classes like MenuController
, Config
or Platform
. These are services provided by Ionic that can be injected into your classes.


Chapter 7 The Tidyverse
You can skip this chapter if:
-
You are comfortable using the tidyverse
pivot_longer
andpivot_wider
commands -
You can rename variables
-
You can create and change variables in a dataset.
7.1 Opinionated Packages
Throughout this book I’ve been teaching you the tidyverse
way of doing things. There’s quite a lot of debate as to whether tidyverse
is the easy or hard way to learn things. A lot of people think that tidyverse
is more difficult because it sometimes generates more lines of code. However, I really like the way that tidyverse
code is easily guessed. If you know you want to change something, you can take a guess at what verb you want to use.
This is because the tidyverse
is ‘opinionated’. That means there’s an underlying philosophy behind how each package tries to think about data. I like the underlying theory, and I also like that the packages are explicit about the fact that data science itself comes with its own philosophies.
One of the most important philosophies, as everyone online says - tidy data has one observation per row.
There are a few things that tidyverse
makes really easy:
Visualising data with ggplot2
Making new variables or changing variables with
mutate
‘Pivoting’ data into tall and wide formats with
pivot
We will cover these commands in this chapter.
7.2 Data for this chapter
For this chapter let’s work on an example of student satisfaction data. We’ll use a short, fictional example to avoid embarrassing anyone. Let’s say I questioned my students on two courses, Professional Skills, an undergraduate course, and Research Methods, a postgraduate course. I know how many students (n
) were in each class, and I asked each class if they agreed with two statements, “Jill was a good teacher” (good_teacher
) and “I learned in this class” (learned
). I know what percentage of students disagreed with the statement (disagree
), were neutral about the statement (neutral
), or agreed with the statement (agree
). And I also know which of the two years I asked the question in (year
).
Let’s load the data and the tidyverse package first:
library(tidyverse)
students <- tibble (course = c("Prof Skills", "Prof Skills", "Prof Skills", "Prof Skills",
"Research Methods", "Research Methods", "Research Methods", "Research Methods"),
level = c("UG", "UG", "UG", "UG",
"PG", "PG", "PG", "PG"),
question = c("good_teacher", "learned","good_teacher", "learned",
"good_teacher", "learned","good_teacher", "learned"),
year = c(1, 1, 2, 2,
1, 1, 2, 2),
disagree = c(0.8, 0.3, 0.8, 0.2, 0.7, 0.5, 0.6, 0.3),
neutral = c(0.05, 0.4, 0.1, 0.3, 0.1, 0.4, 0.2, 0.3),
agree = c(0.15, 0.3, 0.1, 0.5, 0.2, 0.1, 0.2, 0.4),
n = c(121, 121, 140, 140, 50, 50, 57,57))
7.3 Mutating data
We have covered the mutate
function in previous chapters, but I’m going to specifically cover a few different forms of it now.
In this section I’m going to create a new dataset students_tidy
which will leave our original dataset students
untouched. This is to demonstrate how much data can be transformed, and you might want to think about the difference between the original dataset and the finished product when you’re thinking about workflows.
7.3.1 Mutate to change a variable type.
Let’s start with an example you’ve seen before. At the moment, year
is a numerical variable, which we can prove:
## [1] TRUE
So the first thing we want to do is make year a categorical variable, since there’s only two years available to us. We can retain the order of the levels by specifying them with the parse_factor
command. parse_factor
is really useful, but it only works on character variables, so we need to first change year to a character, and then to a factor.
students_tidy <- students %>%
mutate(year = as.character(year),
year = parse_factor(year, levels = c("1", "2")))
You can try taking out the year = as.character(year)
line to see what happens. What error messages do you get?
And now we can ask:
## [1] FALSE
## [1] TRUE
7.3.2 Mutate to change the contents of data
What if we don’t want to change data type, but instead change the text of the data? There’s a very cool function called case_when
which works like an if statement in Excel.
students_tidy <- students_tidy %>%
mutate(level = case_when(level == "UG" ~ "Undergraduate",
level == "PG" ~ "Postgraduate"))
In this code chunk we:
-
Create the object
students_tidy
(which we are overwriting, since it already exists) -
Make the new
students_tidy
object from the old one, and then … -
Change a variable within
students_tidy
(mutate
) -
Create a new variable
level
(which we are overwriting, since it already exists) -
When a row of
level
readsUG
, change it to (~
)Undergraduate
-
When a row of
level
readsPG
, change it to (~
)Postgraduate
And we can check to see if this work by looking at a slice of the data.
## # A tibble: 6 x 8
## course level question year disagree neutral agree n
## <chr> <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Prof Skills Undergraduate good_teacher 1 80 5 15 121
## 2 Prof Skills Undergraduate learned 1 30 40 30 121
## 3 Prof Skills Undergraduate good_teacher 2 80 10 10 140
## 4 Prof Skills Undergraduate learned 2 20 30 50 140
## 5 Research Methods Postgraduate good_teacher 1 70 10 20 50
## 6 Research Methods Postgraduate learned 1 50 40 10 50
7.3.3 Mutate to change multiple variables
We can also change multiple variables using the mutate_at
function. This can be a little more difficult to master, but is often faster than typing out multiple lines of mutate
.
Our disagree
, neutral
and agree
columns are currently expressed as percentages, e.g. row 1 above had 80% of students disagreeing, 5% of students neutral, and 15% of students agreeing with the statement I was a good teacher. However, we know the number of students in each class, so it might be better to express those values as a proportion (e.g. 0.8, 0.05, 0.15). That’s a simple calculation - we need to take each value and divide by 100.
To do this, we need to use two particularly cool things about tidyverse
, the ability to select multiple variables, and the ability to use .
to mean whatever I just asked for
.
students_tidy <- students_tidy %>%
mutate_at(.vars = vars(c(disagree, neutral, agree)),
.funs = ~(. / 100))
In this code chunk we:
-
Create the object
students_tidy
(which we are overwriting, since it already exists) -
Make the new
students_tidy
object from the old one, and then … -
Change more than one variable within
students_tidy
(mutate_at
) -
Specify what variables we want to change (
.vars = vars
) -
List those variables, which are a string of names (
c(disagree, neutral, agree)
) -
Specify the function we want to apply to each of the previously selected variables (
.funs =
) -
We’re not asking for a named function so we show this with
~
-
We want to divide the previously asked for variables by 100 (
(./100)
, where.
is a dummy variable standing in for the previously selected variables. )
And as always, we can test this by showing a slice of the data:
## # A tibble: 6 x 8
## course level question year disagree neutral agree n
## <chr> <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Prof Skills Undergraduate good_teacher 1 0.8 0.05 0.15 121
## 2 Prof Skills Undergraduate learned 1 0.3 0.4 0.3 121
## 3 Prof Skills Undergraduate good_teacher 2 0.8 0.1 0.1 140
## 4 Prof Skills Undergraduate learned 2 0.2 0.3 0.5 140
## 5 Research Methods Postgraduate good_teacher 1 0.7 0.1 0.2 50
## 6 Research Methods Postgraduate learned 1 0.5 0.4 0.1 50
7.3.4 Summarise as a unique form of mutate
Mutate is really powerful thing, so unsurprisingly the idea behind it is used in other calls. One that’s really useful to know about (and that we’ll talk more about in descriptive statistics) is summarise
.
summarise
creates a new mutated data frame by default, so its good for grouping together things, for example we can use it to look at the average percentage in each group by question:
students_summed <- students_tidy %>%
group_by(question) %>%
summarise(mean_disagree = mean(disagree),
mean_neutral= mean(neutral),
mean_agree = mean(agree))
And in fact, if we just want to look at this data quickly, we don’t even need to create a new dataset, we can just look at the output in the console:
students_tidy %>%
group_by(question) %>%
summarise(mean_disagree = mean(disagree),
mean_neutral= mean(neutral),
mean_agree = mean(agree))
## # A tibble: 2 x 4
## question mean_disagree mean_neutral mean_agree
## <chr> <dbl> <dbl> <dbl>
## 1 good_teacher 0.725 0.112 0.162
## 2 learned 0.325 0.35 0.325
You’ll note that we lose all the other variables (like course
, level
and n
) doing this, so you might want to be careful if you’re using summarise
to make a new dataset.
7.4 Wide and tall data
If you are looking at older materials they may use the terms gather
instead of pivot_longer
and spread
instead of pivot_wider
. In fact you can find a very similar version of the below text on my github page.
This is a notable point about R - it is a language that is being actively used and changes as people use it. The idea is that pivot_longer
is a more informative verb than gather
, and so we should try to use that instead. At the moment both commands still work, but this may change in the years to come.
7.4.1 Processing data
Let’s look at students_tidy
again.
## # A tibble: 6 x 8
## course level question year disagree neutral agree n
## <chr> <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Prof Skills Undergraduate good_teacher 1 0.8 0.05 0.15 121
## 2 Prof Skills Undergraduate learned 1 0.3 0.4 0.3 121
## 3 Prof Skills Undergraduate good_teacher 2 0.8 0.1 0.1 140
## 4 Prof Skills Undergraduate learned 2 0.2 0.3 0.5 140
## 5 Research Methods Postgraduate good_teacher 1 0.7 0.1 0.2 50
## 6 Research Methods Postgraduate learned 1 0.5 0.4 0.1 50
At first glance, this looks tidy. The data is presented with each course on a row - surely I’m observing at the course level?
Well, actually, I probably often want to know what % of students agreed (or not) with each statement in each course. The observation in this case is actually the proportion of students, with question response, question, course, level, and year, all being extra pieces of information I know about the proportion.
I want much taller data.
(I’m using this specific example not because it’s a particularly easy example, but because this is a format you’ll see for data in the real world all the time, and people will make big decisions on this data. It’s a good idea to show you how to tidy it.)
7.4.2 pivot_longer
The pivot_longer
command is a quick way to smush this data into a tall (or long) format. It creates two new columns, the names_to
column which collects your old column names and your values_to
column which collects the row values (fairly self-explanatory).
students_tall <- students_tidy %>%
pivot_longer(cols = c(disagree, neutral, agree),
names_to = "response",
values_to = "prop")
This says:
In the above code block we:
-
Create a new dataset called
students_tall
-
students_tall
is based onstudents_tidy
-
We want to squish the data into new columns (
pivot_longer
) -
We specify the columns we want to stretch into two (
cols = c(disagree, neutral, agree)
) -
We specify the name for new column which will take the value of the old column headers (
names_to = “response”
- note we have to put quotation marks around the new name, which is not very common intidyverse
) -
We specify the name for the new column which will store the values of the old rows (
values_to = “prop”
)
And of course, we can see what this has done to the data:
## # A tibble: 6 x 7
## course level question year n response prop
## <chr> <chr> <chr> <fct> <dbl> <chr> <dbl>
## 1 Prof Skills Undergraduate good_teacher 1 121 disagree 0.8
## 2 Prof Skills Undergraduate good_teacher 1 121 neutral 0.05
## 3 Prof Skills Undergraduate good_teacher 1 121 agree 0.15
## 4 Prof Skills Undergraduate learned 1 121 disagree 0.3
## 5 Prof Skills Undergraduate learned 1 121 neutral 0.4
## 6 Prof Skills Undergraduate learned 1 121 agree 0.3
It’s very important to think about your variable names
I once spent a whole afternoon trying to recreate an error message I was getting with this, when I realised that I was saying names_to = “question”
. The variable question
already exists in the dataset, and so R was re-writing the variable every time it gathered the data. Unique variable names are really helpful!
7.5 pivot_wider
What if, after all that, you realise that you never wanted your data gathered at all? pivot_wider
is here to rescue you.
Just as before, pivot_wider
wants to know the names
and the value
, but this time, it will split those two columns into multiple columns. This time we want all that data to be spread out like marmalade on toast, so we don’t exclude any columns (in fact, try excluding the columns and see what spread says. )
And of course we can view this:
## # A tibble: 6 x 8
## course level question year n disagree neutral agree
## <chr> <chr> <chr> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Prof Skills Undergraduate good_teacher 1 121 0.8 0.05 0.15
## 2 Prof Skills Undergraduate learned 1 121 0.3 0.4 0.3
## 3 Prof Skills Undergraduate good_teacher 2 140 0.8 0.1 0.1
## 4 Prof Skills Undergraduate learned 2 140 0.2 0.3 0.5
## 5 Research Methods Postgraduate good_teacher 1 50 0.7 0.1 0.2
## 6 Research Methods Postgraduate learned 1 50 0.5 0.4 0.1


Looking at three favorite sites!
Written by Alex White on April 27, 2014.
Puddle.com
Puddle is one of my favorite sites because it is an innovation in one of my areas of interest: disrupting the status quo in banking.
My eye is most drawn to where it says "Hi, Alex.", and then to the information below. Standing further away this is still the case. This is probably the most important part of the site. (This home page assumes you have already signed up and logged in.) This section describes your status as far as money deposited, where it is deposited, how much if any you have borrowed, etc.
The website is visually simple, open and elegant. The makers of this site know that you need more than great functionality, you also need great design.
This site works on the monumental problem of exploitation of individuals by banking monopolies by introducing a methodology for individuals to lend money to their friends easily, keeping the value in the community rather than value being extracted from above. The content consists of the different groups of friends, or 'puddles', who has deposited what, and who has borrowed what.
The content, focus and purpose of the site is highly practicile and serious, but also fun. The website manages to be professional enough to inspire the confidence people need to trust their money in the website, but also has an element of fun. Users are encouraged to share why they are borrowing, and it is fun to help your friends invest in their own futures.
It is easy to find what you need on this site once you are signed up and logged in, but that process is still a little confusing. There are a couple different stages. First you are invited. This step will be eliminated once the site is out of Beta, which will make it simpler. Than you connect your facebook account to verify your identity. You are then invited to the welcome puddle. Then you must be invited again into one of the other puddles, or you can start your own and invite your friends. Once logged in it is easy to find your way around the content.
After being on the site a while I feel inspired. You can see people borrowing from their friends to pay off credit cards with much higher interest rates, or invest in their businesses, go on vacation, etc. It is wonderful knowing they are getting a very low interest rate and that interest is being distributed back into their community.
This site offers a service, which I have participated in, but not really used. I have deposited money into the Welcome Puddle, and formed a puddle and invited my friends. The difficulty is getting friends to deposite enough money for there to be a sizable enough pool of cash. I have not overcame this hurdle, but many have. When I have more time I will do another round of getting friends involved.
Ars Technica
Ars Technica is actually a favorite of Gannon, my group member who I worked on Wireframing with this week. I like it a lot actually. I am always on the lookout for good tech news sites with stories that interest me and a pleasurable user experience. I find it to be just that.
Both up close and afar the eye is drawn to the featured story. I guess this is what they want, and whether or not that is the most important part of the page depends on the oppinion of the user.
The site is elegant. Maybe a little cluttered, but that is difficult to avoid on news sites with a ton of content.
The problem the website solves is a common one with many sites solving it in many ways. They write stories and display them on their page. The content is staff produced articles.
I would describe the site as serious, compact, content-heavy, organized, and simple.
It is easy to find content. The categories are logical and well laid out. The header makes it easy to find the content you want from any page and makes it esy to browse through all content.
After a while I feel informed.
The site sells advertising. Nothing for users to buy.
Ruby Monk
Ruby Monk is one of my favorite sites because it is so elegant and the tone is whimsical. It truly makes learning Ruby fun.
The eye is drawn the simple heading 'Learn Ruby.' from both near and far. This is arguable the most important part of the website because it says what you can do on it. It is also a good representation of the site as a whole. Elegant and simple.
The website is elegant, simple, clean, calming and pleasant.
They set out to solve the problem of learning Ruby. Best of all they get all of the clutter and complexity out of the interface so you can really focus on the learning.
The focus and purpose of the site is educational, practical, serious, fun and benevolent.
Navigation is easy! After a while on the site I feel learned and inspired. Sometimes frustrated, but that is mostly because learning a programming language can be very challenging! They sell nothing! Not even adds! All revenue donated by way of 'Donate' button.


The Payment Card Industry Data Security Standards (PCI DSS) is a set of security standards for businesses that handle credit cards from the major card schemes. Its aim is to provide security requirements that help protect sensitive credit card data (also known as the Cardholder Data Environment CDE)
The CDE defines the storage, processing and transmission of credit card information. All merchants that accept credit cards must meet PCI compliance with varying requirements depending on a number of factors. These are laid down in different assessments, of which the Self Assessment Questionnaires (SAQ) are the most common ones.
PCI Compliance for Ecommerce Websites
As an ecommerce merchant you need to become familiar with the importance of PCI compliance. Even though the PCI DSS must be met by all merchants that process, store or transmit cardholder data, a formal validation of PCI DSS compliance is not compulsory for all merchants. Currently, both Visa and MasterCard require merchants and service providers to be validated annually according to the PCI DSS. If a security breach occurs, any compromised entity which did not comply with PCI DSS at the time of breach will face additional penalties (e.g. fines) by card schemes.
PCI Requirements
The PCI requirements are divided into 6 major categories with 12 requirements in total:
- Build and Maintain a Secure Network
- Requirement 1 - Install and maintain a firewall.
- Requirement 2 - Do not use vendor-supplied defaults for system passwords or other security parameters.
- Protect Cardholder Data
- Requirement 3 - Protect stored cardholder data.
- Requirement 4 - Encrypt transmission or cardholder data across public networks.
- Maintain a Vulnerability Management Program
- Requirement 5 - Protect all systems against malware and regularly update anti-virus programs.
- Requirement 6 - Develop and maintain secure systems and applications.
- Implement Strong Access Control Measures
- Requirement 7 - Restrict access to card holder data by business need-to know.
- Requirement 8 - Identify and authenticate access to system components.
- Requirement 9 - Restrict physical access to card holder data.
- Regularly Test and Monitor Networks
- Requirement 10 - Track and monitor all access to network resources and card holder data.
- Requirement 11 - Regularly test security systems and processes.
- Maintain an Information Security Policy
- Requirement 12- Maintain an information security policy.
The above listed 12 requirements cover different business aspects that in turn break down into more than 200 sub-requirements. Each of these sub-requirements is represented by a check box in the SAQ that a merchant is obliged to follow.
Self Assessment Questionnaires (SAQ)
Regarding ecommerce merchants, we need to focus specifically on SAQ Type A, SAQ Type A-EP and SAQ Type D. The type of SAQ depends on the way a merchant handles credit card data:
SAQ A:
- Merchant accepts only card-not-present (e-commerce or mail/telephone-order) transactions;
- All payment acceptance and processing are entirely outsourced to PCI DSS validated third-party service providers;
- Merchant has no direct control of the manner in which cardholder data is captured, processed, transmitted, or stored;
- Merchant does not electronically store, process, or transmit any cardholder data on his systems or premises, but relies entirely on a third party(s) to handle all these functions;
- Merchant has confirmed that all third party(s) handling acceptance, storage, processing, and/or transmission of cardholder data are PCI DSS compliant; and
- Merchant retains only paper reports or receipts with cardholder data, and these documents are not received electronically.
- Additionally, for e-commerce channels: The entirety of all payment pages delivered to the consumer’s browser originates directly from a third-party PCI DSS validated service provider(s).
SAQ A-EP:
- Merchant accepts only e-commerce transactions;
- All processing of cardholder data is outsourced to a PCI DSS validated third-party payment processor;
- Merchant's e-commerce website does not receive cardholder data but controls how consumers, or their cardholder data, are redirected to a PCI DSS validated third-party payment processor;
- Merchant's e-commerce website is not connected to any other systems within his environment (this can be achieved via network segmentation to isolate the website from all other systems);
- If merchant website is hosted by a third-party provider, the provider is validated to all applicable PCI DSS requirements (e.g., including PCI DSS Appendix A if the provider is a shared hosting provider);
- All elements of payment pages that are delivered to the consumer’s browser originate from either the merchant’s website or a PCI DSS compliant service provider(s);
- Merchant does not electronically store, process, or transmit any cardholder data on his systems or premises, but relies entirely on a third party(s) to handle all these functions;
- Merchant has confirmed that all third party(s) handling storage, processing, and/or transmission of cardholder data are PCI DSS compliant; and
- Merchant retains only paper reports or receipts with cardholder data, and these documents are not received electronically.
SAQ D-Merchant:
- E-commerce merchant that cannot meet the criteria for SAQ A or SAQ A-EP, OR
- E-commerce merchant that stores credit card data, OR
- Payment pages are delivered from the merchant’s website.
Defining Your Scope with PCI
Concerning PCI, it all comes down to reducing scope. Scope depends on the way a merchant handles credit cards on his site (i.e., how a customer enters his information and where it goes). The following aspects should be thought of in terms of the CDE:
- Storage: How will the data be stored (e.g. store it as an organization or use a third-party provider)?
- Transmission: How will the data be transmitted (e.g. how will the data proceed to the gateway and are there any SSL Certificates in place)?
- Collection: How will the data be collected (e.g. through a form on or off the page)?
- Processing: How will the data be processed (e.g. locally by the merchant or through a service provider)?
Depending on the specific choices above, it impacts which SAQ you must fulfill and the corresponding precautions you have to take to ensure security. In general, it is highly recommended for ecommerce merchants not to store or process credit card data within their environment (locally) and instead leverage us to do this. In this case, you are only obliged to meet the fairly decent requirements laid down by SAQ A or SAQ A-EP. Whether SAQ A, SAQ A-EP or SAQ D apply, is determined by the checkout type as follows:
PCI-DSS Platform
All merchants are required to provide necessary merchant data on our PCI-DSS Platform. For further information please visit https://www.pciplatform.concardis.com.
External links
The corresponding SAQs (Version 3.2) can be found here:
SAQ A
SAQ A-EP
SAQ D


$6B-$6C/107-108: Pointer: Start of Jump table for U commands [FFEA] ROM-Reference: LDA ($6B),Y: $CB78 $CB7D STA $6B : $CB65 STA $6C : $CB69 Previous Page / Next Page


segregation
2.0.0
Installation
API
Tutorial
References
Site
Contents:
Installation
API
References
Page
Index
_
|
A
|
B
|
C
|
D
|
E
|
G
|
I
|
L
|
M
|
P
|
R
|
S
|
T
_
__init__() (segregation.decomposition.DecomposeSegregation method)
(segregation.inference.SingleValueTest method)
(segregation.inference.TwoValueTest method)
(segregation.local.LocalRelativeCentralization method)
(segregation.local.MultiLocalDiversity method)
(segregation.local.MultiLocalEntropy method)
(segregation.local.MultiLocalSimpsonConcentration method)
(segregation.local.MultiLocalSimpsonInteraction method)
(segregation.local.MultiLocationQuotient method)
(segregation.multigroup.MultiDissim method)
(segregation.multigroup.MultiDivergence method)
(segregation.multigroup.MultiDiversity method)
(segregation.multigroup.MultiGini method)
(segregation.multigroup.MultiInfoTheory method)
(segregation.multigroup.MultiNormExposure method)
(segregation.multigroup.MultiRelativeDiversity method)
(segregation.multigroup.MultiSquaredCoefVar method)
(segregation.multigroup.SimpsonsConcentration method)
(segregation.multigroup.SimpsonsInteraction method)
(segregation.singlegroup.AbsoluteCentralization method)
(segregation.singlegroup.AbsoluteClustering method)
(segregation.singlegroup.AbsoluteConcentration method)
(segregation.singlegroup.Atkinson method)
(segregation.singlegroup.BiasCorrectedDissim method)
(segregation.singlegroup.BoundarySpatialDissim method)
(segregation.singlegroup.ConProf method)
(segregation.singlegroup.CorrelationR method)
(segregation.singlegroup.Delta method)
(segregation.singlegroup.DensityCorrectedDissim method)
(segregation.singlegroup.Dissim method)
(segregation.singlegroup.DistanceDecayInteraction method)
(segregation.singlegroup.DistanceDecayIsolation method)
(segregation.singlegroup.Entropy method)
(segregation.singlegroup.Gini method)
(segregation.singlegroup.Interaction method)
(segregation.singlegroup.Isolation method)
(segregation.singlegroup.MinMax method)
(segregation.singlegroup.ModifiedDissim method)
(segregation.singlegroup.ModifiedGini method)
(segregation.singlegroup.PARDissim method)
(segregation.singlegroup.RelativeCentralization method)
(segregation.singlegroup.RelativeClustering method)
(segregation.singlegroup.RelativeConcentration method)
(segregation.singlegroup.SpatialDissim method)
(segregation.singlegroup.SpatialProximity method)
(segregation.singlegroup.SpatialProxProf method)
A
AbsoluteCentralization (class in segregation.singlegroup)
AbsoluteClustering (class in segregation.singlegroup)
AbsoluteConcentration (class in segregation.singlegroup)
Atkinson (class in segregation.singlegroup)
B
batch_compute_multigroup() (in module segregation.batch)
batch_compute_singlegroup() (in module segregation.batch)
batch_multiscalar_multigroup() (in module segregation.batch)
batch_multiscalar_singlegroup() (in module segregation.batch)
BiasCorrectedDissim (class in segregation.singlegroup)
BoundarySpatialDissim (class in segregation.singlegroup)
C
compute_multiscalar_profile() (in module segregation.dynamics)
ConProf (class in segregation.singlegroup)
CorrelationR (class in segregation.singlegroup)
D
DecomposeSegregation (class in segregation.decomposition)
Delta (class in segregation.singlegroup)
DensityCorrectedDissim (class in segregation.singlegroup)
Dissim (class in segregation.singlegroup)
DistanceDecayInteraction (class in segregation.singlegroup)
DistanceDecayIsolation (class in segregation.singlegroup)
E
Entropy (class in segregation.singlegroup)
G
get_osm_network() (in module segregation.util)
Gini (class in segregation.singlegroup)
I
Interaction (class in segregation.singlegroup)
Isolation (class in segregation.singlegroup)
L
LocalRelativeCentralization (class in segregation.local)
M
MinMax (class in segregation.singlegroup)
ModifiedDissim (class in segregation.singlegroup)
ModifiedGini (class in segregation.singlegroup)
MultiDissim (class in segregation.multigroup)
MultiDivergence (class in segregation.multigroup)
MultiDiversity (class in segregation.multigroup)
MultiGini (class in segregation.multigroup)
MultiInfoTheory (class in segregation.multigroup)
MultiLocalDiversity (class in segregation.local)
MultiLocalEntropy (class in segregation.local)
MultiLocalSimpsonConcentration (class in segregation.local)
MultiLocalSimpsonInteraction (class in segregation.local)
MultiLocationQuotient (class in segregation.local)
MultiNormExposure (class in segregation.multigroup)
MultiRelativeDiversity (class in segregation.multigroup)
MultiSquaredCoefVar (class in segregation.multigroup)
P
PARDissim (class in segregation.singlegroup)
plot() (segregation.decomposition.DecomposeSegregation method)
(segregation.inference.SingleValueTest method)
(segregation.inference.TwoValueTest method)
(segregation.singlegroup.ConProf method)
(segregation.singlegroup.SpatialProxProf method)
R
RelativeCentralization (class in segregation.singlegroup)
RelativeClustering (class in segregation.singlegroup)
RelativeConcentration (class in segregation.singlegroup)
S
SimpsonsConcentration (class in segregation.multigroup)
SimpsonsInteraction (class in segregation.multigroup)
SingleValueTest (class in segregation.inference)
SpatialDissim (class in segregation.singlegroup)
SpatialProximity (class in segregation.singlegroup)
SpatialProxProf (class in segregation.singlegroup)
T
TwoValueTest (class in segregation.inference)


The finest in breakfast treats and coffees since 1971
Toggle navigation
Donut Delights
Home
(current)
About
Location
Menu
Follow us
Sign Up
Feel free to join our monthly newsletter for coupons and more!!
Email Address:
Confirm Email Address:
Name:
City:
Submit


In Pictures: Parties pull no punches on campaign trail
Jo Swinson and Nigel Farage both chose boxing rings for their latest media engagements.
Jo Swinson and Nigel Farage both resorted to tough talking on Wednesday’s election trail after choosing boxing rings for photo opportunities.
Boris Johnson, meanwhile, visited flood-hit areas of Yorkshire while Jeremy Corbyn and his team headed north of the border.


What information do you collect?
This application collects various information when you interact with it.
This information includes automatically collected usage information such as
HTTP request logs, Dialogflow API functionality, and user identifiers,
including your Google ID. If you choose to place an order, you will be
prompted for transaction details. This information will be held by Google
using Google Pay, and will only be transmitted in tokenized format to the
Square testing API.
How do you use the information?
This information is used only for demo purposes. In the demo, you are able
to place orders and check the status of your order. This should never send
email or contact you outside the demo environment.
What information do you share?
Submitted credit card information for a transaction is handled via Google
Pay and the Square TESTING infrastructure, and no cards should be charged.
Information is also shared with Google through their Dialogflow and Actions
on Google service, but your information will not be shared with other
companies except as outlined above.


--- notes: The swiper could feature different types of cards. It is not limited to prouct previews. Just change the content and add a different icon to the green button at the end. Use Simplebar for nice scrollbars on Windows. ---


Icon of the Past:
########################
%name1%: But...who in the world are you?
??? : Me? You will know soon, shortly after my story comes to an end. For now...call me N.
Shall we begin?
########################
First, listen to the story.
Watch the screen.


In the most recent incarnation of the Mexico City Policy, the scope of affected programs has greatly widened. Now, almost all foreign health assistance is potentially at risk.


LTSP Scenarios
Table of Contents
- About LTSP
- Managing User Accounts
- Maintaining a Chrootless Client Image
- Creating Guest Accounts
- Desktop Configuration For New Users
- Reverting User Accounts to Default Configuration
- Share a Common And Persistent Directory For All the Users
- Allow Teacher To Use Epoptes From a Fat Client
- Allow Users To Change The Password From a Fat Client
- Remote Thin/Fat Client Access for Maintenance or Debugging
- Running Two LTSP Servers on The Same LAN
- Having Home Directories on a Separate Server
About LTSP
LTSP allows computers of a LAN to boot through the network from a single server. The benefits of using it are reduced hardware costs and reduced time of maintenance.
Hardware costs are reduced because the clients don't need to be powerful, since everything (or almost everything) runs on the server. They don't need to have a hard-disk and don't need to have much RAM.
The time of maintenance is reduced because there is only the server to be maintained, not 20-30 computers of the LAN. Installing new software, updating, upgrading etc. is done only once on the server. The reduced time of maintenance is becoming the most important benefit of using LTSP, as hardware becomes cheaper.
Besides these, LTSP has other administration and communication benefits. For example it provides centralized user accounts (a user can login to his account from any terminal). Or screen/desktop sharing (for example a teacher can show his desktop to the students for demonstration, or can see what they are doing, and even help them remotely).
In this article we will see different configuration and maintenance scenarios of a LTSP server. These are based on my experience and on the discussion made on the ltsp-discuss mailing list. It is by no means a complete or thorough list of all the possible scenarios, so any suggestions for adding new scenarios to this list would be welcome.
Managing User Accounts
User accounts are created and maintained on the server. Any command or tool will do, but if there are lots of accounts, some bash scripts would be useful for automating bulk operations. This is such a script: https://gitlab.com/Virtual-LTSP/VirtualBox/blob/bionic/users.sh
As shown also on its help, you can use it to create new accounts, export, import, backup and restore user accounts and their home directories:
Usage: ./users.sh [<command>] [<filename>] Commands: create [<user-file.txt>] Create new user accounts. Each line of the input contains a username, unencrypted password, and details, separated by ':'. If no file is given than read from stdin. export Export to stdout username, encrypted password and details for all the users. import [<user-file.passwd>] Import usernames, encrypted passwords and details from the export file. If no file is given than read from stdin. backup Backup home directories and users (username:password:details). The backup archive is stored on the directory 'backup/'. restore <backup-file.tgz> Restore home directories and user accounts from the given backup file.
If you have a Virtual-LTSP server (a LTSP server on VirtualBox, with Vagrant), you have to login first to the server, for example like this:
cd ltsp-server/ vagrant ssh sudo su cd /hosts/ ./users.sh
The backup files are usually stored on the directory /hosts/backup/
,
which is a shared directory between the virtualbox machine and its
host. So, in case you have to rebuild the server (./server.sh build
),
the backup will be available to the new server and you can restore it.
Maintaining a Chrootless Client Image
The defining feature of a chrootless client image is that there is no
chroot directory for its files. Instead, the LTSP server itself is
used as an example or template for the client image. This means that
if we want to update/upgrade or install new software on the client
image, we have to do this on the server itself, and then we have to
regenerate the image of the client (using the command
ltsp-update-image --cleanup /
).
Sometimes there is a problem, because we want to install on the LTSP server things that we don't want to run on the client (for example apache2, mysql, guacamole, etc.).
A solution for this is to exclude from the image some of the directories and services of the server. There are these options:
- Use the directive
RM_SYSTEM_SERVICES
on/var/lib/tftpboot/ltsp/i386/lts.conf
to disable some services even if they are installed on the client. - Use the directive
EXCLUDE
on/etc/ltsp/ltsp-build-client.conf
to uninstall some packages from the finished chroot. - Add lines like
etc/apache2/
on/etc/ltsp/ltsp-update-image.excludes
to exclude certain directories from the image. - Use the option
--exclude
of the commandltsp-update-image
to exclude certain directories from the image. - Create a shell script like
/etc/ltsp/cleanup.d/60-cleanup
which is executed inside the chroot before generating the image from it. In this script you can uninstall packages, remove directories, etc.
Another approach, which is simpler and cleaner (in my opinion), is to unpack the client image into a directory, chroot into it, make any necessary maintenance (update, upgrade, install etc.), then generate again the client image from this chroot directory. This essentially converts it into a chroot client image, but that's OK.
It can be done like this:
unsquashfs -d /opt/ltsp/i386 /opt/ltsp/images/i386.img rm /opt/ltsp/i386/etc/resolv.conf ltsp-chroot -mr apt update apt upgrade apt install joe jove exit # from chroot ltsp-update-image systemctl restart nbd-server
Some other tips and tricks are available here: http://wiki.ltsp.org/wiki/Tips_and_Tricks/Maintenance
Creating Guest Accounts
In public computers (e.g. in schools, libraries, universities, etc.) sometimes it is useful to have guest accounts. This means that the content of the account is temporary and is erased immediately after logout (or on login). This is important because it reverts automatically all the default settings, no matter how much the users mess with them, therefore minimizing the need for maintenance. It is also important for the safety of the users, because it ensures that no open accounts or passwords are left behind.
The approach used in LTSP for creating guest accounts is to create a user for each different IP, and to reset the content of the home of this user when he makes a login. It is described on these posts:
- https://sourceforge.net/p/ltsp/mailman/message/27814821/
- http://www.m-opensolutions.com/?p=537
- http://www.m-opensolutions.com/?p=667
We need to add these directives on lts.conf
in order to enable the
guest login button:
[Default] LDM_GUESTLOGIN=True HOSTNAME_BASE="$hostname" #LDM_AUTOLOGIN=True
This script (which should work on any Ubuntu bionic LTSP server) can be used to create and configure automatically guest accounts: https://gitlab.com/Virtual-LTSP/VirtualBox/blob/bionic/ltsp-server/scripts/create-guest-accounts.sh
#!/bin/bash -x ### Create and config guest accounts. guest=${1:-guest} pass=${2:-pass} hostname=${3:-ltsp} # create the template/skeleton guest account groupadd guest --gid=500 -f adduser $guest --uid=500 --gid=500 \ --shell=/bin/bash --gecos '' \ --disabled-password usermod $guest --password="$(openssl passwd -stdin <<< $pass)" chown $guest:guest -R /home/$guest # create the guest accounts rm -rf /home/guest-accounts/ mkdir -p /home/guest-accounts/ for ip in {1..255}; do user="${hostname}${ip}" adduser $user --uid=$((500 + $ip)) --gid=500 \ --home=/home/guest-accounts/$user \ --shell=/bin/bash --gecos '' \ --disabled-password usermod $user --password="$(openssl passwd -stdin <<< $user)" done # create a script that resets a guest account cat <<EOF > /usr/local/bin/reset-guest-account.sh #!/bin/bash user=\$SUDO_USER [[ \$user =~ ^'$hostname'[0-9]{1,3}\$ ]] || exit 1 cd /home/guest-accounts/\$user || exit 2 rm -rf .* * rsync -a /home/$guest/ . chown \$user -R . EOF chmod +x /usr/local/bin/reset-guest-account.sh # allow users of group 'guest' to call the reset script with sudo cat <<EOF > /etc/sudoers.d/reset-guest-account # users of group 'guest' can call the reset script without password %guest ALL = (root) NOPASSWD: /usr/local/bin/reset-guest-account.sh EOF # make sure guest accounts are reset on login cat <<EOF > /usr/share/ldm/rc.d/S00-guest-sessions # if username matches the pattern of a guest account # then call the script that resets the account echo \$LDM_USERNAME | grep -E '^$hostname[0-9]{1,3}\$' \\ && ssh -S "\$LDM_SOCKET" "\$LDM_SERVER" 'sudo /usr/local/bin/reset-guest-account.sh' EOF ### place some limits on guest accounts sed -i /etc/security/limits.conf -e '/^### custom/,$ d' cat <<EOF >> /etc/security/limits.conf ### custom @guest hard nproc 1000 * hard core 0 @guest hard cpu 2 @guest hard maxlogins 1 EOF
Guest accounts are reset on each login, which means that the home directory is erased and is replaced with the content of the home directory of the account guest. As a result, by customizing the account guest (for example changing the background) we actually customize all the guest accounts.
Desktop Configuration For New Users
Sometimes we want to customize the default desktop configuration of the users (for example change the background, add some apps on desktop or panel, etc.)
An approach that works for MATE, Gnome, Firefox, etc. is to override the settings (search on google for "default settings" or "mandatory settings"). For MATE, you can make your own override file for all users, like this:
vi /usr/share/glib-2.0/schemas/60_myown.gschema.override sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
The override file looks like this:
[org.mate.panel] default-layout='redmond' [org.mate.marco] button-layout='menu:minimize,maximize,close' theme='TraditionalOk' num-workspaces=4 [org.mate.panel.objects.window-list.prefs] group-windows='auto' display-all-workspaces=true move-unminimized-windows=false
Here is an example: https://git.launchpad.net/sch-scripts/tree/debian/sch-scripts.gsettings-override
Another approach is to create a skeleton user account, for example
skel, then to make a symbolic link from /etc/skel
to /home/skel
:
mv /etc/skel /etc/skel.bak ln -s /home/skel /etc/skel
The configurations that you make to the skel user will be applied automatically to the new user accounts that are created.
Note: Be careful with this approach. If some applets don't save the paths to user home directories relatively, this may lead to confusion. In this case you should remove these applets and try to configure them the other way (described above).
Reverting User Accounts to Default Configuration
It is often useful to revert all the settings of user accounts to default values, except for the files that they have saved, Firefox bookmarks, etc. This minimizes the maintenance time for user accounts, while allowing the users to play with changing the preferences and other configuration settings, etc.
It can be done by creating the script
/opt/ltsp/i386/usr/share/ldm/rc.d/S01-user-sessions
with a content
like this:
case "$LDM_USERNAME" in user*) sh -S "$LDM_SOCKET" "$LDM_SERVER" "cd; find . -mindepth 1 -maxdepth 1 \ -name '.*' -delete; rsync -a /etc/skel/ ." ;; esac
If you have a chrootless client image, then this script should be
saved on the file /usr/share/ldm/rc.d/S01-user-sessions
.
The next step is to run ltsp-update-image
(or ltsp-update-image
--cleanup /
for chrootless image).
If we wanted to use a configuration script like that of guest accounts it would be like this:
#!/bin/bash -x # create a script that resets a user account cat <<EOF > /usr/local/bin/reset-user-account.sh #!/bin/bash user=\$SUDO_USER [[ \$user =~ ^user.*\$ ]] || exit 1 cd /home/\$user || exit 2 find . -mindepth 1 -maxdepth 1 -name '.*' -delete rsync -a /etc/skel/ . chown \$user: -R . EOF chmod +x /usr/local/bin/reset-user-account.sh # allow users of group 'student' to call the reset script with sudo cat <<EOF > /etc/sudoers.d/reset-user-account # users of group 'user' can call the reset script without password %user ALL = (root) NOPASSWD: /usr/local/bin/reset-user-account.sh EOF # make sure user accounts are reset on login cat <<EOF > /usr/share/ldm/rc.d/S01-user-sessions # if username matches the pattern of a user account # then call the script that resets the account echo \$LDM_USERNAME | grep -E '^user.*\$' \\ && ssh -S "\$LDM_SOCKET" "\$LDM_SERVER" 'sudo /usr/local/bin/reset-user-account.sh' EOF
Share a Common And Persistent Directory For All the Users
Sometimes it may be useful to have a shared directory for all the
users, for example if the users want to exchange files with
each-other, or if the guest users want to save some persistent files.
It can be accomplished by adding a line like this on lts.conf
:
LOCAL_APPS_EXTRAMOUNTS=/var/usr/shared
You should also set proper
permissions to this directory, so that it is writable by all the
users, like this:
chown guest:guest /var/usr/shared chmod 777 /var/usr/shared
When the clients boot and users login, they can access this directory
on /var/usr/shared
. Whatever they write on it will actually be
stored on the server, so it will be persistent.
Allow Teacher To Use Epoptes From a Fat Client
Usually the teacher has access to the desktop of the LTSP server and can launch Epoptes user interface there. It is important that the Epoptes UI is launched on the LTSP server, because the Epoptes daemon is running there.
However, sometimes may not be possible to access the desktop of the
LTSP server. In this case, it is possible to launch Epoptes from a fat
client too. This can be done by using remote apps (which means that
the apps run on the server and their display is on the client). Add
these lines on /var/lib/tftpboot/ltsp/i386/lts.conf
:
[Default] REMOTE_APPS=True RCFILE_01="sed 's,^Exec=/usr/bin/epoptes,Exec=ltsp-remoteapps dbus-launch epoptes,' -i /usr/share/applications/epoptes.desktop"
Now you can login on a fat client and run this on the terminal:
ltsp-remoteapps dbus-launch epoptes
Note: Make sure that the user of the teacher is a member of the epoptes group.
For more details see also this: http://www.epoptes.org/documentation/fat-clients
Allow Users To Change The Password From a Fat Client
Since user accounts live on the server, usually it is not possible to change the password from the client. The only way is to ssh to the server and to change it there, or to run a remote application (meaning that the application runs on the server) that can change the password.
From the terminal it can be done like this: ssh -t server passwd
(which runs the command passwd
on the server). This may be a bit
confusing because it requires twice the current password, before
asking for the new password.
Another way that is nicer, is to set REMOTE_APPS=True
in
/var/lib/tftpboot/ltsp/amd64/lts.conf
(or
/var/lib/tftpboot/ltsp/i386/lts.conf
). Then you can run from the
client something like this: ltsp-remote-apps xfce4-terminal -e passwd
It is even nicer if you can create this alias (for example in .bashrc
of the users):
alias passwd='ltsp-remote-apps xfce4-terminal -e passwd'
Instead of passwd
, you may also call a bash script on the server,
which makes the interaction with the user nicer.
It is also possible to allow users to change the password by using a
GUI application. You can do something like what is described here for
Epoptes: http://www.epoptes.org/documentation/fat-clients Instead of
epoptes
you can do it for gnome-about-me
or mate-about-me
(or whatever
works on your desktop) and then your users will be able to change
their passwords from the menu, without requiring the terminal or any
other weird things.
Remote Thin/Fat Client Access for Maintenance or Debugging
Sometimes it is not possible (or feasible) to access physically the LTSP server and the clients for maintenance or debugging. In this case you can access the desktop of the LTSP server remotely. This can be done by:
- X2Go (https://wiki.x2go.org/doku.php)
- Epoptes (http://www.epoptes.org) "remote assistance" feature (i.e. reverse VNC)
- VNC and ssh tunneling (http://dashohoxha.fs.al/sshtunnels/)
- Guacamole (https://gitlab.com/Virtual-LTSP/VirtualBox/blob/bionic/ltsp-server/scripts/guacamole.sh)
Once you are able to access the desktop of the LTSP server remotely, you can access the desktop of the clients as well, through the Epoptes "remote control" feature.
You can also boot up clients remotely from Epoptes, if you have them organized in groups (see: http://www.epoptes.org/documentation/groups). However, for this to work, WoL (Wake on LAN) has to be enabled on the client BIOS/UEFI.
If you want to check also the boot messages on the client, you can do it with a virtual machine. For example if you install VirtualBox on the LTSP server, then you can start a VirtualBox LTSP client with a script like this: https://gitlab.com/Virtual-LTSP/VirtualBox/blob/bionic/client.sh A VirtualBox client may not be exactly the same as a real client (in terms of hardware etc.), but it is better than nothing.
Instead of a VirtualBox machine, you can use a KVM virtual machine as well. It should be configured to boot in PXE and the KVM server must be in same subnet as your LTSP clients. Than you can have a QEMU+SSH connection using virt-manager, which gives you a graphical access to the VM.
Running Two LTSP Servers on The Same LAN
This may be useful for example when you already have an old server running (lets say based on Ubuntu-16.04), and you want to install and configure a new one (based on Ubuntu-18.04). You can't shutdown or throw away the old one, until the new one is prepared and tested.
The most easy way is to avoid running them simultaneously (at the same time), especially when the DHCP server is inside the LTSP server itself. In this case you have to do the installation and testing of the new server when the classroom is not being used (so that you can shut down the old server and boot up the new one).
However, if you make special configurations for each client on the DHCP server (based on the MAC addresses of the clients), it is possible to tell some of them to boot from one LTSP server, and the others to boot from the other. Then both of the LTSP servers (or all of them, if there are more than two) can run simultaneously, without stepping on the toes of each-other.
This kind of configuration (running simultaneously multiple LTSP servers on the same LAN, each one with its own clients) might be useful also on cases when you have different kinds of clients on the LAN, which have different requirements, so you use different servers to serve them. However, it is better, in general, to build different client images on the same LTSP server, and to serve them to different clients based on the clients' MAC addresses.
Having Home Directories on a Separate Server
If you run more than one LTSP server on the same LAN simultaneously, it is useful to keep all the user accounts and home directories on the same server. This means that for at least one of the LTSP servers, the user accounts will have to be accessed from another server (a different server than the one that serves the system image).
This can be done by using the directive LDM_SERVER=<IP_ADDRESS>
in
lts.conf
, which means "use this server for authentication and
/home". It is an easy way to separate the authentication/home server,
from the NBD server which serves /
(the root filesystem).
Alternatively, /home
can also be shared via NFS with a directive like
this on lts.conf
:
FSTAB_1="server:/home /home nfs defaults,nolock 0 0"
Instead of server
(which is a name for the LTSP server) you can use
any other server, for example <IP_ADDRESS>
.
Note: Using separate servers for the system image and for home directories, implicitly does a bit of load balancing as well.


Full Featured
Medis has proven to be highly compatible with data types like
strings, lists, hashes, sets, sorted sets, streams, and even
third-party modules like RedisJSON. With its visually
appealing user interface, users can easily manage all their data in
an enjoyable manner.
Command Query
Medis offers a query view that allows users to execute arbitrary
commands. It features keyword highlighting and an
autocompleter, ensuring maximum clarity and efficiency.
Tree View
Medis adheres to the Redis community’s
standards and provides a customizable tree view that allows users to
categorize keys however they prefer.
High Performance
Medis is specifically designed to handle databases with
millions of keys and fields seamlessly, ensuring that there
are no blocking issues. It works great with your production
database.
Alert Mode
Every writable command in alert mode sent to servers will need your
approval explicitly. This prevent you from destroying production
databases accidentally.
Data Encoders
Medis recognizes different data formats automatically so don't worry
if you are using MessagePack for reducing memory usages.
SSH/SSL
Medis allows you to connect to remote servers with an SSH tunnel,
and it works great with SSL.
Dark Mode
Of course, Medis supports dark mode!


Instead of using real-time comparison, we could apply a technique call Dynamic Time Wrapping (DTW) with Barycenter Averaging (DBA). Intuitively, it is a technique of averaging a few time-series into a single one without losing much of their information. Since not all time-series would move efficiently like in ideal EMH assumption, this would allow similarity analysis of different time-series with sticky lags. Check the technical details from tslearn documentation page.
We then can separate different clusters by KMean after DBA.
# Set up the Time Series KMean model with soft DBA. km = TimeSeriesKMeans(n_clusters=6, # We have 6 main groups metric="softdtw", # soft for differentiable random_state=0) # Fit the model. km.fit(standard_close.T)


@* * Copyright 2023 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. *@ @this( paragraph: Paragraph, h2: H2, findOutMoreLink: FindOutMoreLink) @()(implicit messages: Messages, appConfig: AppConfig) @updateYourBrowser = {
@messages("cookieSettings.unsupported.paragraph3") @messages("cookieSettings.unsupported.paragraph3.link.text").
}


Private catering
Treat your guests to a beautifully plated dinner, hand-crafted canapes or a casual BBQ.
Why CHOOSE us?
Always fresh
Fresh, seasonal and simple cuisine. Food is our business and our passion.
Clean and Healthy
We use only the best organic ingredients and gluten and dairy f
Reliable AND Flawless
Successful catering is about organisation, high quality servicesion.
fits any size and budget
We are able to serve events from 2 to 2000 guests and always at reasonable prices.
Say hello
Get in touch