7
1 I am very miserable!
I am like someone who is hungry, who searches for fruit to eat
and who finds no grapes or figs to eat
because all the fruit has been picked.
2 Everyone who honored God has disappeared from this land;
not one of them is left.
The people who are left are all murderers;
it is as though everyone is eager to kill his fellow countryman.
3 They do what is evil with all their might.
Government officials and judges all ask for bribes.
Important people tell others what they want,
and they plot together about how to get it.
4 Even the best people are as worthless as briers;
the people who we thought to be the most honest are worse than thornbushes.
But Yahweh will soon judge them.
Now is the time that he will punish people,
when they will be very confused because of it.
5 So do not trust anyone!
Do not trust even a friend;
even be careful what you say to your wife, whom you love.
6 Boys will despise their fathers,
and girls will defy their mothers.
Women will defy their mothers-in-law.
Your enemies will be those who live in your own house.
7 As for me, I wait for Yahweh to help me.
I confidently expect that God, my Savior, will answer me when I pray.
8 You who are our enemies,
do not gloat about what has happened to us,
because even if we have experienced disasters,
those disasters will end, and we will be prosperous again.
Even if it is as though we are sitting in the darkness,
Yahweh will be our light.
9 We must be patient while Yahweh punishes us
because we have sinned against him.
But later, it will be as though he will go to court and defend us.
He will make sure that the judge makes a right decision about us.
It will be as though he will bring us out into the light,
and we will see him rescue us.
10 Our enemies will also see it, and they will be disgraced
because they ridiculed us, saying
"Why is Yahweh, that God of yours, not helping you?"
But with our own eyes we will see them be defeated;
we will see them trampled
like mud in the streets.
11 You people of Israel, at that time your cities will be rebuilt,
and your territory will become larger.
12 Your people will come back to you from many countries,
from Assyria, from near the Euphrates River in the east, and from Egypt in the south,
from the Dead Sea to the Mediterranean Sea,
and from many mountains.
13 But the other countries on the earth will become desolate
because of the evil deeds that their people have done.
14 Yahweh, protect your people as a shepherd protects his sheep with his staff.
Lead the people whom you have chosen to belong to you.
Even though some of them live by themselves in a forest,
give them the fertile pastureland
in the regions of Bashan and Gilead,
which they possessed long ago.
15 Yahweh says,
"Yes, I will perform miracles for you
like the miracles that I performed when I rescued your ancestors from being slaves in Egypt."
16 People from many nations will see what Yahweh does for you,
and they will be ashamed
because they do not have any power.
They will put their hands over their mouths and their ears because they will be very amazed at what Yahweh does.
They will not be able to say anything or hear anything, because they will be terrified.
17 Being very humiliated, they will crawl on the ground like snakes.
They will come out of their homes trembling
and stand to honor Yahweh our God.
They will be very afraid of him
and will tremble in front of him.
18 Yahweh, there is no God like you;
you forgive the sins that the people who have survived committed,
the people who belong to you.
You do not remain angry forever;
you are very happy to show us that you faithfully love us.
19 You will again act kindly toward us.
You will get rid of the scroll on which you have written the sins that we have committed,
as though you were trampling it under your feet
or throwing it into the deep ocean.
20 You will show that you faithfully do what you promised for us and faithfully love us,
just as you solemnly promised long ago to our ancestors Abraham and Jacob that you would do.


See getting started for a complete setup.
Steps to get started:ngbDropdownModule
(if you're not including ngbModule
)This component is meant to be used together with @sebgroup/bootstrap and in order for the component to get the correct appearance you need to import styles from @sebgroup/bootstrap files to your project.
Below is an example of how you can use the ng-bootstrap dropdown as a dropdown select by wrapping it in a component that implements ControlValueAccessor
.
Selected: {{selectForm.get('selection').value | json}}
Below is an example of how you can use the ng-bootstrap dropdown as a multi select by wrapping it in a component that implements ControlValueAccessor
.
Selected: {{multiSelectForm.get('multiselect').value | json}}


Sublime is Awesome
I feel sublime text is the most versatile and awesome editor for
writing code and in general for any type of text (including markdown
).
Why I love it
Small setup
size ~5 MB.
- Works seamlessly across
different platforms
Windows/Mac/Linux.
themes
which are easy on eye.
- Supports syntax highlighting for most of languages out of Box.
- Has built in spell check functionality.
- Multiple Cursors. Instead search/replace, select replace multiple occurrences once.
- Quick searching (based on indexes) of filenames, symbols, contents etc.
- Rich set of Plugins and Settings.
- Excellent support for editing Markdown files via this plugin.
- Supports even GFM (GitHub flavored Markdown) syntax.
- Has key-bindings for adding different markdown entities.
So all-in-all Sublime Text
is a must tool for any developer!


Before we start our tutorial, it is important to understand a SoS script can be executed from command line in batch mode, or interactively in Jupyter notebook. This tutorial is written in Jupyter but you can execute the scripts in batch mode if you save them to disk and execute them using command sos run
or sos-runner
. There are some minor differences in executing scripts in these modes so the following cell turns on more output (-v2
), change default signature mode to default
(-s default
), and turn off automatic output preview (%preview --off
). It then creates some empty files as input files of the sample workflows and remove existing runtime signatures by executing some shell commands (!cmd
). Please refer to Chapter Notebook Interface of the SoS documentation if you would like to learn more about them.
%set -v2 -s default
%preview --off
!touch mutated.fastq control.fastq ctrl.fastq case.fastq
!cp STAR Rscript ~/.sos/bin/
!sos remove --signature -v 0
Let us assume that you are a bioinformaticist needed to compare the expression levels between two samples. You can use a Jupyter notebook with SoS kernel to perform the analysis using different script, the trick here is to select the right kernel for each cell. For example, you can run the following cell in bash if you choose bash
as the kernel.
# index reference genome
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
# align reads to the reference genome
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
The first command builds an index of the reference genome in preparation for the latter steps, the second command aligns reads from the first sample to the reference genome, and the third command aligns reads from the second sample to the reference genome. Do not panic if you do not know what these commands are doing, this is just an example.
These commands generate, among other files, two files named aligned/control.out.tab
and aligned/mutated.out.tab
with expression counts of all genes. You then wrote a R script to analyze the results, something like
control.count <- read.table('aligned/control.out.tab')
mutated.count <- read.table('aligned/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
It is nice to run scripts in different langauges and record results in a notebook script, but the above example is not much different from running two separate scripts from command line. Because different steps of data analysis are naturally connected, it would be good to share information among them. This can be achived by passing (Python) variables defined in the SoS kernel to the subkernels.
For example, if we define the directory for STAR
index and align output,
INDEXDIR = 'STAR_index'
ALIGNDIR = 'aligned'
we can pass the variable to subkernels through string interpolation, which replaces expressions enbraced by ${
and }
with the values. For example, the shell script could be written as
# index reference genome
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir ${INDEXDIR}
# align reads to the reference genome
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix ${ALIGNDIR}/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix ${ALIGNDIR}/mutated
where expressions such as ${align_dir}
are replaced with their values before the script is interpreted by bash. Similarly, the R script could make use of varialbe align_dir
.
control.count <- read.table('${ALIGNDIR}/control.out.tab')
mutated.count <- read.table('${ALIGNDIR}/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
SoS accepts and expands python format specification and conversion operators and allows you convert and format the result of expressions. Please refer to SoS Syntax for details.
String interpolation is useful for composing scripts to be executed by subkernels, but it would be awkward to pass a large amount of information in this way, and it disallows passing information among subkernels.
SoS provides a few magics
to faciliate data exchange among subkernels. For example, the %get
magic retrieves information from the SoS kernel to a subkernel, so your shell script could be written as:
%get INDEXDIR ALIGNDIR
# index reference genome
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir $INDEXDIR
# align reads to the reference genome
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix $ALIGNDIR/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix $ALIGNDIR/mutated
after retriving INDEXDIR
and ALIGNDIR
from the SoS kernel and create two native shell variables INDEXDIR
and ALIGNDIR
. Similarly, your R script could be written as
%get ALIGNDIR
control.count <- read.table(paste0(ALIGNDIR, '/control.out.tab'))
mutated.count <- read.table(paste0(ALIGNDIR, '/mutated.out.tab'))
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
The subkernels are persistent so the passed variables can be used in later cells using the same kernel, for example, variable ALIGNDIR
can be used in the Bash kernel in new commands as follows:
echo Align directory is $ALIGNDIR
Note that SoS magics and multiple live subkernels are only supported by Jupyter notebook and cannot be used in SoS batch mode.
The project completed successfully and you needed to archive the scripts for later reference. The Jupyter notebook is a perfect format to record both the commands and the results. However, if you would like to only save the steps of your analysis, you can save the notebook in .sos
format (File
->Download As
->.sos
) or copy/paste the commands to a single SoS script named myanalysis.sos
, with content
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
run:
# index reference genome
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
# align reads to the reference genome
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
R:
control.count <- read.table('aligned/control.out.tab')
mutated.count <- read.table('aligned/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
Here run
and R
are SoS actions that executes the following scripts in bash
and R
respectively. The scripts are included verbatim and end after reaching another SoS action or directive. For the sake of time, we created fake STAR
and R
commands that simply states the file generated.
The script is executed in Jupyter when the notebook (this documentation) is executed. In command line, you would need to run the script using command
% sos run myscript
or
% myscript.sos
if you make myscript.sos
executable (by running chmod +x myscript.sos
.
As you can see, this sos script simply executes the embedded shell and R script and generates the four output files.
Although it is convenient to embed scripts verbatim, it is often clearer to indent the script and write your SoS script as:
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
run:
# index reference genome
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq\
--genomeDir STAR_index
# align reads to the reference genome
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
# compare expression values
R:
control.count <- read.table('aligned/control.out.tab')
mutated.count <- read.table('aligned/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
The scripts in this case end with the end of indentation so that you can add some comments for the R
script without being considered as part of the previous script. The script works identically to the one without indentation.
Because the scripts perform different tasks, it is logically clearer to separate them into different steps. Actually, because the first reference-generating command is not a data processing step, it makes sense to separate it into two scripts. Now we can insert step headers to the script as follows:
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
[1]
# index reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[2]
# align reads to the reference genome
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
[3]
# compare expression values
R:
control.count <- read.table('aligned/control.out.tab')
mutated.count <- read.table('aligned/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
Now, when you execute the script with command
sos run myscript
SoS will display default_1
, default_2
and default_3
to report progress. The comments after section heads are considered step comments and will also be displayed during execution.
It is worth noting that you can write SoS workflows in Jupyter notebook as long as you specify a header for each step. For example, you can create a Jupyter notebook with the following cells
[1]
# index reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[2]
# align reads to the reference genome
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn control.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn mutated.fastq --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
[3]
# compare expression values
R:
control.count <- read.table('aligned/control.out.tab')
mutated.count <- read.table('aligned/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
and execute the workflow with command
sos run myscript.ipynb
The notebook can contain markdown cells and cells with other kernels, and sos cells without section header, and the sos run
(and other) commands will ignore all such cells and only extract and execute workflows defined in the notebook.
After a while, before you almost forgot about this analysis, you needed to analyze another pair of samples. You could copy myanalysis.sos
to myanalysis2.sos
, change filenames and run it, but an easier way is to change your SoS file to accommodate other input files. This can be done by defining a command line argument and passing files name to a SoS variable:
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
# Two input files in .fastq formats. The first one for control sample
# and the second one for mutated sample.
parameter: fastq_files=['control.fastq', 'mutated.fastq']
[1]
# index reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[2]
# align reads to the reference genome
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${fastq_files[0]} --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${fastq_files[1]} --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
[3]
# compare expression values
R:
control.count <- read.table('aligned/control.out.tab')
mutated.count <- read.table('aligned/mutated.out.tab')
# normalize, compare, output etc, ignored.
pdf('myfigure.pdf')
# plot results
dev.off()
A command line argument fastq_files
is defined in with parameter
keyword. With this definition, you can pass two filenames to variable fastq_files
from command line
sos run myanalysis --fastq_files ctrl.fastq case.fastq
${fastq_files[0]}
and ${fastq_files[1]}
in command STAR --genomeDir ...
will be replaced with their values before the commands are executed. Here fastq_files[0]
and fastq_files[1]
are Python expressions that will be evaluated during execution.
In Jupyter notebook, we can execute the previous cell with additional option using magic %rerun
.
%rerun --fastq_files ctrl.fastq case.fastq
Note that the parameter
statement is defined before any SOS step, actually in a special [global]
section although the section is usually ignored in .sos
format.
Although the SoS script now accepts command line arguments, it is still no more than a compilation of scripts and you immediately realized that it is a waste of time to execute the first command each time. To solve this problem, you can convert the SoS script to a real workflow by telling SoS the input and output of each step:
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
# Two input files in .fastq formats. The first one for control sample
# and the second one for mutated sample.
parameter: fastq_files=['control.fastq', 'mutated.fastq']
[1]
# create a index for reference genome
output: 'STAR_index/chrName.txt'
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[2]
# align the reads to the reference genome
input: fastq_files
depends: 'STAR_index/chrName.txt'
output: ['aligned/control.out.tab', 'aligned/mutated.out.tab']
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${input[0]} --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${input[1]} --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
[3]
# compare expression values
output: 'myfigure.pdf'
R:
control.count <- read.table('${input[0]}')
mutated.count <- read.table('${input[1]}')
# normalize, compare, output etc, ignored.
pdf('${output}')
# plot results
dev.off()
Here we
${input[0]}
and ${input[1]}
in step 2 and 3 because these steps now have properly-defined input
. This variable is defined by step input as the input file of the step.With such information, when you run the same command with another set of input file
sos run myanalysis --input ctrl.fastq case.fastq
SoS will ignore step 1 if this step has been run with output STAR_index/chrName.txt
. The same happens to step 2 and 3 so all steps will be ignored if you run the script repeatedly with the same input and processing scripts. SoS uses runtime signature for each step and will re-run the step if and only if the content or filename of input, output files or the processing scripts are changed.
%rerun --fastq-files ctrl.fastq case.fastq
An added benefit of specifying input and output of steps is it allows you to create an archive of your project with all input, output, and intermediate files. This can be achived using command
% sos pack -o myanalysis.sar
if only one workflow has been executed under the current directory. The output is a compressed archive with extension .sar
and can be examined and unpacked using command sos unpack
.
Instead of using runtime signature to avoid re-running the first step, we can also make step 1 an optional step that will be executed only necessary. That is to say, we can define this step as an auxiliary step
that will only be called when the file it provides does not exist.
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
# Two input files in .fastq formats. The first one for control sample
# and the second one for mutated sample.
parameter: fastq_files=['control.fastq', 'mutated.fastq']
[build_index: provides='STAR_index/chrName.txt']
# create a index for reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[1]
# align the reads to the reference genome
input: fastq_files
depends: 'STAR_index/chrName.txt'
output: ['aligned/control.out.tab', 'aligned/mutated.out.tab']
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${input[0]} --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${input[1]} --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
[2]
# compare expression values
output: 'myfigure.pdf'
R:
control.count <- read.table('${input[0]}')
mutated.count <- read.table('${input[1]}')
# normalize, compare, output etc, ignored.
pdf('${output}')
# plot results
dev.off()
The new script consists of two steps, and an auxiliary step build_index
that will only be executed when STAR_index/chrName.txt
is not available. A slight difference between this version and the previous one is that while the previous version will always execute the first step, this version will not execute it if STAR_index/chrName.txt
has been generated before in any way, perhaps not by SoS.
%rerun
The first step will takes a long time to execute. Instead of executing them by SoS, you might want to submit the commands to a job-queue and be executed and monitored externally. This is especially useful when you need to execute multiple SoS workflows on a cluster-based system. Without going through the details on how to set up your job-queue (see another tutorial for details), it is almost trivial to modify your script to define part of a step process to a task:
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
# Two input files in .fastq formats. The first one for control sample
# and the second one for mutated sample.
parameter: fastq_files=['control.fastq', 'mutated.fastq']
[build_index: provides='STAR_index/chrName.txt']
# create a index for reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[1]
# align the reads to the reference genome
input: fastq_files
depends: 'STAR_index/chrName.txt'
output: ['aligned/control.out.tab', 'aligned/mutated.out.tab']
task:
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${input[0]} --quantMode GeneCounts \
--outFileNamePrefix aligned/control
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${input[1]} --quantMode GeneCounts \
--outFileNamePrefix aligned/mutated
[2]
# compare expression values
output: 'myfigure.pdf'
R:
control.count <- read.table('${input[0]}')
mutated.count <- read.table('${input[1]}')
# normalize, compare, output etc, ignored.
pdf('${output}')
# plot results
dev.off()
As you can see, the only difference is the insertion of task:
directive before run
. Now, when you execute the command, the STAR
commands will be executed externally and you can monitor the status of the jobs using your web browser. If no job-queue is set up, the command will be executed in a separate process.
Although the two steps of this example have to be executed sequentially, the first step runs the STAR
command twice on two input files, and can be executed in parallel. You can tell this to SoS by modifying the script as follows
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
# Two input files in .fastq formats. The first one for control sample
# and the second one for mutated sample.
parameter: fastq_files=['control.fastq', 'mutated.fastq']
[build_index: provides='STAR_index/chrName.txt']
# create a index for reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[1]
# align the reads to the reference genome
sample_type = ['control', 'mutated']
input: fastq_files, group_by='single', paired_with='sample_type'
depends: 'STAR_index/chrName.txt'
output: "aligned/${_sample_type}.out.tab"
task: concurrent=True
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${_input!q} --quantMode GeneCounts \
--outFileNamePrefix aligned/${_sample_type}
[2]
# compare expression values
output: 'myfigure.pdf'
R:
control.count <- read.table('${input[0]}')
mutated.count <- read.table('${input[1]}')
# normalize, compare, output etc, ignored.
pdf('${output}')
# plot results
dev.off()
Here we
group_by='single'
to pass input one by one to action. The action will be executed twice with _input
set to the first and second input file respectively.sample_type
and pair it with input files (option paired_with
). This will generate a variable _sample_type
for each input file so _sample_type
will be control
for the first input file, and mutated
for the second.${_input}
and ${_sample_type}
to define partial output
.${_input!q}
instead of ${_input}
in the script. This is a small trick to shell-quote filenames so that filenames with spaces and other special characters can be properly quoted in shell commands.Now, if you execute the script with option -j 2
(2 concurrent processes),
sos run myanalysis.sos --input control1.fastq control2.fastq -j 2
the second step submit two jobs to job-queue, or execute them in two separate processes if a job-queue is not setup.
In addition to functions such as run
and R
that execute scripts in different languages, SoS provides a number of other functions (called actions) that can be used to, for example, generate reports using command pandoc
or Rmarkdown
. For example, by adding a step with a pandoc
action, you can compose a script in Markdown format and generate a nice-looking report in HTML format.
%preview report.html
#!/usr/bin/env sos-runner
#fileformat=SOS1.0
# This script aligns raw reads of a control and a mutated sample
# to the reference genome and compare the expression values
# of the samples at genes A, B and C.
# Two input files in .fastq formats. The first one for control sample
# and the second one for mutated sample.
parameter: fastq_files=['control.fastq', 'mutated.fastq']
[build_index: provides='STAR_index/chrName.txt']
# create a index for reference genome
run:
STAR --runMode genomeGenerate --genomeFastaFile human38.fastq \
--genomeDir STAR_index
[1]
# align the reads to the reference genome
sample_type = ['control', 'mutated']
input: fastq_files, group_by='single', paired_with='sample_type'
depends: 'STAR_index/chrName.txt'
output: "aligned/${_sample_type}.out.tab"
run:
STAR --genomeDir STAR_index --outSAMtype BAM SortedByCoordinate \
--readFilesIn ${_input!q} --quantMode GeneCounts \
--outFileNamePrefix aligned/${_sample_type}
report: output='align.md', active=-1
## Alignment of reads
* input file: ${input}
* output file: ${output}
[2]
# compare expression values
output: 'myfigure.pdf'
R:
control.count <- read.table('${input[0]}')
mutated.count <- read.table('${input[1]}')
# normalize, compare, output etc, ignored.
pdf('${output}')
# plot results
dev.off()
report: output='analysis.md', active=-1
## Statistical analysis
* input file: ${input}
* Figure: ${output}
[3]
pandoc: input=['align.md', 'analysis.md'], output='report.html'
# An analysis of two RNA Seq samples
In this example, partial reports are prepared whenever a step completes, and a final step is used combine all partial reports (with a header) and process it with pandoc.
Please refer to the report generation tutorial for details.
We have showed you multiple versions of the same SoS script, each using more features of SoS. This actually demonstrates one of the advantages of the SoS system, namely you can start using SoS in minutes without knowing any of its advanced features, and gradually improve your script if needed.


src/dragon.js
'use strict'
/**
* Polyfills
*
* @ignore
*/
import '../lib/polyfills/element.remove'
import '../lib/polyfills/node.prependchild'
import '../lib/polyfills/nodelist.queryselectorall'
import '../lib/polyfills/nodelist.remove'
import '../lib/polyfills/Array.from'
import Application from './dragon/application'
import Collection from './dragon/collections'
import CollectionView from './dragon/views/collection-view'
import Component from './dragon/components'
import Controller from './dragon/controllers'
import Dispatcher from './dragon/router/dispatcher'
import EventEmitter from './dragon/events'
import Mediator from './dragon/mediator'
import Model from './dragon/models'
import Router from './dragon/router'
import Store from './dragon/models/store'
import Utils from './dragon/utils'
import View from './dragon/views'
var Dragon = {
//Composer : require('./dragon/composition/composer'),
//Composition : require('./dragon/composition/composition'),
//mediator : require('./dragon/mediator/mediator'),
//Layout : require('./dragon/views/layout'),
//SyncMachine : require('./dragon/models/syncMachine'),
Application,
Collection,
CollectionView,
Component,
Controller,
Dispatcher,
EventEmitter,
Mediator,
Model,
Router,
Store,
Utils,
View
}
export {Application}
export {Collection}
export {CollectionView}
export {Component}
export {Controller}
export {Dispatcher}
export {EventEmitter}
export {Mediator}
export {Model}
export {Router}
export {Store}
export {Utils}
export {View}
export default Dragon


Hi! I'm Sierra. I'm a student at Montana State University, Bozeman, studying computer engineering. I love learning, and in my free time I create projects that help me explore the world of computing. I enjoy application and embedded system programming, 3-D modelling, circuit board design and much more!


Nokia 7.2 receiving November Security update 2019 now
by NayanNokia 7.2 has started receiving the November Android Security update 2019 in many markets. These are the first Nokia smartphones to receive the November security patch. Check below for the update size, list of markets and the update changelog.
For all software update news related to other Nokia smartphones click here.
On the basis of tips received from our readers, we will collate a list of markets for the Nokia 7.2 for which November Security update is now available. So, do let us know if you have received the update in the comments section. You can also try the VPN trick for getting the update and see if it works.
List of markets:
- Nokia 7.2 in India
Nokia 7.2 November update size:
The update size for Nokia 7.2 is 68.5 MB in size. You will either be prompted to download this update or you can check by going to Settings and searching system updates and then by checking for the update.
Nokia 7.2 November Security update changelog:
The changelog only mentions the November Android Security update for Nokia 7.2. The most severe of these issues is a critical security vulnerability in the System component that could enable a remote attacker using a specially crafted file to execute arbitrary code within the context of a privileged process.
Read the complete details of the November Security update here.
HMD has been quite consistent in terms of releasing Monthly Security updates and OS updates for Nokia smartphones already available in the market. HMD has also made it clear that all Nokia Android Phones will receive a minimum of two years of OS update support.
Thanks, Kavi, Krishna & Lokesh for the tip & screenshot. Cheers!!


Matching Game
3
Moves
00:00
You Won !!
Moves :
0
Your time :
00:00
You scored :
Play again ??
Close.


网站首页
搜索
所有博文
博文分类
关于本网站
Chemical Crystallography: An Introduction to Optical and X-Ray Methods
作者：
C. W. Bunn
分类：
化学 - 应用化学 - 固态化学
出版商：Oxford at the The Clarendon Press
语言：英语
百度盘直接下载
书籍目录
Introduction survey
The shapes of crystals
The optical properties of crystals
Identification of transparent crystals under the microscope
Identification by X-Ray powder photographs
Determination of unit cell dimensions
Determination of the positions of the atoms in the unit cell by the method of trial and error
书籍简介
本书pdf是文字识别版，影印质量一般 。
Introduction survey
The shapes of crystals
The optical properties of crystals
Identification of transparent crystals under the microscope
Identification by X-Ray powder photographs
Determination of unit cell dimensions
Determination of the positions of the atoms in the unit cell by the method of trial and error


JavaScript is disabled on your browser.
Skip navigation links
Package
Class
Use
Tree
Deprecated
Index
Help
Prev
Next
Frames
No Frames
All Classes
A
C
D
E
I
S
T
U
A
AwsClientsTest
- Class in
com.github.davidmoten.rx2.aws
AwsClientsTest()
- Constructor for class com.github.davidmoten.rx2.aws.
AwsClientsTest
C
com.github.davidmoten.rx2.aws
- package com.github.davidmoten.rx2.aws
D
deleteMessageFromFactoryWhenS3FactoryExists()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
E
ensureIfSendToSqsFailsThatS3ObjectIsDeleted()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
I
isUtilityClass()
- Method in class com.github.davidmoten.rx2.aws.
AwsClientsTest
isUtilityClass()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
isUtilityClass()
- Method in class com.github.davidmoten.rx2.aws.
UtilTest
S
s3IdAndS3FactoryConflictThrowsException()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
shutdownDoesNotRethrowException()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
shutdownOfSqsAndS3FactoryCreatedClientsOccursWhenS3DeleteObjectFails()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
SqsMessageTest
- Class in
com.github.davidmoten.rx2.aws
SqsMessageTest()
- Constructor for class com.github.davidmoten.rx2.aws.
SqsMessageTest
SqsQueueTest
- Class in
com.github.davidmoten.rx2.aws
SqsQueueTest()
- Constructor for class com.github.davidmoten.rx2.aws.
SqsQueueTest
SqsTest
- Class in
com.github.davidmoten.rx2.aws
SqsTest()
- Constructor for class com.github.davidmoten.rx2.aws.
SqsTest
T
test()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
testBucketNameAndS3FactoryMustBothBeSpecified()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testCanUseNewAwsBuildersInFactoryMethods()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testClientFromFactory()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
testClientFromSourceFailsThenFailsOverToFromFactory()
- Method in class com.github.davidmoten.rx2.aws.
SqsMessageTest
testConstructorMandatoryArguments1()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testConstructorMandatoryArguments2()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testConstructorMandatoryArguments3()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testConstructorMandatoryArguments4()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testConstructorMandatoryArguments5()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testFirstCallToReceiveMessagesReturnsNoMessagesThenSecondCallReturnsTwoMessages()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallToReceiveMessagesReturnsOneMessage()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallToReceiveMessagesReturnsOneMessageAndHonoursBackpressure()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallToReceiveMessagesReturnsOneMessageUsesAccountId()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallToReceiveMessagesReturnsOneMessageUsingIoScheduler()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallToReceiveMessagesReturnsOneViaS3()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallToReceiveMessagesReturnsOneWithNoS3ObjectAndOneWithS3Object()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFirstCallWithQueueUrl()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testFromQueueName()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testFromQueueNameAndAccountId()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testFromQueueUrl()
- Method in class com.github.davidmoten.rx2.aws.
SqsQueueTest
testPollEvents()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testPollEventsIfPostPollThrows()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testPollEventsIfPrePollThrows()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testPollEventsIfSupplierThrows()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testPollingReturnsAllAvailableMessagesAtEachScheduledCall()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testReadAndCloseWhenException()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
tests3()
- Method in class com.github.davidmoten.rx2.aws.
AwsClientsTest
testSendMessage()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testSendMessageWithHeaders()
- Method in class com.github.davidmoten.rx2.aws.
SqsTest
testShutdownS3()
- Method in class com.github.davidmoten.rx2.aws.
UtilTest
testSqs()
- Method in class com.github.davidmoten.rx2.aws.
AwsClientsTest
testUncheckedCall()
- Method in class com.github.davidmoten.rx2.aws.
UtilTest
testUncheckedCallThrowsCheckedException()
- Method in class com.github.davidmoten.rx2.aws.
UtilTest
testUncheckedCallThrowsError()
- Method in class com.github.davidmoten.rx2.aws.
UtilTest
testUncheckedCallThrowsRuntimeException()
- Method in class com.github.davidmoten.rx2.aws.
UtilTest
U
UtilTest
- Class in
com.github.davidmoten.rx2.aws
UtilTest()
- Constructor for class com.github.davidmoten.rx2.aws.
UtilTest
A
C
D
E
I
S
T
U
Skip navigation links
Package
Class
Use
Tree
Deprecated
Index
Help
Prev
Next
Frames
No Frames
All Classes
Copyright © 2016–2021. All rights reserved.


Joe Biden hints at female VP — but can’t remember any prospects’ names
by Mary Kay LingeWhat’s in a name?
Democratic presidential candidate Joe Biden has at least four women in mind as potential running mates — but had a hard time remembering their names when an Iowa voter asked him Friday who he would choose.
“You. Are you available?” the former vice president joked to a woman in Winterset, Iowa, the Des Moines Register reported.
Biden then ran through a list of four prominent Democrats — without using any of their names.
“The former assistant attorney general who got fired who was just in Delaware,” he began, an apparent reference to Sally Yates, who President Trump fired in 2017 when she refused to enforce his travel ban.
“The leader of the, uh, the woman who should’ve been the governor of Georgia, the African American woman,” he continued — meaning Stacey Abrams, who lost a governor’s race in 2018.
“The two senators from the state of New Hampshire,” he concluded. That would be Democratic Sens. Jeanne Shaheen and Maggie Hassan.
Abrams, who was touted as a potential presidential candidate but declined to run, is widely seen as a top veep prospect in 2020. Yates, Shaheen, and Hassan have not been cited as potential running mates before now.
“I mean, there’s an enormous number of qualified people,” Biden said.


Danfeng Shan (单丹枫) is an assistant professor at School of Computer Science and Technology, Xi'an Jiaotong University. He received his Ph.D. degree from Department of Computer Science and Technology, Tsinghua University in 2018, and the B.E. degree from Department of Computer Science and Technology from Xi'an Jiaotong University in 2013. His research interests include data center networking and congestion control.
Room 6076, Hongli Building, iHabour, Xi'an, Shaanxi, 710049, China.
E-mail: or
| Spring 2021 | Computer Organization |


Adding new place please
Add new place name
what is the max nunber of customers
what is the min nunber of customers
what is the avg nunber of cookies Per hour


Performance Dashboards are likely to be used by many people, including:
If you’re a government service manager, you can see how your service is doing by using a Performance Dashboard. A dashboard lets you quickly spot problems with your service so you can take action to improve it.
You need to integrate your service with a Performance Dashboard to:
You can contact the Performance Platform team if you need technical help connecting your service to a Performance Dashboard.
The Performance Dashboards are just another way the government is opening up data to the public.
If you’re a service manager, you may be concerned about presenting facts about how your service is doing so openly. In general the novelty of open data has worn off. There is nothing sensational about seeing how many people are satisfied with a government service, or how many people completed an application.
The data in the dashboards is also anonymous.
You can easily get a Performance Dashboard if you’re responsible for a government service. Just email<EMAIL_ADDRESS>to start.
Every Performance Dashboard must measure a service according to how:
You can choose from a list of other ways a service can be measured – eg its availability or how much help people need when using it.
If you want a different measurement that is not on the list, email the Performance Platform team. The team will assess whether it’s possible for a dashboard to measure your service this way. They will then help you display the measurement on the dashboard.
After you have decided how your service will be measured, you will need to think about how the dashboard will display the information, eg whether this will be in a graph or table form.
There are 3 ways data can be put into a dashboard:
So far 97 government services have dashboards, with more coming soon.
The Performance Platform team will also continue to work with government departments to:
New dashboard features are on the way.
People will soon be able to download data from the dashboards. Service managers will be able to sign up for alerts to be told by email or text if there are any big changes in how their service is used.


TEs Ditka, Newsome, Winslow finalists for All-Time Team
by The Associated PressHall of Famers Mike Ditka, Ozzie Newsome and Kellen Winslow are among the tight ends selected as finalists for the NFL’s All-Time Team.
The league on Monday revealed 12 tight ends — Dallas’ Jason Witten is the only active one — and 40 offensive linemen. Those numbers will be pared down by a 26-member panel to five tight ends, seven tackles, seven guards and four centers.
The current list is loaded with Canton inductees, including such tackles as Dan Dierdorf, Art Shell and Anthony Munoz; guards Jim Parker, Bruce Matthews and John Hannah; and centers Jim Ringo, Jim Otto and Mike Webster.
The finalists, in alphabetical order by position:
TIGHT ENDS
Dave Casper
Ike Ditka
Antonio Gates
Tony Gonzalez
Rob Gronkowski
Ron Kramer
John Mackey
Ozzie Newsome
Charlie Sanders
Shannon Sharpe
Kellen Winslow
Jason Witten
TACKLES
Bob Brown
Roosevelt Brown
Lou Creekmur
Dan Dierdorf
Forrest Gregg
Cal Hubbard
Walter Jones
Ron Mix
Anthony Munoz
Jonathan Ogden
Orlando Pace
Willie Road
Art Shell
Bob St. Clair
Joe Thomas
Ron Yary
GUARDS
Larry Allen
Joe DeLamielleure
Dan Fortman
John Hannah
Jerry Kramer
Larry Little
Tom Mack
Bruce Matthews
Randall McDaniel
Mike Michalske
Mike Munchak
Jim Parker
Will Shields
Dick Stanfel
Gene Upshaw
CENTERS
Dermontti Dawson
Mel Hein
Jim Langer
Jim Otto
Jim Ringo
Dwight Stephenson
Mike Tingelhoff
Clyde “Bulldog” Turner
Mike Webster
___
More AP NFL: https://apnews.com/NFL and https://twitter.com/AP_NFL
The Associated Press


{% load i18n %}
{% trans "Name length should be less than 255 chars." %}
{% trans "A image name is required." %}
{% trans "Description length should be less than 1024 chars." %}
{% trans "A too big image might cause timeout, so you might want to upload a big image via CLI" %} {# {% trans "Too big image may cause timeout, you can upload it on cmd" %} #}
{% trans "URL is required." %}
{% trans "A too big image might cause timeout, so you might want to upload a big image via CLI" %}
{% trans "File is required." %}
{% trans "Minimum Disk must be in 0~1000GB." %}
{% trans "Minimum Ram must be in 0~2097152MB." %}


ALMOST FAMOUS
Reviewed by Harvey Karten DreamWorks Pictures Director: Cameron Crowe Writer: Cameron Crowe Cast: Patrick Fugit, Billy Crudup, Jason Lee, Frances McDormand, Anna Paquin, Fairuza Balk, Noah Taylor, Philip Seymour Hoffman
Sex, drugs, rock 'n' roll. Burhanuddin Rabbani understands the power of this troika, which is why he keeps his Taliban morals squad combing Kabul with whips and chains to take care of any woman who dares show her left eyebrow in public, keeps an ear out for degenerate music, and may not be too sure that coffee is not the Devil's brew. The picture of America imprinted on Rabbani's brain like a tattoo on a with-it American girl's ankle could be that of the bygone era in which the beards sported by our country's youth symbolized anything but the religious fanaticism of today's fundamentalists.
Where have those liberated times of the late sixties and early seventies gone now that the cell phone is our country's soundtrack, the personal computer the hallucinogen of choice, and Wall Street replaces the sack as the instrument of getting off? No wonder that Cameron Crowe's autobiographical character in "Almost Famous," William Miller (played by the heretofore unknown Patrick Fugit), could keep not a semblance of objectivity when asked to write an unbiased journal article about the fictitious rock group known as Stillwater.
Cameron Crowe, whose blockbuster hit "Jerry Maguire" dealt with a sportscaster's crisis of conscience, takes on a similar theme with this work. This time a 15-year-old kid, asked write objectivley about a rock band in 1973, must tackle his guilt as he decides to cast aside a journalist's detachment and replace neutrality with passionate partisanship. In the role of a 15-year-old prodigy about to graduate from high school, the bright, curious, eager William Miller (Patrick Fugit) is assigned by a second-tier magazine to knock out an article about the explosive rock scene during the still robust days of student rebellions a couple of years before the U.S. withdrew its forces from Vietnam. A virgin in many ways--never been kissed, never been out of San Diego, not the sort to fit in with the regular guys in his high school, William is full of anxieties and excitement as he tries to get through the back door of a Black Sabbath rock concert but is shunted aside as a novice. But when he suddenly impresses members of the band with his knowledge of their background, Russell Hammond (Billy Crudup) and Jeff Bebe (Jason Lee) invite him to join them backstage. Fortuitously gaining an assignment from Rolling Stone magazine editor Ben Fong- Torres (Terry Chen) and smitten by Russell's adorable mistress Penny Lane (Kate Hudson), William gets far more than he bargained for. Not only does he capture the spirit of this effervescent but occasionally confrontational group with their women followers (known as band-aids because they serve as the group's muse): he joins them on their nationwide bus tour as they knock the crowds dead wherever they perform, gets as intimate a view as is possible for a non- member of the players, and is introduced, wide-eyed as a pug in heat, to a bevy of women just a couple of years older than he. All the while he is pursued by a profusion of phone calls from his stern but loving mom, Elaine (Frances McDormand) whose way of saying "I love you" is her repeated mantra, "Don't take drugs."
Though the band is seen through William's eyes, the face that decks the posters on almost every bus in New York City is that of Kate Hudson, who performs in the role of Penny Lane, who is captivated by Russell and uses the 15-year-old William as a liaison between her and her main man. Teased and bewitched by this lovable beauty--who even playfully urges him to join her on a trip to Morocco--William is all but ready to sell out and to write a puff piece about his experiences rather than a take-no-prisoners account of the ensemble's vehement in-fighting and marital infidelities.
"Almost Famous" is an enticing surprise, a major studio release coming on the heels of a summer of the usual dumbed-down Hollywood rubbish. Splashy, loud, and full of itself, Cameron Crowe's autobiographical coming-of-age film looks more like a beautifully photographed, gloriously scored, effectively realized project that could win the affections of both the popcorn set and fans of the loosely-structured panoramas of a Robert Altman. Though admittedly a stretch, "Almost Famous" is this year's "Nashville," which critic Leonard Maltin called "full of cogent character studies, comic and poignant vignettes, done in seemingly free-form style." Yet you could be disappointed if you expect "Almost Famous" to give you greater insight into the meaning of rock music, the wherefore of its hold on so many of the world's young people who'd lift their arms, swaying and rocking and caught up in its ecstatic grip which is often fueled by hallucinogenic substances. Many of the songs on Nancy Wilson's soundtrack are secondary, completely unknown by those who are not denizens of the scene... strains that include performances by Led Zeppelin in "Bron-Yr-Aur," Deep Purple's "Burn," and Todd Rundgren's "It Wouldn't Have Made Any Difference." The music is not the thing, any more than it was in Crowe's well-received "Jerry Maguire."
Instead, this is primarily a slice of Cameron Crowe himself, informed by his 1975 interview with Led Zeppelin in which he asked such penetrating questions as "When you wear the makeup, how does it make you feel?" We get the idea that the impressionable lad's excitement in taking in the essence of rock-band ambiance is matched by the band's own devotion to an interviewer who makes them feel even cooler than could an entire room of dancing devotees. When Crowe interviewed the singer-songwriter Jackson Browne in 1974, Browne was talkative with the young Crowe in speaking of his record of youthful delinquency and sexual exploits. Through this film we feel the pain of Billy Crudup's Russell Hammond, who is the stand-in for Jackson Browne--a man who treated the cub journalist like a little brother and felt betrayed by the kid's all-too-honest exposure in the magazine piece. "Almost Famous" does not give us enough of the spirit of the times, of the world outside the cocoon of rock concerts--the rebelliousness, the antiwar protests, the excitement and vigor of an age less wrapped up in money concerns than our own. But the movie has more appeal for an audience not a part of the rock world than other greats and near greats, satiric or otherwise like "This is Spinal Tap" and "Stop Making Sense" because it is told from the point of view of a kid we all wish we could have been. And to the bliss of those of us who spend our time writing about the movies, few other films glorify the critic as much as Cameron Crowe's.
Rated R. Running time: 122 minutes. (C) 2000 by Harvey Karten<EMAIL_ADDRESS>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


Microsoft introduced the SharePoint Framework as the recommended way to customize and extend SharePoint Online in 2017. On-premises SharePoint customers that have deployed SharePoint Server 2016 and SharePoint Server 2019 can also use the SharePoint Framework to customize and extend their client-side solutions as well.
In this unit, you'll learn what the SharePoint Framework is and the extensibility options that enable developers to customize SharePoint environments.
Over the past several years, with the evolution of Office 365, development of SharePoint solutions has a new set of challenges: while on one hand IT and Tenant administrators require a new set of tools to control how data get accessed and consumed in their tenancies, developers want to programmatically control the whole lifecycle, experience, and data access capabilities of a Site.
Unfortunately, developers today find themselves constraint around building app parts because of iFrames, a reduced set of APIs, and no integration with cross Office 365 workloads. This in turn limits their ability to develop powerful portals that extend SharePoint.
The client-side development framework will deliver capabilities that will help both first party and third-party developers build powerful, rich applications and provide an enjoyable web experience in Office 365 for end users that are both intuitive and simple to consume.
SharePoint Framework is modern client-side development. All the customizations you create and build are deployed and run in the browser. There's no server-side component in a SharePoint Framework component.
You can create server-side components, but you're going to host that yourself in a location other than SharePoint.
SharePoint Framework components are lightweight and run in both web and mobile experiences because they're client-side solutions. We're relying on JavaScript, HTML, CSS, and images. This means they run the exact same way in the browser as it does in the mobile experiences.
The SharePoint Framework is backwards compatible meaning that it works not just the modern pages, but also on classic and publishing pages as well.
The development tools and platform used in the SharePoint Framework is implemented with open-source tools and common JavaScript web frameworks like React.
The SharePoint Framework enables developers to create different types of custom components that are used to customize and extend SharePoint sites. The custom component types are:
Client-side web parts, built using the SharePoint Framework, are the cornerstone of the vision for innovating, extending, and customizing the SharePoint modern experience.
They're configurable, reusable, and purpose-built components that page designers and site owners can use to create unique experiences for their users.
Client-side web parts are build using the SharePoint Framework that provides extra capabilities, including access to Microsoft Graph for incorporating personal and organizational information into page experiences.
Web parts are also context aware, in the sense that they have access to contextual information about the current page. For instance, at runtime, the web part can get information about the current user and the current page and site the web part is currently running in.
Client-side web parts are flexible as well! Developers can use them to create single page applications (SPAs) as single page app pages, the basis for Microsoft Teams tabs and personal apps, and even as the host for Office Add-ins.
Experienced SharePoint developers who are familiar with server-side web parts developed and deployed using SharePoint features and solutions will find client-side web parts to be familiar. They're just web parts!
The only difference from a server-side web part is client-side web parts are rendered in the browser, not on the server.
Client-side web parts are build for the modern, JavaScript-driven web just as the modern SharePoint experience.
Note
Client-side web parts are supported in all environments supported by the SharePoint Framework, including SharePoint Server 2016, SharePoint Server 2019 and SharePoint Online.
Adding a SPFx client-side web part to a page works in very much the same way as adding server-side web parts. However, there are a few things that make working with client-side web parts a bit easier.
Unlike classic pages, when a page is in edit mode, any web parts on the page are also in edit mode. Compared to classic pages where the web part has a different edit mode from the page's edit mode.
To add a web part to a modern page, first put the page in edit mode and then select the + icon to open the toolbox. Select a web part from the toolbox to add it to the page.
You can edit the web part by opening the property pane with the edit icon to the left of the web part. By default, any changes made in the property page are immediately reflected in the web part.
SharePoint Framework extensions enable developers to customize and extend the SharePoint user experience. You can use them to customize notification areas, list toolbars, list menus, and list data views.
Microsoft introduced extensions in the SharePoint Framework to allow customers to implement some of the same customization options available in classic sites. Extensions will only work in the modern SharePoint experience and are intended to serve as the modern option for the following options in the classic experience:
ScriptLink
JSLink
Because they only run in the modern experience, you can only use SharePoint Framework extensions in SharePoint Server 2019 and SharePoint Online.
Note
Extensions are supported in all environments supported by the SharePoint Framework that also support the modern page experience, including SharePoint Server 2019 and SharePoint Online.
Let's look at the first type of extension: the application customizer. This extension is intended to be the modern replacement to the legacy delegate controls and ScriptLink
property.
Application customizers enable you to do two things:
<div>
elements on the page that serve as headers and footersThe next type of extension is the field customizer. This extension is intended to be the modern replacement to the legacy client-side rendering (CSR) framework and JSLink.
Field customizers enable you to define the HTML within a cell in the list display form. In the following screenshot, notice the Percent Complete column is rendered with custom colored bars instead of plain text:
The last type of extension is the command set. This extension is intended to be the modern replacement to the legacy custom actions.
Command sets enable you to add buttons to list and library toolbars or to the context menu of items within a list.
The other two types of components previously covered, web parts and extensions, enable developers to extend and customize the SharePoint user experience. This third option, the library component, differs from those other types in that it's used to share code across multiple components projects.
The library component is developer tool that enables developers to create a single package of reusable code that's independency versioned & deployed from your other components. These reusable code packages are deployed a single time to SharePoint Online tenant app catalog ad served automatically for SharePoint Framework components.
Library components give developers an alternative option to create shared code, which can be then used and referenced cross all the components in the tenant.
Note
Library components are only supported in SharePoint Online.
The SharePoint Framework was introduced in 2017 to SharePoint Online. Microsoft is continuously updating and improving the SharePoint Framework in SharePoint Online. Developers can build custom components that use the most recent version of the SharePoint Framework.
SharePoint Online contains not only the latest version of the SharePoint Framework, but it will also load any previously published version of the SharePoint Framework if a component on the page uses an older version. This capability ensures that developers aren't required to always update previously deployed components every time a new version of the SharePoint Framework is released.
The SharePoint Framework is supported in both SharePoint Server 2016 and SharePoint Server 2019. Unlike SharePoint Online that is always updated to use the latest version of the SharePoint Framework, the on-premises SharePoint versions only support specific versions.
SharePoint Server 2016 supports the SharePoint Framework v1.1.0, which is the initial version that introduced client-side web parts to SharePoint. This version of SharePoint doesn't support the extensions component type because extensions have a dependency on the modern experience. The modern experience wasn't added to SharePoint Server until SharePoint Server 2019.
SharePoint Server 2019 supports the SharePoint Framework v1.4.0 and all previous versions. This version includes support for client-side web parts and extensions.
In this unit, you learned what the SharePoint Framework is and the extensibility options that enable developers to customize SharePoint environments.


The Girl on the Train
A divorcee becomes entangled in a missing persons investigation that promises to send shockwaves throughout her life.


{% extends 'base.html' %} {% block content %}
Why should feedback be anonymous, anyway?
That's a great question. The purpose of this site is simply to enable true anonymity, when it is desired by a team.
Why do I need to install special software?
To jumble up the order of feedback responses and keep them anonymous, we need to store them on a server. We don't want anyone, including site admins, to be able to read this feedback, so we store it encrypted. To read it, you decrypt it locally on your computer using your secret private key. This ensures you are the only person who can read your personal feedback.
How is my data kept safe?
Feedback text that you author is sent to the server via a Secure
HTTPS Socket,
where it is encrypted using
Public-key_cryptography.
It is stored in this encrypted form until results are published.
The only person who can decrypt it is the recipient, using their private key.


About Us
Code for Science & Society ("CSS") is a not-for-profit organization committed to improving access to data for the public good.
At CSS we seek to advance the power of data to improve the social and economic lives of all people through public education, scientific research, and technology development and deployment. We work to improve the public’s ability to find, collect, and share the data they use to make more informed decisions in the benefit of the public interest.
We work at the intersection of technology with three areas of public interest: science, journalism and government. Our goal is to help these areas make better use of technology to accomplish their goals and help foster more openness, transparency and collaboration.
Our main function is to build, promote and train these communities on data management, sharing and search tools they can use to make better use of data in their work and to benefit the public at large.
Contact Us
Phone<PHONE_NUMBER>
E-mail<EMAIL_ADDRESS>Mailing Address
Code for Science and Society
C/O Max Ogden
419 NE 10th Ave
Portland, OR
97232
Code for Science and Society
C/O Max Ogden
419 NE 10th Ave
Portland, OR
97232


HANNIBAL (director: Ridley Scott; screenwriter: David Mamet/Steven Zaillian/based on the novel by Thomas Harris; cinematographer: John Mathieson; editor: Pietro Scalia; cast: Anthony Hopkins (Hannibal Lecter), Julianne Moore (Clarice Starling), Ray Liotta (Paul Krendler), Giancarlo Giannini (Rinaldo Pazzi), Frankie R. Faison (Barney), Francesca Neri (Allegra Pazzi), Gary Oldman (Mason Verger), Zeljko Ivanek (Dr. Cordell Doemling), Hazelle Goodman (Evelda Drumgo), David Andrews (FBI Agent Pearsall); Runtime: 131; MGM; 2001)
Reviewed by Dennis Schwartz
The long awaited sequel to "The Silence of the Lambs" has arrived with a new director for Jonathan Demme -- Ridley Scott ("Gladiator"), and a new star actress for Clarice Starling, as Jodi Foster bowed out and Julianne Moore came in. The production also changed screenwriters, as David Mamet's script was rejected and his script was replaced by Steven Zaillian's. What remains constant, is that Anthony Hopkins is still up to his old eating habits while playing Hannibal Lecter.
The film is stylistically pleasing to the eye. Its serial killer scenes are excessive, but they do allow for comedy to soften the blows and, also, since all the victims were not particularly nice people, watching them being mutilated was made more bearable.
The film can be divided into three parts and all with different results. The film's opening is meticulously choreographed, showing in detail how a police bust can go sour. The film's second part taking place in Italy, is brilliantly conceived and acted, it is the heart of the film, with its visual effects matching its dialogue and storytelling. Though, even this part of the film has its faults, as some scenes will drag on for far too long, allowing a tedium to creep into the story. The last part, when back in the Washington, DC area, is a total gross-out, that brings the film down to a mundane campy level, as bad taste takes over, making for a very sloppy and exploitive surprise ending.
Overall, this sequel didn't live up to the high-pulp-art standards of the original, but it was still successful in being a technically superior cinematic happening and the quality of the acting was always first-rate. Hopkins's riveting performance is interlaced with wit and a sense of the genteel, though it also comes with some over-the-top moves (though there are no slurping tongue sounds when he goes into his cannibalistic mode as in the original). The nervous, icy but vulnerable persona that Moore ably brought to her role, much like Foster played it, keyed in on her fight with male authority figures who can't accept her because she's different than they are, more than with her mental chess game with Lecter as in the original. But the most underrated performance in the film, is by Giancarlo Giannini as Italian detective Pazzi, whose greedy character is clearly drawn out through Italian actor Giannini's superbly nuanced performance, of a man who is desperately trying to achieve redemption for his failure to achieve what he wanted out of life, so much so that he will sell his soul to the Devil to hold onto his trophy wife (Neri) and also to show his superiors that he is capable of more than what they think.
The film opens with FBI Special Agent Clarice Starling working with local Washington, DC police to apprehend a dangerous female felon (Goodman), who is wanted on drug charges. Clarice's career, since her initial success with the Hannibal case, has been spiraling downwards of late, and because this arrest results in a bloody shootout, she is unfairly blamed for it and called on the carpet by her male FBI bosses. Leading the charge against her, is a self-serving U.S. justice official, someone who was once an agent in her department and made sexual advances which she rejected, Paul Krendler (Ray Liotta). He has now been assigned to team up with her to find the whereabouts of the escaped serial killer Hannibal Lecter. Clarice has just received a letter from Lecter, which she traces to Florence, Italy. A wealthy, homosexual victim of Hannibal's, Mason Verger (an unbilled Gary Oldman), who had his face ripped apart by him and is now disfigured and has the distinction of being the only one of Lecter's victims to have survived, learns of this letter and meets with Clarice. And since he has enough money to buy influence in Washington, he gets the FBI to put her on the case, as he intends to use her as a lure so that his own hired men can bring Hannibal to him, as he plans to get his vengeance.
In Florence, an Italian detective, Rinaldo Pazzi has uncovered that the person posing as the newly-appointed art curator, is Lecter and that he's on the FBI's Ten Most Wanted list and that Mason Verger is offering a $3 million reward. He forgets his policeman's oath and greedily tries to bring Hannibal to Verger, with the help of Verger's men. But, he underestimates Hannibal's cunning ability and pays dearly for his poor judgment.
In the climactic scenes, Hannibal comes back to the States, and his long-anticipated meeting with Clarice takes place -- which turns out to be a fizzle, or a real lame-brained idea on how to put a twist in the plot that becomes unnecessarily twisted. The film, that was faithful to Thomas Harris' novel until this point, now goes off on Ridley Scott's own direction and it becomes an absurd mess, with nothing working right, and all its good work is nearly eaten away by the director's bad instincts. What can you say, but sometimes you try something new and it just doesn't taste right.
REVIEWED ON 2/18/2001 GRADE: B-
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


@(user: User)
Dear @user.name,
Welcome to the W3C Validator Suite Service.
We are pleased to confirm your registration under the email address: @user.email
We remind you that you have received @user.credits free page validations.
You chose @Helper.notWord(user.optedIn)to receive email communications from W3C. You can change this setting and edit your profile on the My Account page.
If you have lost your password you can recover it using the Reset Password page.
We welcome your feedback and ideas feel free to send us an email to @Helper.config.getString("support.email").getOrElse("").
Sincerely,
W3C Validator Suite Team
--
W3C Validator Suite
<EMAIL_ADDRESS>@Helper.config.getString("support.email").getOrElse("")


/
Your tasks
Tasks for anyone
Cool, you have completed all your tasks! Take a brake!
Settings
API Key
(?)
Region
US
EU
Save


{SITE_NAME} |
|
Verify your email.
Dear {NICKNAME}, However, you have not verified your email yet. So just in case you were wondering why you haven't heard from us yet - that's why. Go ahead and verify your email now:
Your account and subscribed services (like newsletters) will only be accessible after you have verified your email. Your account details:After verification, you can log in using the details below.
URL: Thank you for signing up. {FROM} |
|
{SITE_NAME} |
|


First you can check that your endpoint is up
curl -i "http://localhost:5000/users/"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 44
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Tue, 15 Oct 2013 11:13:44 GMT
{
"meta": {
"filters": {}
},
"object_list": []
}
Your endpoint is responding but does not have any data. Let’s add some:
curl -i -H "Content-type: application/json" -X POST -d '{"first_name":"John", "last_name": "Doe"}' http://localhost:5000/users/
HTTP/1.0 201 CREATED
Location: http://localhost:5000/users/1/
Content-Type: application/json
Content-Length: 0
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 13:00:13 GMT
If you look carfully at the response, you can see the header “Location” giving you the ressource uri of the ressource you just created. This is usefull if you want to retreive your object. Let’s get a try:
curl -i "http://localhost:5000/users/1/"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 51
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 16:53:19 GMT
{
"first_name": "John",
"id": 1,
"last_name": "Doe",
"ressource_uri": "/users/1/"
}
You can see that ressource_uri was not part of the ressource. It have been added by the View itself. View can add multiple metadata, remove or change some fields and so on. More on that in representing_data
The list of users is also updated:
curl -i "http://localhost:5000/users/"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 83
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 17:03:00 GMT
{
"meta": {
"filters": {}
},
"object_list": [
{
"first_name": "John",
"id": 1,
"last_name": "Doe",
"ressource_uri": "/users/1/"
}
]
}
Let’s add a new user:
curl -i -H "Content-type: application/json" -X POST -d '{"first_name":"Peter", "last_name": "Something"}' http://localhost:5000/users/
HTTP/1.0 201 CREATED
Location: http://localhost:5000/users/2/
Content-Type: application/json
Content-Length: 0
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 13:00:13 GMT
and now delete it:
curl -i -X DELETE "http://localhost:5000/users/2/"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 0
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 20:41:46 GMT
You can check that the user no longer exists:
curl -i "http://localhost:5000/users/2/"
HTTP/1.0 404 NOT FOUND
Content-Type: application/json
Connection: close
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Tue, 15 Oct 2013 11:16:33 GMT
{ "error": "
The requested URL was not found on the
server.

If you entered the URL manually please check your
spelling and try again.
" }
And the list is also updated:
curl -i "http://localhost:5000/users/"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 125
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Tue, 15 Oct 2013 11:17:46 GMT
{
"meta": {
"filters": {}
},
"object_list": [
{
"first_name": "John",
"id": 1,
"last_name": "Doe",
"ressource_uri": "/users/1/"
}
]
}
Let’s go another time to the creation process:
curl -i -H "Content-type: application/json" -X POST -d '{"first_name":"Steve", "last_name": "Roger"}' http://localhost:5000/users/
HTTP/1.0 201 CREATED
Location: http://localhost:5000/users/3/
Content-Type: application/json
Content-Length: 0
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 20:45:38 GMT
But well everybody now that Steve Roger real name is Captain America. Let’s update this user:
curl -i -H "Content-type: application/json" -X PUT -d '{"first_name":"Capitain", "last_name": "America"}' http://localhost:5000/users/3/
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 58
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 20:57:47 GMT
{"first_name": "Capitain", "last_name": "America", "id": 3, "ressource_uri": "/users/3/"}
Argh! Thats a typo. the fist name is “Captain”, not “Capitain”. Let’s correct this:
curl -i -H "Content-type: application/json" -X PUT -d '{"first_name":"Captain"}' http://localhost:5000/users/3/
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 59
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 21:08:04 GMT
{"first_name": "Captain", "last_name": "America", "id": 3, "ressource_uri": "/users/3/"}
Ressources can be filtered easily using parameters:
curl -i "http://localhost:5000/users/?last_name=America"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 236
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Tue, 15 Oct 2013 12:07:21 GMT
{"meta": {"filters": {"last_name": "America"}}, "object_list":
[{"first_name": "Joe", "last_name": "America", "id": 1,
"ressource_uri": "/users/1/"}, {"first_name": "Bob", "last_name":
"America", "id": 3, "ressource_uri": "/users/3/"}]
Multiple filters are allowed:
curl -i "http://localhost:5000/users/?last_name=America&first_name=Joe"
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 171
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Tue, 15 Oct 2013 12:09:32 GMT
{"meta": {"filters": {"first_name": "Joe", "last_name": "America"}},
"object_list": [{"first_name": "Joe", "last_name": "America", "id": 1,
"ressource_uri": "/users/1/"}]}
Of course, If data is not formated as expected by the API, the base error handling take place.
If you don’t provide a last_name, the API will raise a BAD REQUEST explaining your error:
curl -i -H "Content-type: application/json" -X POST -d '{"first_name":"John"}' http://localhost:5000/users/
HTTP/1.0 400 BAD REQUEST
Content-Type: application/json
Content-Length: 62
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 13:21:10 GMT
{"error": "last_name is missing. Cannot create the ressource"}
The same apply if you dont give coherent data:
curl -i -H "Content-type: application/json" -X POST -d '{"first_name":45, "last_name": "Doe"}' http://localhost:5000/users/
HTTP/1.0 400 BAD REQUEST
Content-Type: application/json
Content-Length: 41
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Mon, 14 Oct 2013 13:24:53 GMT
{"error": "first_name does not validate"}
however, there is no duplicate check. So you can create as many “John Doe” you want. This could be a huge problem if your not able to validate uniqueness of a user. For the API, this is not a problem because each user is uniquely identified by his id.
If you need to ensure it can be only one John Doe, you must add a validator on your datastore.
Your API is autodocumented by Python REST API Framework.
curl -i -X GET http://localhost:5000/schema/
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 268
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Wed, 16 Oct 2013 08:24:13 GMT
{
"users": {
"allowed list_verbs": [
"GET",
"POST"
],
"allowed unique ressource": [
"GET",
"PUT",
"DElETE"
],
"list_endpoint": "/users/",
"schema_endpoint": "/schema/users/"
}
}
url -i -X GET http://localhost:5000/schema/users/
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 206
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Wed, 16 Oct 2013 09:04:16 GMT
{
"first_name": {
"example": "Hello World",
"required": "true",
"type": "string"
},
"last_name": {
"example": "Hello World",
"required": "true",
"type": "string"
}
}


Singular provides a simple, yet powerful two-way data binding layer for HTML5 and Javascript. It is similar in many ways to Google's Angular framework, but takes a more direct, easier-to-use approach to the problem. Singular is designed to make it easy to gradually retrofit existing "non-angular" style Javascript projects to using two way data binding.
Javascript data binding is all about abstracting the "juice" (the data, as provided by the user or a web service) into a singular data store from which you build your views. The views will "hook" the nestable attributes in the data store, so that any changes to them will be reflected in the view. Building your application this way helps to better manage bandwidth and enforce a stronger separation of concerns. These are all great things for web apps. Singular gives you a markup-based API, a simple Javascript API, and an extension mechanism for accomplishing this model in your apps.
All Singular pages have at least one model, called window.$appModel. You can use the box in the upper right hand corner to explore the $appModel of this page, and make changes. Every change you make to a linked attribute should be reflected in this page.
<input type="text" sg:model="yourName" />

Oh, hello there !

Singular can create automatic, two-way links between elements and the model data by attaching event handlers on the model
to update the view, and when applicable, the view to update the model.
If you do not pass a model when calling $().singular()
, the global, top-level
window.$appModel
is used. A model may have a parent model, in which it also has an attribute path associated with it
that acts as a prefix, so that such a "sub-model" refers to a small sub-branch of the overall model. For instance, one might create
a submodel under library.songs[2]
, and then use that model with the markup API or directly to reference attributes of
library.songs[2]
such as name
or duration
. You may use, e.g., $appModel.use('library.songs[2]')
as a shortcut to create sub-models.
Unless you intervene ,
all top-level SingularModel
instances have window.$appModel
as their parent. Any number of models
may exist, inheriting from any other model. Models are just Javascript objects which may have any number of attributes,
which may be objects that contain sub-attributes, creating a deep keyed tree.
Use $model.get()
to retrieve an entry respecting model inheritance and fallbacks, use $model.set()
to
change attribute values while triggering the proper change events, use $model.watch
to attach a change event to
a particular attribute name. The attribute names supported by these methods may be any valid identifiers, separated by dots.
Additionally, any component of the path may have an array index at the end, with a numeric token inside.
Just like any other Javascript object! In fact,
if you've inspected Singular using DevTools or Firebug, window.$appModel.attributes
is the top-level model object where all attributes
and values live, but you should not modify it except in edge cases (like startup, shutdown, or for avoiding change notifications for some
reason).
OK, you don't interact with SingularModels quite the same way as normal objects, but , you won't even need Javascript to get started.
Singular's markup API is merely a simple, if battle-hardened convenience layer on top of the SingularModel API. See the rest of the examples for more on that.
Singular supports watching simple, fast expressions related to model attributes using $model.expr()
and
$model.watchExpr()
. These expressions can be used with sg:visible
to dictate whether
an element is visible or not. For extra class, add sg:transition
(with values "slide" or "fade") to apply an animation.
Singular also offers sg:checked
and sg:selected
for <input>
and
<select>
, respectively.

Add a coin:
<input type="text" class="coinText" />
<button sg:click="$model.add('coins', {name: $('input.coinText').val()});">Add</button>
Below, we use sg:each
to generate markup for each item of an array within the model. In this
case the array is stored in the 'coins'
attribute.

(<span<EMAIL_ADDRESS>

Add sg:use to modify the base attribute path for references within a section of markup.
Any Singular references below that element will be relative to the attribute value
of the sg:use. This behavior is identical to that of a sub-model, and indeed this attribute
is functionally equivalent to $contextModel.use('attributeValue')
. For performance
reasons however, sg:use does not generate any models. Instead, all models know how to calculate
the proper prefix based on the sg:use attributes in use around them.
Use sgTemplate
class. Be sure to include singular.css
or singular.scss
in the page so elements with .sgTemplate
do not appear on your page. When sg:view is
processed, Singular takes special care to not copy the sgTemplate class, so the final instance of the template will be visible.
If there is a Javascript
class with the same name as the view ID, it will be instantiated and attached to the element.
Such classes should inherit from SingularView using Class.extend.
Finally, Singular is run on the resulting view instance markup. The Singular context will be
either the context of Singular during the sg:view
operation, or a sub-model rooted at the
value of the sg:model
attribute placed next to the sg:view
attribute.
@
is a special attribute which asks Singular to return the current path, after all parent
resolution has taken place. It is identical to calling $contextModel.use(pathBeforeAtSign).where()
.
This attribute can be used with $model.get()
, even with nested attribute paths like
$model.get('level1.level2.@')
as used here...

Add a coin:
<input type="text" class="coinText2" />
<button sg:click="$model.add('coins', {name: $('input.coinText2').val()});">Add</button>
You can also combine sg:each
and sg:view
so you can declare your markup elsewhere from where you call
sg:each
. In this case, we can use it to avoid duplicating the per-item markup for the two identical
sg:each
operations, and add some style to boot(strap).
Attribute paths are relative references to slots in the data model. Each component in an attribute path is separated by a dot (.
).
Each component is typically an alphanumeric string. They may also contain underscores. The end of each component may also have an array reference
containing a numeral such as [35]
which may be used to access individual array values. Since the model is just a deep Javascript object,
it is possible to contnue an attribute path beyond what you might normally consider a leaf in the tree, for example:
// prints length of value for attribute aString
console.log($appModel.get('aString.length'));
However, unless you add code to trigger changes on it using $model.set('aString.length')
,
sg:model
links to paths like aString.length
will not stay synchronized for performance and reliability reasons.
Adding singular.js
will not cause any Singular behaviors to be added to your page. You must directly call
$().singular()
to get started. It is convention to put all of your Singular markup beneath

(except for markup templates). Here's how you might initialize
the Singular markup on your page:
$('.application').singular();
When you use Singular like this, all attribute references in your markup will be relative to window.$appModel unless you change that using
sg:use
, sg:each
, or sg:view
+ sg:model
. You can override
this by passing in an argument to $().singular()
. The following code might be used along with markup like

Project name here

$('#project-51').singular($appModel.use('projects[51]'));
While Singular always installs a top-level model object into window.$appModel
, you
are still free to choose your own model objects and pass them to Singular instead.
When called with $().singular()
, Singular will perform a single deep search, using all matched query elements as roots. It searches for
any elements with any sg:*
attribute(s) on them. It then processes each sg:*
attribute of each element in an order
predetermined within the Singular source code. Unsupported attributes are ignored. Certain conditions will cause Singular to ignore attributes.
If underneath an element with sg:each
, sg:view
, or an element matching .sgTemplate
, the attribute
will not be processed. Also, if the value starts with #
, the attribute will not be processed. This can be used to comment out
Singular behaviors, but is actually used by Singular to track which behaviors have been applied to the model and the DOM, preventing Singular
from processing them again should it be asked to.
Out of the box, Singular markup will not currently validate using the W3C Validator tool. This is also the case with the recommended
syntax for Angular (ie ng-xxx
). The difference is that Singular's variant could potentially be made to validate
should the W3C begin allowing XML namespaces as a flexible and safe way to combine third-party attribute sets in an validate-friendly way.
sg:model="model.attribute"
Keeps model.attribute
of the current Context Model synced with the inner markup of the host element.
If the host element is an input, textarea, or select, the value or selection status will be modified as appropriate.
For non-disabled inputs and editable elements (contenteditable="true"
) the view will also be capable of changing
the model. You may specify whether to enable instant value updates or only when the user blurs the input or editable element
by using sg:mode
. Set sg:mode="instant"
(default) or sg:mode="blur"
to disable instant updates.
sg:map="attr:model.attribute;..."
Syncs one or more HTML attributes with corresponding model attributes. The list is styled like a CSS property list, with semicolons between pairs, and colons between key and value. The key is the HTML attribute, the value is the model attribute. The final attribute name will be composed from the model chain and sg:use declarations above the host element.
sg:each="model.attribute"
Creates markup beneath the host element corresponding to each item in the array stored in
the given model attribute. You may pair this with sg:view
to load the per-item
markup from a template from elsewhere in the document. sg:each
is always
processed before directives beneath it.
sg:visible="expr"
Make element visible when expr
evaluates to true
, invisible otherwise.
Add sg:transition
for animation. Options include slide
, fade
,
or default
for no animations.
sg:checked="expr"
Make element checked when expr
evaluates to true
, unchecked otherwise. Link
is bidirectional.
sg:selected="expr"
Make element selected when expr
evaluates to true
, unselected otherwise. Link
is bidirectional.
sg:use="namespace"
Rebase all model references beneath the host element to be relative to the given "namespace". Effectively
creates a sub-model, allowing you to omit the attribute prefix in your references. Use sparingly, sometimes
the result of sg:use
resolution can be unexpected!
sg:ignore
Do not process any Singular directives beneath the host element.
sg:click="code"
Execute a click handler with access to $model, which is set to be the current context model.
In some cases, Singular accepts simple, non-executable expressions to offer additional flexibility. Such expressions primarily allow for comparisons either between model attributes or between attributes and constant values.

This content is only shown when the
"membership" model attribute is 'gold'.

| Operator | Help |
|---|---|
== |
Check that the two values are equal. |
!= |
Check that the two values are not equal. |
> |
Check that the left-hand value is greater than the right-hand value. |
< |
Check that the left-hand value is less than the right-hand value. |
>= |
Check that the left-hand value is greater than or equal to the right-hand value. |
<= |
Check that the left-hand value is less than or equal to the right-hand value. |
! |
Invert a boolean, from true to false or false to true. |
Singular bundles and uses John Resig's simple inheritance library for Javascript. For isolation, the base class
is renamed to SingularClass
. For more information about Resig's class model,
click here.
Inheriting from SingularClass
-family classes is straightforward:
MyClass = SingularClass.extend({
init: function(param1) {
},
method: function() {
alert('hellooo!');
}
});
MySubClass = MyClass.extend({
init: function(param1, param2) {
this._super(param1);
},
method: function() {
this._super();
alert('wooorrldd!');
}
});
// When MySubClass.method is called, shows both alerts
This section details the Javascript API for Singular. Singular tries to give you almost complete control of the model and interactions with it. You are not required to use uniform REST resources, and you are easily able to manipulate model objects from whatever plain Javascript events you happen to be working with.
SingularModel = SingularClass.extend({ /* ... */ });
SingularModel
is the base class of all data model objects. It provides an API for retrieving and manipulating potentially
nested "attribute paths". Values in the tree may be objects, arrays, or primitives. The paths can drill into these as well as primitive
sub-properties.
/* SingularModel */ get(attributePath)
Retrieve the current value of a given attribute path. If the attribute cannot be found, the parent model is checked and any matching value returned.
/* SingularModel */ set(attributePath, [value])
Change the value of a given attribute path. Any callbacks registered with .watch()
will be fired with the new value.
/* SingularModel */ watch(attributePath, callback(value))
Call the given callback function with attributePath
's value when it changes.
SingularView
SingularController


It is easy to forget that our facilitators need breaks in between activities as well. To ensure that all facilitators are kept full and happy, the delivery team distributes food to ten classrooms daily.
Our Livestreaming team is in charge of setting up equipment for various events, from the Opening Ceremony on Day 1 to the Closing Ceremony on Day 4 of ISYFdigital 2021. Here are the hosts of today’s Cultural Sharing: Yu Wenhao from Aquila and Chan Yu Xi Celeste from Hercules.
Our Livestreaming team is in charge of setting up equipment for various events, from the Opening Ceremony on Day 1 to the Closing Ceremony on Day 4 of ISYFdigital 2021. Here are the hosts of today’s Cultural Sharing: Yu Wenhao from Aquila and Chan Yu Xi Celeste from Hercules.
Photographers from the Media and Publications Committee snap the most aesthetic angles of speakers, audiences, staff and students throughout the entire ISYFdigital 2021. Some of the pictures you see here are taken by them too!
In the second session of the Meet-the-Scientist series, Dr. Koh Ming Joo, Dr. Saif A. Khan, Prof. Lu Wei and Dr. Phua Ghee Chee shared their knowledge, experience and insights in their respective fields of expertise.
The much awaited Science Dexperimentation (a lively combination of “Demonstration” and “Experiment” in science) was held this morning, featuring (from left to right) Prof. Hans-Albert Bachor and Mr. Patrick Helean who intrigued delegates with experiments related to sound, pressure, light and temperature.
Prof. Hans-Albert Bachor is the Mind in Residence of Questacon, while Mr. Patrick Helean is an Actor, Director, Science Communicator and the Co-ordinator of Questacon Excited Particles. Questacon is the National Science and Technology Centre in Australia.
Three out of 33 posters submitted for the Poster Awards and Showcase this year have been selected as the winners. These winning posters are:
1. Fabrication of Microbial Fuels Cells Powered by Organic Waste and Wastewater to Generate Bioelectricity by Ng Yan Bin Lucas and Lucas Koh Eu Jen from Hwa Chong Institution.
2. Gait Monitoring and Analysis for Parkinson Disease Patients by Ye Chen Rui, Prannaya Gupta and Nallapuraju Ananya from the NUS High School of Mathematics and Science.
3. A Machine Learning Based Approach for Prediction of rTMS Treatment Response in Patients with Drug-resistant Depression using Magnetoencephalographic Data by Chia-Wei Chang from the Taipei Municipal Jian Guo High School.
Dr. Sanjay H. Chotirmall, Assistant Professor of Molecular Medicine, Nanyang Technological University (NTU)
Dr. Tan Meng How, Assistant Professor, School of Chemical and Biomedical Engineering, Nanyang Technological University (NTU)
Dr. Ho Pin, Scientist, Institute of Materials Research and Engineering, Agency for Science, Technology and Research (A*STAR)
Dr. Clara Cheong, Head of Administration and Scientific Affairs at Singapore Institute for Clinical Sciences (SICS), Agency for Science, Technology and Research (A*STAR)
Winner of the prestigious 2010 Nobel Prize in Physics; leader of the construction and establishment of the National Graphene Institute in Manchester; one of the most highly cited researchers in the world… And that is just a sampling of Sir Konstantin’s numerous achievements. Best known for isolating graphene in 2004, Sir Konstantin has broad research interests from mesoscopic phenomena in ferromagnets to superconductors. He is an inspiration to all scientists and an asset to the scientific community worldwide.
Did you enjoy today’s opening ceremony? Today’s speaker is Sir Konstantin Novoselov, who shared many interesting insights on his research projects, what it takes to do science research today, and even answered delegates’ questions during the live Q&A. A big thank you to YOU, our virtual audience, for listening attentively and actively engaging with Sir Konstantin. Keep up the enthusiasm tomorrow!
Group photo of Mr. Pang Choon How (Principal of Hwa Chong Institution) (extreme right) and our esteemed guests (from left to right): Sir Konstantin Novoselov (Nobel Laureate), Dr. Liew Kian Heng (Vice-Chairman, Board of Governors, Hwa Chong Institution), Prof. Lim Tit Meng (Chief Executive, Science Centre Board and Associate Professor of the Department of Biological Sciences at NUS), Prof. Phua Kok Khoo (Founding Director Emeritus, The Institute of Advanced Studies, Nanyang Technological University).
Prof. Lim Tit Meng is the Chief Executive Officer of the Science Centre Board as well as the Associate Professor of the Department of Biological Sciences at the National University of Singapore (NUS). An educator with numerous teaching and research accolades, Prof. Lim’s passion for cellular biology and nanotechnology shines through particularly in his research on the ageing of the human brain. It is truly an honour to have him for ISYF digital 2021!
ISYF Introductory Video
ISYF Introductory Video
Closing Ceremony Montage
Closing Ceremony Montage
661 Bukit Timah Rd, Singapore 269734
+65 6468 3955
<EMAIL_ADDRESS>Fax: 6769 5857
This is the ISYF (International Science Youth Forum) 2021 website. Any advice and information found on the pages are solely for the event and educational purposes only. Information related to the speakers are displayed with their consent.
© International Science Youth Forum 2021. All rights reserved.