Provides read and write access to data and metadata from the DataONE network <https://www.dataone.org> of data repositories. Each DataONE repository implements a consistent repository application programming interface. Users call methods in R to access these remote repository functions, such as methods to query the metadata catalog, get access to metadata for particular data packages, and read the data objects from the data repository. Users can also insert and update data objects on repositories that support these methods.
| Version: | 2.1.1 |
| Depends: | R (≥ 3.1.1) |
| Imports: | XML (≥ 3.95-0.1), hash, httr, methods, stringr, datapack (≥ 1.3.0), plyr, parsedate, uuid, base64enc, jsonlite |
| Suggests: | knitr, rmarkdown, testthat, digest, openssl (≥ 0.9.3), xml2 |
| Published: | 2018-06-28 |
| Author: | Matthew B. Jones [aut, cre], Peter Slaughter [aut], Rob Nahf [aut], Carl Boettiger [aut], Chris Jones [aut], Jordan Read [aut], Lauren Walker [aut], Edmund Hart [aut], Scott Chamberlain [aut], Regents of the University of California [cph] |
| Maintainer: | Matthew B. Jones <jones at nceas.ucsb.edu> |
| BugReports: | https://github.com/DataONEorg/rdataone/issues |
| License: | Apache License 2.0 |
| Copyright: | see file COPYRIGHTS |
| URL: | https://github.com/DataONEorg/rdataone |
| NeedsCompilation: | no |
| Citation: | dataone citation info |
| Materials: | README NEWS |
| In views: | WebTechnologies |
| CRAN checks: | dataone results |
| Reference manual: | dataone.pdf |
| Vignettes: |
DataONE Federation dataone R Package Overview Downloading Data From DataONE Known Issues With dataone R Packge v2.0 Searching DataONE Data Holdings Uploading Data to DataONE Uploading Data to DataONE |
| Package source: | dataone_2.1.1.tar.gz |
| Windows binaries: | r-devel: dataone_2.1.1.zip, r-release: dataone_2.1.1.zip, r-oldrel: dataone_2.1.1.zip |
| OS X binaries: | r-release: dataone_2.1.1.tgz, r-oldrel: dataone_2.1.1.tgz |
| Old sources: | dataone archive |
| Reverse imports: | nesRdata |
Please use the canonical form https://CRAN.R-project.org/package=dataone to link to this page.


This is a Jquery Plugin to create a Slideform like this. The first step is to include the jquery.slideform.js file in your stack, and then you are ready to go.
Inputs are very easy to create and they work like any other form input
Some fancy effects, taiolred for mobile experiences.
This is particularily useful for mobile enviroments
This message appears after all conditions have been marked as "yes".
You can attach the jquery.validate.js file and define your own validation rules.
Learn more about Slideform reading our docs in Github.
https://github.com/asmerkin/slideform/wiki


Current List
list name
Make A Item
Title:
The title is required.
Name
Type
Value
Actions
Text
Number
Date
X
Add Attribute
Submit
Cancel


Turn the LED light on or off. If the server has an LCD, use this control to display text (on) or not to display text (off) on the LCD.


{% extends 'layout.html' %} {% block body %}
We are computer scientists at the University of Oregon working on a NSF-funded project. Read Understand Learn Excel (RULE) aims to create a computerized tool to assist clinicians in secondary and post-secondary schools who evaluate and treat reading comprehension deficits. Students read a passage and immediately recall to a speaker what they remember from the excerpt. A computer program then grades the recall based on retention and accuracy. This particular aspect of the project is meant to help clinicians parse through the student recalls. A full stop designates the end of one thought and the beginning of another thought. Thus, placing periods helps the clinicians identify distinct ideas that a student verbalizes.
We suspect this research could be applied to other problems as well. For example, we could try to guess at redacted information based on the surrounding context. However, this task involves predicting words from a large dictionary, whereas the period placer solves a binary classification problem. On the other hand, we could try to predict punctuation in a text. For instance, we could distinguish between periods, question marks, and exclamation marks. Again, this problem is a more difficult problem because it solves categorical classification.
Seth Temple worked on this research from March 2018 until June 2018. Professor Stephen Fickas supervised Seth's research and the work of other researchers on the RULE project. Contact Seth Temple<EMAIL_ADDRESS>for any questions you have about the period placer.
Voice recognition technology could use tools that predict punctuation. At this time, we do not know if companies like Google have this technology already. A demo of the 2018 Google Assistant suggests that this technology could be available now.


7. Using Queries
7.7 Scripting SQLTemplate
SQLTemplate's internal SQL string is a dynamic script that is processed at runtime to generate
PreparedStatement SQL code. Dynamic nature of SQLTemplate makes possible a few important things - it allows
to bind parameters on the fly; it provides a way to pass extra information to Cayenne that is not included
in the SQL text; it supports including/excluding chunks of SQL depending on runtime parameters.
Scripting of SQL strings is done using Jakarta
Velocity. Velocity was chosen primarily for its concise template language (no XML tags within SQL!) that doesn't
conflict with the SQL syntax. When creating dynamic SQL template, all standard Velocity directives are available,
including #set, #foreach, #if .
However due to the nature of the SQL and the need to integrate it with Cayenne runtime, only a few Cayenne
custom directives are normally used. These directives (#bind..., #result, #chain, #chunk ) are described below.
Directive Syntax Note
Velocity directives start with pound sign (#) and have their parameters
separated by space, not comma. E.g. #bind('SOMESTRING' 'VARCHAR').
|
7.7.1 Named Parameters
SQLTemplate.setParameters(java.util.Map) allows setting
a number of named parameters that are used to build parts of the query. During template processing by Velocity all keys in the parameters
map are available as variables. For example if the map contains a key "name", its value can be referenced as "$name" in the template.
Value of the parameter will be insterted in the SQL unmodified:
// build SQLTemplate
String sql = "delete from $tableName";
SQLTemplate delete = new SQLTemplate(Artist.class, sql, false);
...
// this will create a query "delete from ARTIST"
update.setParameters(Collections.singletonMap("tableName", "ARTIST"));
...
// this will create a query "delete from PAINTING"
update.setParameters(Collections.singletonMap("tableName", "PAINTING"));
|
7.7.2 Describing the Results - #result Directive
#result directive is used in selecting SQLTemplates to quickly map an arbitrary ResultSet to a DataObject
(or a data row with known keys), and also to control Java types of result values. #result directive has a variable number of
arguments:
#result(columnName) - e.g. #result('ARTIST_NAME')
#result(columnName javaType) - e.g. #result('DATE_OF_BIRTH' 'java.util.Date')
#result(columnName javaType columnAlias) - e.g. #result('DATE_OF_BIRTH' 'java.util.Date' 'DOB') - in this case
returned data row will use "DOB" instead of "DATE_OF_BIRTH" for the result value.
Java Type Note:
Generally "javaType" argument is a fully-qualified Java class name for a given
result column. However for simplicity most common Java types used in JDBC can be specified without
a package. These include all numeric types, primitives, String, SQL dates, BigDecimal and BigInteger.
So "#result('A' 'String')", "#result('B' 'java.lang.String')" and "#result('C' 'int')" are all valid.
|
While "select * from" queries may work just fine, in most cases it is a good idea to explicitly describe results.
Examples:
// build selecting SQLTemplate
String sql = "SELECT"
+ " #result('ARTIST_ID' 'int'),"
+ " #result('ARTIST_NAME' 'String'),"
+ " #result('DATE_OF_BIRTH' 'java.util.Date')"
+ " FROM ARTIST";
SQLTemplate select = new SQLTemplate(Artist.class, sql, true);
...
DataContext context...;
List artists = context.performQuery(select);
|
7.7.3 Binding Parameters - #bind Directive
SQLTemplate uses #bind directive to indicate value binding. It has the same meaning as PreparedStatement
question mark ("?" ), however it also tells Cayenne about the nature of the bound value, so it should be used for all bindings.
#bind() directive can have a variable number of arguments. The following are the valid invocation formats:
#bind(value) - e.g. #bind($xyz) or #bind('somestring')
#bind(value jdbcTypeName) - e.g. #bind($xyz 'VARCHAR'). Second argument is the name of JDBC type for
this binding. Valid JDBC types are defined in java.sql.Types class. This form is the the most common and useful.
It is generally preferred to the single argument form, as it explicitly tells what type of JDBC value this binding is.
#bind(value jdbcTypeName precision) - e.g. #bind($xyz 'DECIMAL' 2)
#bind directive example:
// build SQLTemplate
String sql = "update ARTIST set ARTIST_NAME = #bind($name) where ARTIST_ID = #bind($id)";
SQLTemplate update = new SQLTemplate(Artist.class, sql, false);
...
// set parameters and run it...
Map parameters = new HashMap();
parameters.put("name", "Publo Picasso");
parameters.put("id", new Integer(1001));
update.setParameters(parameters);
DataContext context...;
context.performNonSelectingQuery(update);
|
7.7.4 Null Values in Bindings - #bindEqual and #bindNotEqual Directives
Sometimes when a parameter is NULL, SQL code has to be changed. For example, instead of "WHERE COLUMN = ?" ,
PreparedStatement should be rewritten as "WHERE COLUMN IS NULL" , and instead of "WHERE COLUMN <> ?"
- as "WHERE COLUMN IS NOT NULL" . #bindEqual and #bindNotEqual directives are used to dynamically generate
correct SQL string in this case. Their semantics is the same as #bind directive above, except that they do not require "=", "!=" or "<>"
in front of them:
#bindEqual(value), #bindNotEqual(value)
#bindEqual(value jdbcTypeName), #bindNotEqual(value jdbcTypeName)
#bindEqual(value jdbcTypeName precision), #bindNotEqual(value jdbcTypeName precision)
Examples:
// build SQLTemplate
// note that "=" is ommitted for the second binding, since it is a part of the directive
String sql = "update ARTIST set ARTIST_NAME = #bind($name) where ARTIST_ID #bindEqual($id);
SQLTemplate update = new SQLTemplate(Artist.class, sql, false);
...
// set parameters and run it...
Map parameters = new HashMap();
parameters.put("name", "Publo Picasso");
parameters.put("id", new Integer(1001));
update.setParameters(parameters);
DataContext context...;
// after binding processing PrepapredStatement SQL will look like
// "update ARTIST set ARTIST_NAME = ? where ARTIST_ID = ?"
context.performNonSelectingQuery(update);
|
// build SQLTemplate
// note that "!=" is ommitted for the second binding, since it is a part of the directive
String sql = "update ARTIST set ARTIST_NAME = #bind($name) where ARTIST_ID #bindNotEqual($id)";
SQLTemplate update = new SQLTemplate(Artist.class, sql, false);
...
// set parameters and run it...
Map parameters = new HashMap();
parameters.put("name", "Publo Picasso");
parameters.put("id", null);
update.setParameters(parameters);
DataContext context...;
// after binding processing PrepapredStatement SQL will look like
// "update ARTIST set ARTIST_NAME = ? where ARTIST_ID IS NOT NULL"
context.performNonSelectingQuery(update);
|
7.7.5 Building Dynamic SQL - #chain and #chunk Directives
Often it is desirable to exclude parts of the WHERE clause if some parameters are null
or not set. This task is not trivial considering the semantics of a SQL statement. Consider this
fairly simple example:
String sql = "SELECT DISTINCT"
+ " #result('ARTIST_ID' 'int'),"
+ " #result('ARTIST_NAME' 'String'),"
+ " #result('DATE_OF_BIRTH' 'java.util.Date')"
+ " FROM ARTIST t0"
+ " WHERE ARTIST_NAME LIKE #bind($name)"
+ " OR ARTIST_ID > #bind($id)";
SQLTemplate select = new SQLTemplate(Artist.class, sql, true);
|
It would be nice to exclude ARTIST_NAME matching if "name" parameter is null, exclude ARTIST_ID
matching if "id" is null, and exclude the whole WHERE clause if both are null. #chain and #chunk directives are
used for this purpose. Each logical piece is wrapped in a conditional "chunk", and a number of chunks are grouped
in a chain. If chain contains no chunks it doesn't render anything enclosed in it.
String sql = "SELECT DISTINCT"
+ " #result('ARTIST_ID' 'int'),"
+ " #result('ARTIST_NAME' 'String'),"
+ " #result('DATE_OF_BIRTH' 'java.util.Date')"
+ " FROM ARTIST t0"
+ " #chain('OR' 'WHERE') // start chain prefixed by WHERE,
// and joined by OR
+ " #chunk($name) ARTIST_NAME LIKE #bind($name) #end" // ARTIST_NAME "chunk"
+ " #chunk($id) ARTIST_ID > #bind($id) #end" // ARTIST_ID "chunk"
+ " #end"; // end of chain
SQLTemplate select = new SQLTemplate(Artist.class, sql, true);
|
7.7.6 Binding ObjectId Values.
TO BE DONE
|


Deep Patel
Android, iOS, and NodeJS Developer
I'm a Software Developer who specializes in mobile applications.
This site is currently under construction ... it's a constant work in progress.
Add me on LinkedIn
I'm a Software Developer who specializes in mobile applications.
This site is currently under construction ... it's a constant work in progress.
Add me on LinkedIn


{% extends "base.html" %} {% load staticfiles %} {% block step %}breakdown-mvp{% endblock step %} {% block content %}
Click and drag your cursor over the actionable items in your MVP statement to make workstreams out of them.
"Our clients need to see products, put products in a cart, register, pay, and be able to download products.


iShares U.S. Medical Devices ETF Is Richly Valued
by Ploutos InvestingSummary
- Stocks in IHI’s portfolio should benefit from an ageing population in the world.
- Technological advancements should bring explosive growth to the medical devices industry.
- IHI’s top 10 holdings are stocks with competitive advantages over their peers.
- Most stocks in IHI’s portfolio appear to be trading at a valuation higher than their historical average right now.
ETF Overview
iShares U.S. Medical Devices ETF (IHI) owns a portfolio of large-cap medical devices stocks. The ETF is a nice defensive choice as demands for healthcare devices are less impacted in an economic recession. Stocks in IHI’s portfolio should benefit from an ageing population in the world. In addition, the advancement of technology and the implementation of AI should bring significant growth in the industry. Despite a long runway of growth ahead, most stocks in IHI’s portfolio are currently overvalued. Therefore, investors may want to wait on the sidelines until a better entry point.
Data by YCharts
Fund Analysis
The fund should benefit from an ageing population
Stocks in IHI’s portfolio should benefit from an ageing population in the world. According to a report by the United Nation, the number of people aged 60 years or older will double by 2050 from the current level today (see chart below). This presents tremendous opportunities for stocks in IHI’s portfolio to grow their businesses.
Source: United Nations
Stocks in IHI’s portfolio are moaty stocks
Medical devices industry is a good defensive choice, especially during an economic downturn, because demand for medical devices is less impacted in an economic recession. Therefore, IHI’s portfolio of stocks is a nice investment choice, especially during periods of economic uncertainties. In addition, stocks in IHI’s portfolio are stocks with competitive positions over their smaller peers. As can be seen from the chart below, all of the top 10 holdings in IHI’s portfolio receive either narrow or wide moat status, according to Morningstar’s research. These top 10 stocks represent 71% of IHI’s portfolio.
| as of 11/20/2019 | Morningstar Moat Status | % of ETF |
| Medtronic (MDT) | Wide | 13.06% |
| Abbott Laboratories (ABT) | Narrow | 13.06% |
| Thermo Fisher Scientific (TMO) | Narrow | 10.76% |
| Danaher Corp. (DHR) | Narrow | 7.60% |
| Edwards Lifesciences Corp. (EW) | Narrow | 4.88% |
| Intuitive Surgical (ISRG) | Wide | 4.82% |
| Boston Scientific Corp. (BSX) | Narrow | 4.39% |
| Stryker Corp. (SYK) | Wide | 4.14% |
| Baxter International (BAX) | Narrow | 4.11% |
| Becton, Dickinson (BDX) | Narrow | 4.11% |
| Total: | 70.93% |
Source: Created by author
Advancement in technology will bring explosive growth
The advancement of technology will continue to bring transformation to the entire medical devices industry in the next few decades. Stocks in IHI’s portfolio will benefit from the popularity of Internet of Things. In fact, Markets and Markets anticipates that the healthcare IoT market will be worth $158.07 billion by 2022 (a growth rate of 30.8% annually). Besides growth in healthcare IoT market, artificial intelligence is also poised to lead to significant growth in the healthcare industry. Medical equipment with AI capabilities can be used to detect many diseases quickly. Therefore, we see a long runway of growth for stocks in IHI’s portfolio.
IHI is trading at a premium valuation already
While we like the growth outlook of stocks in IHI’s portfolio, its portfolio of stocks is expensive. As can be seen from the table below, the average P/E ratio of IHI’s stocks is 26.72x. This is significantly higher than the S&P 500 Index. Its price to cash flow ratio of 13.70x is also considerably higher than the S&P 500 Index. Even though it has higher valuation, IHI’s average sales growth rate of 6.61% is lower than the S&P 500 Index’s 7.06%.
| IHI | S&P 500 Index | |
| P/E Ratio | 26.72 | 18.61x |
| Price to Cash Flow Ratio | 13.70x | 9.62 |
| Dividend Yield (%) | 0.73% | 1.96% |
| Sales Growth (%) | 6.61% | 7.06% |
Source: Morningstar , Created by author
Let us now take a look at the top 10 holdings of IHI’s portfolio. As can be seen from the table, 9 out of 10 stocks in its top 10 holdings have higher forward P/E ratios than their own 5-year average forward P/E ratios. The weighted-average forward P/E ratio of IHI’s top 10 holdings is 24.70x. This is higher than their 5-year weighted-average P/E ratio of 21.51x. Therefore, we think IHI is currently overvalued.
| as of 11/20/2019 | Forward P/E | 5-Year Average P/E | % of ETF |
| Medtronic | 20.04 | 17.31 | 13.06% |
| Abbott Laboratories | 23.09 | 20.21 | 13.06% |
| Thermo Fisher Scientific | 22.62 | 18.4 | 10.76% |
| Danaher Corp. | 25.19 | 21.38 | 7.60% |
| Edwards Lifesciences Corp. | 38.61 | 31.63 | 4.88% |
| Intuitive Surgical | 40.98 | 35.84 | 4.82% |
| Boston Scientific Corp. | 23.81 | 20.73 | 4.39% |
| Stryker Corp. | 22.57 | 20.5 | 4.14% |
| Baxter International | 21.65 | 22.89 | 4.11% |
| Becton, Dickinson | 19.65 | 18.98 | 4.11% |
| Weighted Average: | 24.70 | 21.51 |
Source: Created by author
Risks and Challenges
Currency risks
Since many stocks in IHI’s portfolio have sizable businesses internationally, these stocks’ revenues and profits can also be impacted by foreign exchange rates.
Medical devices industry can be highly competitive
Companies in IHI’s portfolio may face competition from new entrants. Many consumer electronics companies are trying to enter this space because gross margins of medical devices are generally much higher than gross margins of consumer electronics.
Investor Takeaway
Although we see a long runway of growth for stocks in IHI’s portfolio, thanks to technology advancements and an ageing population in the world, we recognize that most stocks in IHI’s portfolio are currently overvalued. Therefore, we believe investors may want to wait for a pullback before initiating a position.
Disclosure: I/we have no positions in any stocks mentioned, and no plans to initiate any positions within the next 72 hours. I wrote this article myself, and it expresses my own opinions. I am not receiving compensation for it (other than from Seeking Alpha). I have no business relationship with any company whose stock is mentioned in this article.
Additional disclosure: This is not financial advice and that all financial investments carry risks. Investors are expected to seek financial advice from professionals before making any investment.


Mental health is much more than a diagnosis.

1. Tell yourself something positive
Research shows that how you think about yourself can have a
powerful effect on how you feel. When we perceive our self
and our life negatively, we can end up viewing experiences in
a way that confirms that notion. Instead, practice using
words
that promote feelings of self-worth and personal power.
 I won't
get
the job because I tanked in the interview," try, "I didn't
do as well in the interview as I would have liked, but
that doesn't
mean I'm not going to get the job."
2. Focus on one thing (in the moment)
Being mindful of the present moment allows us to let go ofnegative or difficult emotions from past experiences that
weigh us down. Start by bringing awareness to routine activities, such as taking a shower, eating lunch, or walking
home. Paying attention to the physical sensations, sounds, smells, or tastes of these experiences helps you focus. When
your mind wanders, just bring it back to what you are doing.
3. Exercise
Your body releases stress-relieving and mood-boosting endorphins before and after you work out, which is why exercise is
a powerful antidote to stress, anxiety, and depression. Look for small ways to add activity to your day, like taking the
stairs instead of the elevator or going on a short walk. To get the most benefit, aim for at least 30 minutes of
exercise daily, and try to do it outdoors. Exposure to sunlight helps your body produce vitamin D, which increases your
level of serotonin in the brain. Plus, time in nature is a proven stress reducer.
4.  Carbohydrates (in moderate amounts) increase serotonin, a
chemical that has been shown to have a calming effect on your mood. Protein-rich foods increase norepinephrine,
dopamine, and tyrosine, which help keep you alert. And vegetables and fruits are loaded with nutrients that feed every
cell of your body, including those that affect mood-regulating brain chemicals. Include foods with Omega-3
polyunsaturated fatty acids (found in fish, nuts, and flaxseed.) Research shows that these nutrients can improve mood
and restore structural integrity to the brain cells necessary for cognitive function.
5. Go to bed on time
A large body of research has shown that sleep deprivation has a significant negative effect on your mood. Try to go to
bed at a regular time each day, and practice good habits to get better sleep. These include shutting down screens for at
least an hour before bed, using your bed only for sleep or relaxing activities, and restricting caffeinated drinks for
the morning.
6. Spend some time with family
Interacting with a close social network—especially face-to-face communication, as opposed to digital—significantly
reduces the occurrence of depression, anxiety, and other mental illness.
Being physically present with loved ones
creates a strong emotional support
to buoy you up through life’s challenges.


Triana Help Index
Triana's Spectral Storage Model
Index
Triana
and Frequency Data
Many of Triana's data types implement the
Spectral interface, which requires a number of methods for storing and
retrieving spectral data. The Spectral interface makes no assumptions about
how the underlying data sets are stored. It provides continuity of operation
of units that deal with spectral data even if they employ different storage
models. The spectral data types provide special functions that return spectral
data and their associated frequencies in monotonically increasing frequency
order, so that the spectra can be displayed by a unit that does not have
to know the details of the internal storage model. These functions are
used by Triana's graphing units Grapher
and Multigraph.
However, the details of how spectral data are stored are important to
users implementing data types and dealing directly with the data. The Triana
storage model is close to other common formats for spectral data storage,
and it allows for efficient use of memory. The model is described in detail
here and in the Triana JavaDoc help files
for the types ComplexSpectrum
and Spectrum.
Understanding Frequency-Domain Data Storage
in
Triana
Triana stores spectral data in data types
like Spectrum,
ComplexSpectrum,
TimeFrequency,
and Spectrum2D.
Spectrum and ComplexSpectrum are essentially identical except that the
data in Spectrum are real and in ComplexSpectrum complex. TimeFrequency
is a two-dimensional data set, one dimension of which is spectral and the
other time, so that it normally represents a sequence of spectra taken
at different times. Spectrum2D is a genuine two-dimensional spectrum, such
as might be obtained by performing an FFT on an image or other matrix.
Both TimeFrequency and Spectrum2D can hold either real or complex data.
Since FFTs generally produce complex output, the type Spectrum is normally
used only for the output of units the produce power spectra or related
objects.
One-dimensional spectral data (including the spectral dimension
of TimeFrequency) can generally be stored in several different ways.
-
Full-bandwidth data storage means that the spectrum contains
data values for both positive and negative frequencies.
-
One-sided data storage means that only positive frequencies
are held in the data object; if negative frequencies are required they
are reconstructed from the positive frequencies, on the assumption that
the spectrum represents the Fourier transform of a real data set.
-
Narrow-band data storage means that the stored data represents
only a portion of the full spectrum; if a full-bandwidth spectrum is required
then it is reconstructed by putting zeros into the data values associated
with frequencies outside the stored bandwidth.
Narrow-band data sets can be either one-sided or two-sided. Similarly one-sided
data sets can be either wide-band or narrow-band. Narrow-band data sets
keep a memory of how large the spectrum was from which they were filtered.
This amounts effectively to remembering the highest frequency contained
in that original spectrum, which is called the Nyquist
frequency of the data set. This term is used in the filtering units,
some of which offer the user the ability to reduce the Nyquist frequency.
This means that the "memory" about the original spectrum will be altered
so that, when the set is restored to a full-spectrum set, the highest frequency
will be smaller. If the spectrum is FFT'd back to the time domain, then
the sampling rate in the time domain will be correspondingly smaller, since
this sampling rate is exactly twice the Nyquist frequency. Thus, lowering
the Nyquist frequency will result in down-sampling of the time-domain
data set associated with the spectrum.
Triana employs these various storage models
in order to save memory usage. In many applications, such as when spectra
are divided into separate bandwidths, using full-bandwidth data would mean
replicating many useless storage locations. However, because Triana
data sets are self-describing, most Triana
units that deal with spectra are written in such a way that they will automatically
do the right thing with data, regardless of its storage format. Users need
to be aware of the different storage models, however, when they display
them, combine them, or make use of their special properties. There is more
detail on this subject in the help file for the
Triana
Spectral Model, which also defines the model completely.
For two-dimensional spectral data, narrow-banding in each dimension
makes sense, but one-sidedness has limited value, since data can be reflected
through two different zero-frequency lines. Therefore Triana
generally uses only full-bandwidth 2D data sets.
Storage Details
The details of the storage of spectral data depend on the number nFull
of
points in the full-bandwidth spectrum associated with a spectral data set,
and on whether the data are one-sided and/or narrow-band. The different
cases are detailed here. In the discussions we use f to denote frequency,
fN
to denote the Nyquist frequency (the highest absolute
value of the frequency that the spectrum could contain), df to denote
the frequency resolution (difference of frequency between adjacent points
in the spectrum), and flow and fhigh
to denote the lowest and highest absolute values of the frequency that
are actually contained in the stored data set. The discussion below covers
four possible cases: Full-spectrum, one-sided/full-bandwidth,
two-sided/narrow-band, and one-sided/narrow-band
data.
Full-spectrum (two-sided, full-bandwidth)
data storage. The data are two-sided (include negative frequencies)
and full-bandwidth (flow = 0, fhigh= fN).
The data are stored so that the positive-frequency elements are first,
followed by the negative-frequency elements. The highest frequency is associated
only with the negative-frequency band if nFull is even. Here is
a sketch of the data storage:
if nFull is even then fN = (nFull/2)df and
the stored frequencies are
0, df, 2df,
..., fN - df, -fN , -fN +
df, ..., -df.
If nFull is odd then fmax = fN = (nFull-1)/2
* df and the stored frequencies are
0, df, 2df,
..., fN , -fN , -fN + df,
..., -df.
If the spectrum is a Fourier transform of a real time-domain data set,
then there are symmetries. In both above cases, the amplitude at frequency
fj
is the complex conjugate of that at -fj . In case nFull
is even, this also implies that the amplitudes for
f=0 and for -fN
are
real. If nFull is odd, then only the amplitude for
f=0 need
be real.
One-sided, full-bandwidth data storage.
Here only the non-negative frequencies are stored but the frequency domain
is full-band (flow = 0, fhigh =
fN). If negative frequencies need to be reconstructed, they
are assumed to follow the rule above for complex-conjugates. The Triana
storage model does not, however, simply leave off the negative frequencies
of the full-spectrum storage scheme. In the case where nFull is
even, the highest frequency is in the negative-frequency range; in this
case, when data are made one-sided, the amplitude for -fN
is stored at a new frequency value +fN . The storage
scheme is thus:
0, df, 2df, ..., fN .
If a two-sided spectrum derived from a complex time-series data
set is converted to one-sided, information will be lost. However, when
the two-sided spectrum is derived from a real time-series data set, then
the negative-frequency information is redundant, and the Triana one-sided
model is an efficient way to store all the information in the spectrum.
In this case the amplitudes at f=0 and f = fN are
real.
Narrow-band two-sided data storage.
If a spectrum has been filtered, then only some data points may be
non-zero. The Triana storage model allows the zeros to be omitted if the
non-zero part of the spectrum is fully contained between two frequencies
flow and fhigh. When the data are two-sided,
then the amplitudes associated with the negative frequencies must also
be stored. The arrangement depends in detail on whether nFull is
even or odd, on whether f=0 is included in the band, and on whether
n = the length of the narrow-band data set is even or odd. The basic
assumption is that filtering removes paired frequencies: if any positive-frequency
amplitude is removed (set equal to zero), so is the corresponding negative-frequency
amplitude. If a unit performs an operation that does not act in such a
symmetrical way (such as the units NegativeF
and PositiveF, which zero the positive and
negative frequency amplitudes, respectively), then it cannot take advantage
of the narrow-band storage model.
If nFull is even, then the frequencies of the two-sided
full-bandwidth spectrum at 0 and -fN are un-paired; in
particular there is no element at +fN.Thus, if the spectrum
has been filtered from the top only (low-pass) or from zero only (high-pass),
the narrow-band spectrum will have an odd number of elements; if it has
been filtered from both ends then it will have an even number of elements.
If nFull is odd, then the full-bandwidth spectrum contains
only one un-paired element at f=0; there are paired elements at
+fN and
-fN.
If it is filtered from
above, then the narrow-band data set likewise has an odd number of elements;
if from below then the result is an even number of elements.
It can be seen from this discussion that if the narrow-band two-sided
data set has an odd number of elements, then it must include either (but
of course not both) f=0 or f=-fN . Conversely,
if it has an even number of elements, they are all paired. So the
storage model for an even number of elements is simple --
If n is even then the stored frequencies are
flow
(>0) , flow + df, flow
+ 2df, ..., fhigh - df, fhigh ,-fhigh
, -fhigh + df, ..., -flow - df., -flow.
That is, first the positive-frequency elements are stored, then the
same number of negative-frequency elements. There are no elements at f=0
or f=-fN . This is independent of whether nFull
is even or odd. If this data set is sent to the units Grapher
or Multigraph, it will
be displayed as two disjoint sets in the positive- and negative-frequency
domains. If displayed as a line-graph, there will be a line between the
highest negative-frequency point and the lowest positive-frequency point.
Do not be disturbed by this line; it just means that there is no data in
the data set between these values.
On the other hand, if n is odd, then the storage will depend
on whether the un-paired element is at f=0 (part of the positive-frequency
domain) or f=-fN (part of the negative-frequency
domain). The two cases are --
If n is odd and f=0 is present (so that flow
= 0 is the un-paired element) then the stored frequencies are
0, df, 2df, ..., fhigh, -fhigh, ..., -df.
If n is odd and f=0 is not present (so that flow
> 0), then fhigh = fN is
the un-paired element and the stored frequencies are
flow
(>0) , flow + df, ..., fN
- df, -fN
, -fN + df, ..., -flow - df., -flow
.
Narrow-band one-sided data storage.
Like the full-bandwidth one-sided case, in this case the storage model
is simpler than in the two-sided case. The frequency range simply extends
from flow and fhigh. It is permissible
to have flow = 0, in which case fhigh <
fN . Alternatively, it is permissible for the last element
to be associated with fhigh , in which case flow
> 0. The stored frequencies are
flow (>0) , flow + df, ..., fhigh
- df, fhigh.
Implementation of the Triana
Spectral Storage Model
In Triana the storage model is implemented
in the data types that implement the Spectral interface. Full details of
the implementation are in the Triana JavaDoc
help files. But a few remarks are appropriate here, because these data
types provide some standard methods that the user can make use of to inspect
the data and decide how the data are stored. These are described here for
users who want to program new units to handle spectral data.
Spectral data types inherit from GraphType, and so they have some standard
methods that can be used to access the data.
-
Object getDataArrayReal(0) and Object getDataArrayImag(0)
return the real and imaginary parts of the data, stored according to the
model described above. They return Objects, that must be cast to double[]
or double[][], depending on whether the returned data are
one- or two-dimensional.
-
boolean isDependentComplex(0) returns true if the data
held in the object is complex, false if it is real.
-
int getDimensionLengths(0) returns the number of elements in the
first dimension of the data. For one-dimensional data like ComplexSpectrum,
this is the length of the data set, the same as the length of the double[]
array returned by getDataArrayReal(0). For TimeFrequency data,
this is the number of time-steps. The number of points in the frequency
dimension is returned by int getDimensionLengths(1).
-
double[] getIndependentScaleReal(0) returns the values of the
frequencies that are associated with the points actually held in the object,
for the one-dimensional types. For TimeFrequency data, this call returns
the time-values associated with the different spectra, while the frequency
values are returned by double[] getIndependentScaleReal(1). These
calls are used by Grapher to set the horizontal scale values when spectra
are displayed.
-
Object getGraphArrayReal(0) and Object getGraphArrayImag(0)
return the data in order of monotonically increasing frequency. These calls
must be cast to the appropriate types, as for getDataArrayReal(0)above.
These calls are used by Grapher to get the vertical values when spectra
a displayed.
In addition, some of the methods required by the Spectral interface can
be used to get the data that is required to decide what kind of spectral
data are stored in a data type. These include the following.
-
int getOriginalN(0), which returns the number of points in the
full spectrum, called nFull above.
-
double getFrequencyResolution(0), which returns the number called
df above.
-
double getLowerFrequencyBound(0), which returns the number called
flow above.
-
double getUpperFrequencyBound(0), which returns the number called
fhigh above.
-
boolean isNarrow(0), which returns true if the data set
is narrow-band, false if full-bandwidth.
-
boolean isTwoSided(), which returns true if the data
set is two-sided, false if one-sided. (No 0 is required in the
argument.)
Moreover, the data types ComplexSpectrum, Spectrum, and TimeFrequency implement
additional methods that can be useful:
-
double getNyquist(), which returns the Nyquist frequency, called
fN
above.
-
double getSamplingRate(), which returns the sampling rate of the
time-series data whose transform might have produced the current spectrum.
Finally, some of these functions have counterparts in Triana
units, which allow users to inspect data types at runtime. These include
the units called FrequencyResolution,
HighFreq, Length, LowFreq,
SampleRate, TestNarrow,
and TestTwoSided.
These accept a data set as input and produce the appropriate value as an
output, which can then be used as input to other units to set parameters,
or which can be displayed.


Coca
Coca
FAQ
CONTACT
+3902 45 33 22 87
MON - FRI: 08:00 - 05:00 PM
Home
OnePage Home
Minimalist Home
Creative Home
Film Strip
Category List
Timeline Projects
Timeline List
Revolution Slider
Parallax Presentation
Parallax With Text
Simple
Splitted Screen
Splitted Creative Banner
Columns Gallery
Before & After
Slider
Fullscreen Slider
Video Background
Pages
About
About Me
About Us
Work Process
Services
Services Details
Bibliography
People
Media
Exhibition
Clients
Pricing
Pricing Simple
Pricing Image
Contact
Contact Me
Contact Us
Other Pages
Coming Soon
Protected Page
Error Page
Projects
Work Grid
Work Masonry
Work Film Strip
Work Category List
Work Timeline List
Work Timeline Images
Projects Details
Parallax Presentation
Parallax With Text
Simple
Splitted Screen
Splitted Creative Banner
Columns Gallery
Before & After
Slider
Fullscreen Slider
Shop
Products
Product Details
Cart
Checkout
Blog
Blog Grid
Blog List
Blog Details
Open
Close
SHOP
Showing 1–8 of 9 results
Default sorting
Sort by popularity
Sort by average rating
Sort by latest
Sort by price: low to high
Sort by price: high to low
Add to cart
Bertt Side table
$
83.40
Sale
Add to cart
Coffee Table
$
57.00
$
48.00
Add to cart
Modern End Table
$
87.00
Sale
Add to cart
Modern End Table
$
87.00
$
69.00
Add to cart
Side Table
$
48.00
Add to cart
Soft chair
$
57.00
Add to cart
Wooden Chair
$
83.40
Sale
Add to cart
Wooden Nightstand
$
48.00
$
40.00
Showing 9–9 of 9 results
Default sorting
Sort by popularity
Sort by average rating
Sort by latest
Sort by price: low to high
Sort by price: high to low
Add to cart
Wooden Table
$
97.00
Prev Page
Next Page


class: center, middle # Mapping ## https://leafletjs.com/ * Leafletjs: open source mapping library * MapBox: google maps like service. Provides maps to be used in building applications --- ## In Class Exercise: * Drop pins on the map for each city * Draw colored lines connecting cities based on the flight path * Add click popups for each line with flight data * Add click popups for each city with city flight data. --- ## In Class Assignment: Using the meetup.com api, render upcoming events on a leaflet map. * clickable map pins * display event data on click.
You will need an account with meetup.com to complete this assignment.
### Helpful Documentation links * Authentication: https://www.meetup.com/meetup_api/auth/#keysign * API Key: https://secure.meetup.com/meetup_api/key/ * API Documentation: https://secure.meetup.com/meetup_api


1. Introduction and Goals
DeChat is a messaging application such as WhatsApp, Line, or Telegram, but with the main difference that it is based in a decentralized architecture to work. This means, among other interesting features, that the data storage and the app are independent, so you decide where all your information is saved.
Even though it is a different approach to an existing technology, it implements the same features a user of a similar app would expect. Some of these features include:
-
Chats with one or more people.
-
Notifications (when being spoken, invited to a group chat…).
-
File sharing (image, video, gif…).
1.1. Requirements Overview
The requirements of the project are set by the teachers of the Software Architecture course and the people from Solid and Inrupt. They are the following:
-
Implement continuous integration (with Travis).
-
Keep a good quality code (between an A and a B, tracked with Codacy).
-
Have a test coverage of 60%-90% (tracked with Coveralls).
-
Definition and use of code conventions.
-
Message portability between other decentralized chat applications.
-
And all of these from the Course Guide and the Inrupt Challenge
1.2. Quality Goals
| Goal | Scenario |
|---|---|
Adaptability |
Personalization of the user interface to your like (Night mode, highlight contacts…). |
Availability |
Be able to use the app as long as there is internet connection and your POD is in a working Solid server. |
Modifiability |
The software can be easily updated, trimed and/or extended by the developers. |
Performance |
Low latency for working with the app (sending and receiving messages in a small time span, fast data load…). |
Portability |
Use the same app from either a web navigator, a native application installed in a computer or your mobile phone. |
Privacy |
Define which data which people can see and interact with. |
Scalability |
Support of a huge number of concurrent users. |
Security |
No malware compromises the private information of the users. |
Usability |
Following the standards from similar apps, the user will feel familiar and know how to use the app even without needing a manual. |
1.3. Stakeholders
Role/Name |
Contact |
Expectations |
Developers |
Daniel Villanueva, David González, Jonás Martínez, Juan Sánchez-Ocaña. |
The correct development and functioning of the application, accomplish the requirements from the course and the people at Solid. |
Teachers |
PhD José Emilio Labra Gayo |
A good project that we can show to the people at Solid and be proud, but also to pass the subject and learn how to work in the real world through the development process. |
Inrupt & Solid community |
Sir Tim Berners-Lee, Mitzi Laszlo |
A functional project for introducing to developers and users a new way of making projects in the web, far away from the current over-centralized model. |
End users |
People that use the app |
A functional, fast and safe app for chatting in a daily basis. |
2. Architecture Constraints
The constraints of the architecture of the app are divided in technical, organizational and political, and conventions:
| Constraint | Explanation |
|---|---|
Decentralized Architecture |
The data of the app is stored in several places in the world. |
Solid PODs |
The data structure developed by Solid is used to store the data. |
OS and browser independent |
In its native version the app works in all operating systems, and in its web version, in all browsers. |
Web application |
The application has a web interface. |
JavaScript |
The core of the application is implemented using JavaScript. |
JSON data format |
The data of the app is stored in the PODs using JSON files. |
Schema standards |
The storage of information follows the standards of Schema for being able to to use different apps with the same data. |
Variety of tests |
For the application’s core, load, acceptance, browser-based, usability, security… |
| Constraint | Explanation |
|---|---|
The team |
Daniel Villanueva, David González, Jonás Martínez, Juan Sánchez-Ocaña. |
Time schedule |
Start in late January and deliver the final version in late May/June. |
Version control |
A Git repository keeps a complete commit history and the participation of the members of the team. |
Test tracking |
Track the different tests of the app with CodeCov or Coveralls. Aim to achieve a sufficient code coverage. |
Behaviour Driven Development |
Design the application encouraging the collaboration between developers and non-technical participants of the project. |
MIT License |
The project contents are open source and published under the MIT License. |
| Constraint | Explanation |
|---|---|
Documentation |
Based in the arc42 template. |
Coding |
Use of the JavaScript coding conventions and enforce them through Codacy. |
Language |
Code and documentation is developed in English for our international audience. |
3. System Scope and Context
DeChat allows real-time peer-to-peer communication with a decentralized structure, which means:
-
Two or more people can exchange information between them without depending on a third person or entity.
-
Their data is never shared with anyone outside this direct communication channel.
3.1. Business Context
Communication is made via PODs: When a user sends a message to a contact, the message is written in the sender’s PODs, and then the message’s link is shared with whoever the writer has chosen. The data of the app is composed by the user’s information, plus the links to other user’s messages that their owner has given the first user access to.
In this example, each user has private messages to each other user, but also group messages to the other two.
3.2. Technical Context
The communication looks simple, but there are some things that have to be taken into account:
-
DeChat cannot access directly to the raw information of a POD, there has to be an interface that fetches the relevant data and sends it to the app.
-
Reading and writing in PODs has to be asynchronous for several reasons.
-
A message buffer/cache is important for a fast access to the most requested data.
Currently, the interface and the reading and writing of PODs are based in solid-file-client.
4. Solution Strategy
The JavaScript framework we have chosen. It provides web development using "components" and based in Model-View-Controller, facilitating the work for the interface and the services it has to provide.
Users log into their PODs through this service, already developed by Solid, open source, free to use and server independent.
Rather than accessing to the raw data of a POD, each of them implements an interface that handles the requests of the app. It allows writing the links between the PODs and retrieving their information regarding DeChat. It is based in RDFLib.
Data is stored and retrieved in/from the PODs using JSON-LD, a variant of JSON for Linked Data. We chose this for the familiarity we have with this format.
Manages the requests of the app to the user PODs, being able to hold them even when a POD is not available or busy managing other requests.
5. Building Block View
5.1. Scope & Context
Users can read and write messages using DeChat, which, through a user-friendly interface, manages the POD storage and the data linking of the user and its contacts.
| Item | Meaning |
|---|---|
User(s) of the app, source of all human interactions with the system. |
|
Interactions between entities, data structures or application blocks; flow of information. |
|
Solid POD server, a server which, among other things, can host user PODs. |
|
User’s POD, a data structure for any kind of information. In our case, messages. |
5.2. Level 1
The first level of the Building Block View is a overall glance at the main blocks of the app:
As the app is based in the Model-View-Controller structure, the purpose of the blocks is pretty clear in general lines. Nonetheless, there are details that need further explanation:
-
Model
-
Abstraction of the data structures needed for the app.
-
Serves for storage of the information fetched from the POD.
-
Is modified by the Controller and modifies the visual components of the View.
-
-
View
-
Form of interaction with the app for the users.
-
Provides ways of interacting with complex components in a user-friendly way.
-
Is modified by the Model and interacts with the Controller to get things done.
-
-
Controller
-
"Brain" of the app, knows what to do and how in order to perform several user operations
-
Is formed by services, libraries and methods to work with either POD, user or app data.
-
Is told by the View to perform actions and their results are reflected in the Model.
-
5.3. Level 2
And at level 2, a view of the components and ths services
-
Model: Storage of the contacts, chats, friends and messages of the user without being parsed into a html element.
-
contact.model.ts
-
chat.model.ts
-
friend.model.ts
-
message.model.ts
-
-
View: Visual representation of the elements once parsed into html components
-
Contact List View
-
Chat View
-
Friend List View
-
Message View
-
Login View
-
-
Controller:
-
contact.service: For parsing the contacts from the model into html.
-
rdf.service: For writing and reading from the contents of the PODs.
-
solid.auth.service: For session handling management.
-
6. Runtime View
The order of interaction between the different blocks of the application is from top to bottom, so the first interactions to be executed are the top ones.
6.1. Login & Reading Messages
Initially, the app shows a login screen with fields for introducing your POD provides and your credentials.
Once the user is logged in successfully, in case it’s the first time using DeChat, the app will create the needed folders for the data storage. Otherwise, the messages will be read from the POD and parsed into their corresponding models. Then, the contacts and messages are displayed and the user can work with the app as they wish.
6.2. Making new chats & Writing Messages
In case a user wants to make a new chat, they have to click on "New chat", choose the contacts that they want to chat with and click "Next".
Then the controller will create the neccessary files and folders on each of the chat participant’s PODs, update the model with the new information (contact list and chat view), and show a new empty chat to the user.
Now, for sending a message, the user writes its contents in the message window and clicks on the "Send" button.
This way the view will tell the controller to create the corresponding message file in their POD, link it to the contact’s PODs and write a notification. Then the models are updated and the views in consequence, showing the message in both DeChat applications.
7. Deployment View
Node/Artifact |
Description |
DeChat development platform(s) |
The computers from the members of the team, standard machines with the needed software and internet connection. |
Web browser |
A standard web browser to access the application. |
GitHub server |
Repository for the code, documentation, and deployment. |
Code repository |
Cloud copy of the source code for several reasons. |
Docker |
Code container software providing everything the application needs for running properly. |
GitHub page |
Deployment of the app in the GitHub server. |
Documentation page |
Deployment of the documentation of the app in the GitHub server. |
Solid server |
Any server prepared for POD storage. |
User POD |
Personal data storage prepared for working with decentralized applications. |
8. Cross-cutting Concepts
8.1. Domain Concepts
Entity |
Description |
User |
The person using the application |
Friend |
Person tagged as 'knows' in the POD, can become also a contact. |
Contact |
Friend that the user have chats with. |
Message |
String, link, video or audio. |
Chat |
Set of messages between two contacts. |
Group Chat |
Chat but for three or more contacts. |
8.2. User Experience Concepts
8.2.1. User interface
DeChat has a web interface with a side-menu that allows users to view their chats with contacts (including groups) and a contact list. These two can be searched for specific results using their respective filter button. The side menu also has a button to change the chat settings and a button to create new group chats. The application has a chat view too, for reading and writing messages to other users.
It’s a Single Page Application written in JavaScript using Angular JS.
8.2.2. Internationalization (i18n)
Initially we had planned to internationalize the user interface of the application, but we ended up short of time so we did not do it. Nevertheless, there are no components other than strings, so the development process should be fairly easy.
8.3. Safety & Security Concepts
8.3.1. Safety
The parts of the system that have life endangering aspects inherit from the bases of P2P computing. In case someone tried to reach dangerous goals with DeChat, we can’t respond for the misuse of the software.
8.3.2. Security
The security of the user credentials depends on the user’s pc and web browser, and in the strength of the Solid session manager.
In a P2P system, the only data leak that could be made depends on the human factor of sharing something unintentionally.
8.4. Architecture & Design Patterns
The user interface is based in Angular, and the work methodology of Angular is based on this pattern.
8.5. Under-the-hood
8.5.1. Persistency
All user data is stored in their POD through the solid-file-client library.
8.5.2. Transaction Handling
There is no sort of rollback for preventing unfinished transactions implemented yet.
8.5.3. Session Handling
The management of the session is made with solid-file-client.
8.5.4. Reporting
Bugs, ideas, recommendations and anything else can be made through the issues page of the GitHub project, following the standards for opening an issue.
8.6. Development Concepts
8.6.1. Configurability
There is no way of configuring the application to your like yet (other than changing the source code by yourself and recompiling the application).
8.6.2. Testing
The following tests are implemented:
-
Acceptance tests: Written in Gherkin, using Protractor-Cucumber.
-
Browser-Based tests: Developed using Selenium.
-
Load tests: Using Gatling.
-
Monitoring & Profiling: With Google Chrome DevTools.
8.6.3. Profiling
During the profiling operation in Google Chrome using DevTools with an slowed processor it was noted that the most time consuming step in the application is the script evaluation. Therefore, it should be the first to look at when optimizing the application.
8.7. Operational Concepts
8.7.1. Disaster-Recovery
The data of the application is stored in servers independent from the app, so the responsibility of making backups from the PODs from time to time resides in the server’s managers. Users can make backups of their PODs into their PCs whenever they want. If your Solid POD server falls, there are more to work with, so even if you lose your information you can use the app from other server.
The recovery is dependant of GitHub. If anything happens to their servers the application would be down until they manage the disaster.
8.7.2. Scalability
Initially, the scalability issues we could have were solved.
8.7.3. High Availability
Once a new version of the app is made, the only time it takes is from merging the new contents from the development branch with the master branch. Once that process is completed, refreshing the web should show the new features.
As long as GitHub and a Solid server work, there is not such a thing as a "downtime" and you can use the app freely.
|
Warning
|
Notice that your chats, contacts and such will be lost if the Solid server from the provider of your POD gets destroyed or something similar. Making a new POD in a different server allows you to use the app, but you will need to make new friends and contacts. |
9. Design Decisions
The following table represents the design decisions sorted from most to less important:
| Section | Definition | Rationale |
|---|---|---|
Frontend |
Use AngularJS for the user interface |
Angular offers an easy way of working with the components of complex user interfaces. As some members of the team were familiar with it and others were neither familiar with JS or Angular, we chose to learn and use Angular (and JS by extension) over learning and using plain JavaScript. |
Backend |
Use Typescript for the core of the application |
As the project is based in Angular, we chose to use Typescript over plain JavaScript for development conveniences. |
Library |
Use of solid-auth-client |
Rather than implementing a whole login system for the app, we used an oficial library for it. |
Library |
Use of solid-file-client |
We were not very successful using RDFLib for writing and reading in the PODs, so we discarded it and tried with this library. |
RDF |
Plain JSON for storage |
Initially, we would use JSON-LD to write in the POD, but it seemed like a too difficult task, so we ended up working with a plain (and very unconvenient for a lot of things) version. |
RDF |
Namespace convention from Schema |
Rather than inventing a new one and probably be a failure, we took the namespaces from this organization. |
Testing |
Use of Cucumber for testing |
We chose to use Cucumber over Karma because we would not be able to make the tests from the new requirements otherwise. |
Documentation |
Use the arc42 template for the documentation (AsciiDoc) |
We chose arc42 over other documentation models because of the recomendations of the teachers of the course. |
Library |
Use (and discard) of WebRTC |
Initially, the WebRTC technology would help the app retain the petitions to the unreachable PODs until they were available, but then we realized that in the current computing paradigm PODs are stored only on servers, so they should never be unavailable. |
Testing |
Use (and discard) of Karma |
Our tests were initially automated using Karma, later on it was supplanted by Cucumber. |
Frontend |
Solid-like color palette |
As we work in a Solid "product", we chose to make the app look familiar to the original project: a mix of purple, blue and white colors. |
10. Quality Requirements
10.1. Quality Tree
The following diagram represents the quality attributes and their scenarios, sorted by priority from top (highest priority) to bottom (lowest priority):
10.2. Quality Scenarios
Sorted by type, the following tables explain the quality scenarios from the quality tree.
Scenario |
Concretization |
Priority [1] |
App feels familiar to the users |
When users see the interface, the knowledge from using similar applications in the past helps them using DeChat |
High, Medium |
Standard display of elements |
Users have interface components where they would expect them to be |
High, Medium |
Smart interface design |
The usability tests of the app changed their fashion, adjusting it for a better working time |
High, High |
Accesibility standards |
A mouse is not needed to use the app, and the color codes are not prohibitive for users with visual impairments |
Medium, Medium |
Cool-looking colors and elements |
Interface has a good looking style with a Solid-like color palette, which altogether invites you to use it |
Low, Low |
Scenario |
Concretization |
Priority [1] |
Data can’t be intercepted by unrelated entities |
While two users are chatting, nobody other than those two people is able to get that information |
High, Medium |
The data of the app is decentralized |
Data remains safe if the server hosting the app falls |
High, High |
Users choose where to store their data |
From an official Solid server to your own personal computer, you choose where to save the application’s data |
High, High |
Scenario |
Concretization |
Priority [1] |
Interactions with the UI are reflected within a reasonable time |
The UI shows feedback from your actions fast (e.g. sending a message an seeing automatically in your chat) |
Medium, Medium |
The new data is shown in the partner’s chat within a reasonable time* |
Once a message is sent, it should not take more than 1-2 seconds to be seen in the UI of your chat partner |
Medium, Low |
The system has no downtime and is available in their web always |
Updates are automatic, do not take user time, and the app is available as long as the server does not crash |
Medium, Low |
The loading of information does not leave the system unavailable for more than 5 seconds |
Loading big chunks of data (chats, messages, contacts…), specially when you log in, puts the system in a "waiting to use" scenario that has to be minimal |
Medium, Medium |
Scenario |
Concretization |
Priority [1] |
Work methodologies are clear |
Developers can check the documentation to know how to work in the project |
Medium, Low |
Project’s architecture and module’s purposes are clear and coherent |
Developers can check the documentation to know where to work in the project |
Medium, Low |
Different tools and technologies are implemented for the different test cases |
Having the test setup already prepared eases the testing process, having only to develop the cases |
Medium, Medium |
11. Risks and Technical Debts
The Solid project introduces new concepts, technologies and information that we have never worked with. We have to learn how to manage them by ourselves, without many documentation or examples.
Investigation, research, spending time on it and asking for assistance to the Solid community are our best bets.
Some of us have never worked with JavaScript, TypeScript or Angular. This brings in a new programming language we have to face, learn and master. Also, even though the framework provides good tools, it also adds complexity to these tasks.
Tutorials, documentation reading and spending time on it are the way to go.
The RDF intrigures add new data organization concepts that some members of the team are not used to.
Work and advice from the most experimented members in this matter is the best thing to do.
Developing architectures before fully learning about them is a challenge. Our design will probably be less optimal than it should, and it could also drag down app functionalities.
The only thing we can do about it is try, learn from the failures and patch them the best we can or start from scratch.
Arc42 is a good documentation template, but learning about the new different things we have to develop in it is a challenging task.
Doing research and learning with internet examples are the way to succeed in this job.
Part of the course includes several new kinds of project tests, which mean new tools, programming lenguages, configuration logistics and concepts.
We have to get used to all this new information and spend time working on the different test in order to overcome this challenge.
More people working on a project does not always mean a better final product or less work by developer. Being several people in the team adds complexity to task distribution and group organization.
The members of the team are expected to work independently, look for things to do when they are done working in something, and to be eager to communicate with the other members.
12. Glossary
| Term | Definition |
|---|---|
Angular |
Typescript-based open-source web application framework for an easier development of single-page applications. |
Asynchronous (Asynchrony) |
Regarding computer programing, refers to the occurrence of events independent of the main program flow and the ways to deal with them. |
Codacy |
Code analysis tool for identifying automatically security issues, code duplication, code complexity and more. |
Cucumber |
Testing tool for Behaviour-Driven development that runs acceptance tests automatically. |
Decentralized (Decentralization) |
Allocation of hardware and software resources through several places. Currently, refers to an alternative model to the nowadays frequent mass hoarding of data from big firms. |
Docker |
Tool that provides container software includying everything needed to run an application: code, libraries, settings… |
Gherkin |
Language for defining Cucumber test cases. |
Git |
Distributed version-control system for tracking changes in source code during software development. |
Interface |
Shared boundary between two or more separate components of a computer system for exchanging information. |
Jasmine |
Unit test framework for checking the correct behaviour of the lowest level features. |
JavaScript (JS) |
High-level, interpreted programming language. One of the core technologies of the World Wide Web that enables interactive web pages and is an essential part of web applications. Used by the vast majority of websites. |
JSON (JavaScript Object Notation) |
Lightweight data-interchange format based on attribute-value pairs. Easy for humans to read and write and easy for machines to parse and generate. |
JSON-LD (JSON for Linked Data) |
Variant of JSON for encoding Linked Data. |
Karma |
Test runner for tests written with Jasmine. |
Model-view-controller |
Architectural pattern used for developing user interfaces. |
Native app |
Software program developed for using it on a particular platform or device. |
Peer-to-peer (P2P) |
Distributed application architecture that partitions tasks or workloads between peers. |
POD (Personal Online Data Store) |
Data structure hosted wherever its owner desires used for storing personal data. |
RDF (Resource Description Framework) |
Family of W3C specifications for a metadata data model. It is used for the modeling of information that is implemented in web resources. |
RDFLib |
Library for JS which easies the work with RDF. |
Schema |
Shared vocabulary to structure data markup in websites. |
Service |
Software functionality with a purpose that different clients can reuse. |
Solid |
Web decentralization project led by Tim Berners-Lee. Aims to change the way Web applications work nowadays, resulting in true data ownership and improving privacy. |
Stakeholder |
Person that has an interest in a project or company and can either affect or be affected by their business. |
Travis |
Hosted, distributed continuous integration service used to build and test software projects. |
TypeScript |
Superset of JavaScript that adds optional static typing to the language. |
URI (Uniform Resource Identifier) |
String of characters that unambiguosly identifies a particular resource. |
Web App |
Client–server computer program where the client runs in a web browser. |
WebRTC (Web Real-Time Communication) |
Free, open-source project that provides web browsers and mobile applications with real-time communication via simple application programming interfaces. |
13. About arc42
arc42, the Template for documentation of software and system architecture.
By Dr. Gernot Starke, Dr. Peter Hruschka and contributors.
Template Revision: 7.0 EN (based on asciidoc), January 2017
© We acknowledge that this document uses material from the arc 42 architecture template, http://www.arc42.de. Created by Dr. Peter Hruschka & Dr. Gernot Starke.


--- layout: article title: Lostcast production timelapse author: matt ---
Lostcast is our podcast about HTML5 games! In this post, I'll walk you through this crazy timelapse that shows how I edit the 'cast:
First I apply compressors to both audio channels (usually it's just mine and Geoff's) and limit the master output to 0 dB. At first I just throw these modules in and don't tweak the settings just yet.
This is the time-consuming part. I basically go through the audio with a fine-toothed comb.
I also cut out parts where we messed up or if something was just not remotely interesting. Geoff and I are both really rambly, so sometimes I cut out entire conversations!
Basically my goal with this step is to get the podcast sounding lean and compact with almost no silence.
Next I'll go back and tweak the compressors. I'm not an audio engineer, just a hobbyist, so I'm going for a "good enough" approach here. I want to ensure that everyone on the podcast sounds loud enough to be heard clearly at normal volumes, at all times.
I don't do this step for every podcast, but sometimes I like to go in and add some additional polish in the form of sound effects. Sometimes I'll add reverb to someone's voice just for fun (like when an announcement is made), or I'll add some sound effects from Onslaught! Arena between conversation topics to give the listener a quick breather.
The last step is to include the music.  I used to include quiet music behind the whole 'cast, but people seemed to hate that!
Lastly I really enjoy playing the show out with a song from Joshua Morse because I think he's an amazing artist and want to spread his music around.
The next episode of Lostcast features an interview with Dominic Szablewski of Impact -- be sure to subscribe so you don't miss it!


--- layout: post title: 'UPDATE: Thank you to the huge number of responders. We''ve secured a space! The workshop is continuing...' date: type: post published: false status: draft categories: [] tags: [] meta: google_plus_activity_id: z12yslfaiyvdjvgqy04cglshilm2ehc4tbw author: login: admin email<EMAIL_ADDRESS>display_name: admin first_name: Carina C. last_name: Zon ---
UPDATE: Thank you to the huge number of responders. We've secured a space! The workshop is continuing as scheduled.
PREVIOUSLY:
Due to unforeseen circumstances, the location where Railsbridge
Outreach Workshop for Women was going to host this week's workshop has fallen through.
If we can't secure a new location by 3pm today (4/26), we'll have to
cancel the workshop. Not only will this be a bummer for us organizers
who have been toiling to put on the event, it'll really, really suck
for all the folks that have signed up for this event and put effort
into preparing for it.
Therefore, we are reaching out to you to see if your
company can accommodate 60-80 people Friday night and all day
Saturday. If your company in SOMA, Downtown, or Financial District can
accommodate us, please contact me before 3pm today/Thursday.
REQUIREMENTS:
Location - SOMA, Downtown, or Financial district; and walkable from
Muni, CalTrain, and BART.
Room Capacity - Railsbridge will have 40-50 students and 40-45
volunteers this weekend. We need 5 (or more, if available) breakout
rooms for them that are equipped with projector/adaptors, electrical
outlets, and guest wifi access.
Time needed - Friday 5pm -11pm (we'll hopefully be able to leave by
10, but need the buffer); Saturday 8:00am to 5:30pm (possibly as early
as 5pm).
Use of Facilities - Permission to use kitchen snacks/beverages would
be lovely, if the host company is amenable.
Sponsorship of food (nice to have; optional) - Food for Friday (pizza)
and Saturday (lunch, light breakfast). But Railsbridge can cover our
own food costs/arrangements if necessary.
Background info on Railsbridge can be found here:
http://railsbridge.org/
http://www.sfruby.info/events/60258772/
We hope one of you can come through for us. Thank you for your
support of Railsbridge!


Enter url to pop up
note: this url will pop up even if the app didnt open this plugin
pop up after
Save


{{cityName}}
| Event Name | Event code | Event Release Date | Event Description | Event Fees | Operations |
|---|---|---|---|---|---|
| {{event.eventName | firstLetterCapital }} | {{event.eventCode | lowercase}} | {{event.releaseDate | date:'medium' | uppercase}} | {{event.description | lowercase}} | Cheap Medium Expensive |


PureBasic - Math
Overview
Math library provides basic mathematical functions such as: Cos(), Sin(), Pow(), Log() etc... Almost all these functions work with floats or doubles, i.e. numbers with the .f or .d extensions. If a function is used with a double value as input or output, it will automatically switch to double precision instead of single precision for its calculations.
Command Index
ACos
ACosH
ASin
ASinH
ATan
ATan2
ATanH
Abs
Cos
CosH
Degree
Exp
Infinity
Int
IntQ
IsInfinity
IsNaN
Log
Log10
Mod
NaN
Pow
Radian
Random
RandomData
RandomSeed
Round
Sign
Sin
SinH
Sqr
Tan
TanH
Example
Math.pb
Supported OS
All


CENTER STAGE (director: Nicholas Hytner; screenwriter: Carol Heikkinen; cinematographer: Geoffrey Simpson; editor: Tariq Anwar; cast: Amanda Schull (Jody), Zoe Saldana (Eva), Susan May Pratt (Maureen), Peter Gallagher (Jonathan Reeves), Donna Murphy (Juliette Simone), Debra Monk (Maureen's manipulative mother), Sascha Radetsky (Charlie), Eion Bailey (Jim), Shakiem Evans (Erik), Ethan Stiefel (Cooper), Christine Dunham (Audition Teacher), Karen Shallo (Mother at Audition), Laura Hicks (Nervous Mother), Elizabeth Hubbard (Joan Miller), Ilia Kulik (Sergei), Julie Kent (Kathleen), 2000)
Reviewed by Dennis Schwartz
This is a backstage drama of talented young students trying to be somebody, knowing that only a handful of them will achieve success in their chosen field. They try out for the fictional American Ballet Academy in NYC, hoping to be chosen for a coveted spot in their prestigious workshop program. If successful, three females and three males will be chosen for a dancing spot in the elite American Ballet Company. The story is bogged down with cliches and cardboard characters, while the ballet dancing is the thing of beauty in this film. Most of the dancers are professionals of the highest standards and it shows by their excellent performance. One of them, the film's star, Cooper (Ethan Stiefel), is recognized by most in the field as the best in the world. The framework of the story is the same formula seen in almost every Hollywood sports film, as the art of dancing is only paid lip service to. In fact, if this film wasn't about ballet dancers, it could have been about chorus dancers or football players, and the same trite tale could have been woven. Which shows you how much art mattered. The best reason for seeing the film, is that the dancing is alive and pulsating, choreographed by the likes of Balanchine, Susan Stroman and Christopher Wheeldon, as well as Ivanov and MacMillan. But if you want to see a quality ballet film with a real love story and with the pangs of what goes through an artist, then your best bet is "The Red Shoes (48)."
The story follows a group of these young ballet students, emphasizing their aspirations, their emotional problems, and their athletic stamina to take the rigors of their difficult work. The film is hip to ballet dancers, letting us in on the secret that many of the male dancers are gay, and a straight dancers is much welcomed by the ladies. Many smoke a lot in the hopes of killing their appetites, as weight is something they are all concerned about. And, that they can be easily devasted by criticism of their performance. They also gossip, as well as compete hard, and are jealous of another's success.
All the film characters are made of stock types: the tough teacher who really cares; the unsophisticate who experiences rejection in love and harsh criticism from her teacher, but overcomes these embarrassments; the overeater who gets bounced from the academy; the surly rebel who learns that it is sometimes necessary to conform; and, the bulimic with the pushy mother who confronts her at last. It is was too much effort following all their predictable stories, especially when you know everything is going to be tied up in a nice pink ribbon by the end.
The main story is about Jody (Amanda) and her disappointments and eventual accomplishments, whose parents would rather that she be a freshman in college than dancing in NYC and can't share the joy she has in being accepted to the ABA. Cooper is the star of the company, whose ballerina girlfriend Kathleen married Jonathan (Peter Gallagher), the company's head. On the rebound, he picks up the pretty but insecure Jody and takes advantage of her by taking her to bed and then fluffing her off, but he also gives her a big break and puts her into the new radical ballet he is creating as the guest choreographer for the students' illustrious final exam, a workshop performance before a live audience and a chance for the students to be recognized by all the major professional ballet troupes.
The minor stories were about Sergei (Ilia Kulik-real-life Russian figure skater), a Russian dancer separated by distance from his ballerina girlfriend who out of loneliness picks up a girl in a disco spot by saying he is in the Russian Mafia, because when he tells other girls he meets there that he's in the ballet, they laugh at him. Sascha Radetsky is Charlie, the engaging student dancer from the west, who is the nice boy Jody becomes involved with. Zoe Saldana is Eva Rodriguez, a black Hispanic with an attitude problem, who is a great dancer but must learn obedience. She sasses her teacher (Donna Murphy), comes late to class, chews gum in class, but loves to dance. And then there is Maureen (Pratt), who has been pushed into dance by her overbearing mother, and is considered by the company to have the best technique but no heart in her dancing. She reluctantly meets a college student studying medicine and goes against her mother's wishes by dating him.
This film reminded me a lot of Hollywood's ode to lowbrow culture "Band Wagon," which was much more entertaining.
In Center Stage, there was plenty of dancing at rehearsals and in the two big ballet numbers they put on, before the film comes to its predictable climax for its soap opera stories. The aim of the film was to be entertaining, the art part it dumbed down for mass consumption, though its story could have been worst than it actually was, as it was kept in check from completely taking over the film. What it comes down to, is that the story didn't completely take away from the dance, therefore the film had some mild entertainment value and some sparkle could be detected in the eyes of the students when they were dancing.
REVIEWED ON 6/10/2000 GRADE: C+
Dennis Schwartz: "Ozus' World Movie Reviews"
http://www.sover.net/~ozus
<EMAIL_ADDRESS>© ALL RIGHTS RESERVED DENNIS SCHWARTZ
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Plugin Information |
|---|
View elOyente on the plugin site for more information. |
The current version of this plugin may not be safe to use. Please review the following warnings before use:
This plug-in adds job triggering based on XMPP Pub/Sub events.
Features
This plugin allows Jenkins jobs to:
- Subscribe for XMPP Pub/Sub events, to trigger the job.
- Add filter expressions in XPath notation, to limit the triggering to particular events.
- Extract data from the events with XPath expressions, and make it a vailable as environment variables.
Prerequisites
It is required to set up or to have access to an XMPP server in charge of handling the events and messages. There exist several available servers that could be used. Follow this website to find some examples.
For the development of the plug-in, it has been used Openfire. This sever is quite easy to set up and use. For more information, visit its website, where you can find the installation guide.
Configuration and use
Installation guide
To install ElOyente, just follow these easy steps:
1. Start Jenkins, and once in the dashboard, click on Manage Jenkins
2. Then select Manage Plugins
3. Select the Available tab.
4. Scroll down to the section Build Triggers, there you’ll find ElOyente.
5. After clicking Download and install after restart the plug-in will be installed and ready to be used.
Using the plug-in
Main configuration
In order to set the plug-in to work it is necessary to fill the parameters of the server we are going to use, this is done in the main configuration.
To access the main configuration of Jenkins, click in Manage Jenkins and after that in Configure System.
This will open a menu like the one below, search for the section XMPP job triggering. There you can specify the server address of your XMPP server, a user and a password.
As you can see the interface will give you feedback about the connection and authentication. In the example, as the server is not valid, it cannot connect, and as the user and password are not correct it shows that you are not authenticated.
Once these parameters have been set we are ready to use the plug-in within our projects.
NOTE:: If these values are empty or not correct, still you'll be able to use the plug-in in the projects, but of course the connection won't be created and they won't react to any possible events. You can set the main configuration parameters later and once you click Save, you'll start receiving the XMPP events.
Configuring a job
These are the steps needed to create a job and set up ElOyente plug-in for listening to XMPP events.
First create the job and give it a name, it doesn't matter the type of job you're creating, the plug-in will always be available.
Once created, you'll see the configuration screen, scroll down to the section Triggers, and click on the checkbox labelled as XMPP triggered plug-in to activate it. Then click on Add subscriptions and you are ready to subscribe to the nodes from which you'll receive your events.
Just write on the textbox the name of one of the nodes available in your XMPP server, you can add more nodes if needed, just clicking on Add subscription as many times as you need. In case you need to delete one of the nodes just click on the Delete subscription button on the right side under the subscription you want to delete.
Once you click the Save button the plug-in will be listening for the XMPP events over the nodes you selected. The job will be triggered as soon as you receive an event from those nodes.
NOTE: It is possible to subscribe to nodes that still don't exist, once they are created the plugin will start listening when clicking on the Save button in the configuration of that particular job, or in the Save button of the main configuration.
You can also subscribe several times to the same node in one particular job, in that case a build will be triggered for each of the subscriptions.
Setting up filters
There are 3 types of Pub/Sub systems: topic based, attribute based and content based. Topic based is the easiest, and any Pub/Sub system supports it. El Oyente is designed to put minimal requirements on the messaging infrastructure, but provide fine grained triggering capabilities. As such, El Oyente only uses topic-based subscriptions, but provides client-side filters to have a full content-based Pub/Sub infrastructure.
Under the node subscriptions we see a textbox where you can add a filter for that particular subscription. If empty, the job will be triggered for any event occurring on the selected node. The filter expression allows the job to be triggered only if the event matches a certain criteria. The filter is anexpression in XPath notation, which is applied on the XMPP event. If the expression evaluates to true, the job is triggered. See XEP-0060 for more information about XMPP Pub/Sub.
In the image below you can see a subscription to a node "cocktails", the filter is set so only the cocktails from Spain will trigger the job. When an XMPP message is received it is filtered, if the plug-in finds the tag origin with a value of Spain, the triggered will be fired, in other case, the job will not be triggered.
Using environment variables
The plug-in also allows you to save information from the event into environment variables that can be referred in the rest of the job, you can add as many as you want.
To set an environment variable you must click in the button Add variable and two fields will appear.
The first field tagged as Name lets you choose a name for the variable, this variable can be referred in the rest of the job with the $ operator.
The second field Value selection allows specifying an XPath expression, which will be applied on the XMPP event. The result of this will be used as the value for the environment variable.
In the example it is extracted the name of the cocktail, a list of steps for preparation, an URL that contains the image and a list of ingredients. All this information is extracted from the payload of the XMPP message received and could be used for example to fill an HTML file that shows the cocktail characteristics.
Testing
To test the plugin, the following tool can be used to send XMPP events to a server: xmpp_publisher.
Arguments:
-s <server> -> URL of the XMPP server
-u <username> -> User name to connect to the XMPP server
-p <password> -> Password to connect to the XMPP server
-n <node> -> Name of the node to publish to
-m <message> -> Message to publish
-d -> Enable the debugger
-h -> Show this help
Example:
./run.sh -s beatles.albums.com -u Paul -p Beatles -n Albums -m "<album><name>Abbey Road</name></album>"
Improvements
- Adding dropdown menu for nodes subscriptions with the available nodes in the server
- Giving feedback to the user in the job configuration in case the configuration of the server is not filled or it is not possible to establish the connection.
Attachments:
eloyente-project-config.png (image/png)
image1.png (image/png)
image2.png (image/png)
image3.png (image/png)
image4.png (image/png)
image5.png (image/png)
image6.png (image/png)
image7.png (image/png)
image9.png (image/png)
image11.png (image/png)
image12.png (image/png)
image9.png (image/png)
image10.png (image/png)


Legend
Dashboard
Forum
Profile
PM Inbox
UCP
Forum UCP
Logout
Public Reserves
A Powerful tool for freedom.
Login
Register
Follow #
Tweet
Welcome,
Profile
Messages
RSS
User Control Panel
Logout
Reload your Profile:
Confirm Pin:
Public Profile
User Control Panel


Hello,
Thank you for your interest.
Now is %acco type description% %acco description% in %acco location% available from %period arrival% till %period departure%.
I'm looking foreward to your reply.
Kind regards,
%owner name%
%own website%