Improvements to Flink operations: Snapshots Ownership and Savepoint Formats
May 6, 2022 - Dawid Wysakowicz (@dwysakowicz) Daisy TsangFlink has become a well established data streaming engine and a mature project requires some shifting of priorities from thinking purely about new features towards improving stability and operational simplicity. In the last couple of releases, the Flink community has tried to address some known friction points, which includes improvements to the snapshotting process. Snapshotting takes a global, consistent image of the state of a Flink job and is integral to fault-tolerance and exacty-once processing. Snapshots include savepoints and checkpoints.
This post will outline the journey of improving snapshotting in past releases and the upcoming improvements in Flink 1.15, which includes making it possible to take savepoints in the native state backend specific format as well as clarifying snapshots ownership.
Past improvements to the snapshotting process #
Flink 1.13 was the first release where we announced unaligned checkpoints to be production-ready. We encouraged people to use them if their jobs are backpressured to a point where it causes issues for checkpoints. We also unified the binary format of savepoints across all different state backends, which enables stateful switching of savepoints.
Flink 1.14 also brought additional improvements. As an alternative and as a complement to unaligned checkpoints, we introduced a feature called “buffer debloating”. This is built around the concept of automatically adjusting the amount of in-flight data that needs to be aligned while snapshotting. We also fixed another long-standing problem and made it possible to continue checkpointing even if there are finished tasks in a JobGraph.
New improvements to the snapshotting process #
You can expect more improvements in Flink 1.15! We continue to be invested in making it easy to operate Flink clusters and have tackled the following problems. :)
Savepoints can be expensive to take and restore from if taken for a very large state stored in the RocksDB state backend. In order to circumvent this issue, we have seen users leveraging the externalized incremental checkpoints instead of savepoints in order to benefit from the native RocksDB format. However, checkpoints and savepoints serve different operational purposes. Thus, we now made it possible to take savepoints in the native state backend specific format, while still maintaining some characteristics of savepoints (i.e. making them relocatable).
Another issue reported with externalized checkpoints is that it is not clear who owns the checkpoint files (Flink or the user?). This is especially problematic when it comes to incremental RocksDB checkpoints where you can easily end up in a situation where you do not know which checkpoints depend on which files which makes it tough to clean those files up. To solve this issue, we added explicit restore modes (CLAIM, NO_CLAIM, and LEGACY) which clearly define whether Flink should take care of cleaning up the snapshots or whether it should remain the user’s responsibility. .
The new restore modes #
The Restore Mode
determines who takes ownership of the files that make up savepoints or
externalized checkpoints after they are restored. Snapshots, which are either checkpoints or savepoints
in this context, can be owned either by a user or Flink itself. If a snapshot is owned by a user,
Flink will not delete its files and will not depend on the existence
of such files since it might be deleted outside of Flink’s control.
The restore modes are CLAIM
, NO_CLAIM
, and LEGACY
(for backwards compatibility). You can pass the restore mode like this:
$ bin/flink run -s :savepointPath -restoreMode :mode -n [:runArgs]
While each restore mode serves a specific purpose, we believe the default NO_CLAIM mode is a good tradeoff in most situations, as it provides clear ownership with a small price for the first checkpoint after the restore.
Let’s dig further into each of the modes.
LEGACY mode #
The legacy mode is how Flink dealt with snapshots until version 1.15. In this mode, Flink will never delete the initial checkpoint. Unfortunately, at the same time, it is not clear if a user can ever delete it as well. The problem here is that Flink might immediately build an incremental checkpoint on top of the restored one. Therefore, subsequent checkpoints depend on the restored checkpoint. Overall, the ownership is not well defined in this mode.
NO_CLAIM (default) mode #
To fix the issue of files that no one can reliably claim ownership of, we introduced the NO_CLAIM
mode as the new default. In this mode, Flink will not assume ownership of the snapshot and will leave the files in
the user’s control and never delete any of the files. You can start multiple jobs from the
same snapshot in this mode.
In order to make sure Flink does not depend on any of the files from that snapshot, it will force
the first (successful) checkpoint to be a full checkpoint as opposed to an incremental one. This
only makes a difference for state.backend: rocksdb
, because all other state backends always take
full checkpoints.
Once the first full checkpoint completes, all subsequent checkpoints will be taken as usual/configured. Consequently, once a checkpoint succeeds, you can manually delete the original snapshot. You can not do this earlier, because without any completed checkpoints, Flink will - upon failure - try to recover from the initial snapshot.
CLAIM mode #
If you do not want to sacrifice any performance while taking the first checkpoint, we suggest
looking into the CLAIM
mode. In this mode, Flink claims ownership of the snapshot
and essentially treats it like a checkpoint: it controls the lifecycle and might delete it if it is
not needed for recovery anymore. Hence, it is not safe to manually delete the snapshot or to start
two jobs from the same snapshot. Flink keeps around a configured number of checkpoints.
Savepoint format #
You can now trigger savepoints in the native format of state backends. This has been introduced to match two characteristics, one of both savepoints and checkpoints:
- self-contained, relocatable, and owned by users
- lightweight (and thus fast to take and recover from)
In order to provide the two features in a single concept, we provided a way for Flink to create a
savepoint in a (native) binary format of the used state backend. This brings a significant difference
especially in combination with the state.backend: rocksdb
setting and incremental snapshots.
That state backend can leverage RocksDB native on-disk data structures which are usually referred to as SST files. Incremental checkpoints leveraged those files and are collections of those SST files with some additional metadata, which can be quickly reloaded into the working directory of RocksDB upon restore.
Native savepoints can use the same mechanism of uploading the SST files instead of dumping the entire state into a canonical Flink format. There is one additional benefit over simply using the externalized incremental checkpoints: native savepoints are still relocatable and self-contained in a single directory. In case of checkpoints that do not hold, because a single SST file can be used by multiple checkpoints, and thus is put into a common shared directory. That is why they are called incremental.
You can choose the savepoint format when triggering the savepoint like this:
# take an intermediate savepoint
$ bin/flink savepoint --type [native/canonical] :jobId [:targetDirectory]
# stop the job with a savepoint
$ bin/flink stop --type [native/canonical] --savepointPath [:targetDirectory] :jobId
Capabilities and limitations #
Unfortunately it is not possible to provide the same guarantees for all types of snapshots (canonical or native savepoints and aligned or unaligned checkpoints). The main difference between checkpoints and savepoints is that savepoints are still triggered and owned by users. Flink does not create them automatically nor ever depends on their existence. Their main purpose is still for planned, manual backups, whereas checkpoints are used for recovery. In database terms, savepoints are similar to backups, whereas checkpoints are like recovery logs.
Having additional dimensions of properties in each of the two main snapshots category does not make it easier, therefore we try to list what you can achieve with every type of snapshot.
The following table gives an overview of capabilities and limitations for the various types of savepoints and checkpoints.
- ✓ - Flink fully supports this type of snapshot
- x - Flink doesn’t support this type of snapshot
| Operation | Canonical Savepoint | Native Savepoint | Aligned Checkpoint | Unaligned Checkpoint |
|---|---|---|---|---|
| State backend change | ✓ | x | x | x |
| State Processor API(writing) | ✓ | x | x | x |
| State Processor API(reading) | ✓ | ✓ | ✓ | x |
| Self-contained and relocatable | ✓ | ✓ | x | x |
| Schema evolution | ✓ | ✓ | ✓ | ✓ |
| Arbitrary job upgrade | ✓ | ✓ | ✓ | x |
| Non-arbitrary job upgrade | ✓ | ✓ | ✓ | x |
| Flink minor version upgrade | ✓ | ✓ | ✓ | x |
| Flink bug/patch version upgrade | ✓ | ✓ | ✓ | ✓ |
| Rescaling | ✓ | ✓ | ✓ | ✓ |
- State backend change - you can restore from the snapshot with a different state.backend than the one for which the snapshot was taken
- State Processor API (writing) - The ability to create new snapshot via State Processor API.
- State Processor API (reading) - The ability to read state from the existing snapshot via State Processor API.
- Self-contained and relocatable - One snapshot directory contains everything it needs for recovery. You can move the directory around.
- Schema evolution - Changing the data type of the state in your UDFs.
- Arbitrary job upgrade - Restoring the snapshot with the different partitioning type(rescale, rebalance, map, etc.) or with a different record type for the existing operator. In other words you can add arbitrary operators anywhere in your job graph.
- Non-arbitrary job upgrade - In contrary to the above, you still should be able to add new operators, but certain limitations apply. You can not change partitioning for existing operators or the data type of records being exchanged.
- Flink minor version upgrade - Restoring a snapshot which was taken for an older minor version of Flink (1.x → 1.y).
- Flink bug/patch version upgrade - Restoring a snapshot which was taken for an older patch version of Flink (1.14.x → 1.14.y).
- Rescaling - Restoring the snapshot with a different parallelism than was used during the snapshot creation.
Summary #
We hope the changes we introduced over the last releases make it easier to operate Flink in respect to snapshotting. We are eager to hear from you if any of the new features have helped you solve problems you’ve faced in the past. At the same time, if you still struggle with an issue or you had to work around some obstacles, please let us know! Maybe we will be able to incorporate your approach or find a different solution together.


The Gallery of Horns - Page 2
Filter by Keyword
Link to Page 1
Sort by Animal Name
Sort by Number of Horns


Panel Overview
intuitive interaction and the integration of technology and space
As more and more companies develop “smart” products, it has become increasingly clear that these devices are, in fact, quite dumb. As our panelists will tell you, a smart product is not made from a touch screen and an internet connection: it is made from thoughtful, considered design, that imagines new possibilities for the interaction and integration between the digital and the physical.
Through a review of a variety of design case studies, our panelists will put forward alternative ideas for what constitutes a “smart” device.
Panel Overview
articulating issues of urban planning in a design context
As cities continue to flourish as economic and cultural centers around the globe, their increasing size and population density have led to serious issues in infrastructural access and load.
Led by Janetta Sadik-Khan and Antenna Design, this panel seeks to examine the current problems facing our cities today, and imagine new possibilities for what they could be in the future.
Panel Overview
the spread of design thinking
Design has become increasingly recognized by organizations across the world, not only as a tool for the development of digital or physical product, but as a means of inspiring creativity, driving innovation, and tackling problems ranging from improving the accessibility of voting systems to coordinating living arrangements.
Beginning with a moderated panel discussion, all those in attendance will then be invited to break out into separate roundtable groups, focusing specifically on integrating design thinking into small businesses, larger corporations, and public entities.
Panel Overview
the internet and the rise of decentralized innovation
In recent decades, there has been significant development in the ability of ordinary individuals to design, prototype, and fabricate devices that augment and improve everyday life. Driven by the open and free distribution of information through the internet, this new world of user-driven design and fabrication is poised to reach new heights in the coming years.
Join DIY and internet experts as they break down potential future developments in the field of DIY electronics. A hands-on lab experience with the latest Arduino Zero microcontrollers will be held with all attendees.


The competitive hacker club of Canada's university.
This page is under construction. Please check back later for updated information about the 2018 CS Games team and our tryouts.


Competitive Analysis
Many existing websites and apps that offer support to people wishing to stop drinking have a gloomy, clinical, and guilt-bearing approach. We broadened our research to cover social websites, which inspired us to encourage people to interact online.
User Research
To help us understand the Club Soda target, first we created an online survey asking what people are looking for in a community when they decided on a big change in their lives. Next we conducted in-depth interviews with existing participants of the Club Soda community: 6 members; and 5 experts.
Personas
Analysing the data from the survey and interviews, we identified some patterns and created personas to make tangible our findings. Julia represents the members’ side and Angelo the experts’. Their needs, pain points, and habits drove our decisions.
User Journey
We mapped out Club Soda's current opportunities for interaction for members and experts in their first access to the site. The lower points are the worst experiences during their journeys. These graphics became our guideline for feature improvements.
Design Studio
In a workshop with the Club Soda founder, developers, members, and enthusiasts, we started the feature prioritization and drew the first sketches in a method where everybody participates in the design process.
User testing
From paper to high fidelity digital prototyping, 13 users tested our design, in 5 rounds of iterations based upon their feedback. After further iterations we proceeded to our deliverable prototype.


Provides an interface to sample data, for use by methods such as cross-validation
Inheritance:
Public Fields
-
int** train_subsets
- Training examples for each fold
-
int** test_subsets
- Test examples for each fold
-
int* n_train_subsets
- Number of training examples for each fold
-
int* n_test_subsets
- Number of test examples for each fold
Public Methods
-
KFold(Trainer* trainer_, int kfold_)
-
virtual void crossValidate(DataSet* data, MeasurerList* train_measurers=NULL, MeasurerList* test_measurers=NULL, MeasurerList* cross_valid_measurers=NULL)
- Do a cross-validation over data.
-
virtual void sample(int n_examples)
- Prepare the sample.
Inherited from Object:
Public Fields
-
Allocator* allocator
Public Methods
-
void addOption(const char* name, int size, void* ptr, const char* help="")
-
void addIOption(const char* name, int* ptr, int init_value, const char* help="")
-
void addROption(const char* name, real* ptr, real init_value, const char* help="")
-
void addBOption(const char* name, bool* ptr, bool init_value, const char* help="")
-
void addOOption(const char* name, Object** ptr, Object* init_value, const char* help="")
-
void setOption(const char* name, void* ptr)
-
void setIOption(const char* name, int option)
-
void setROption(const char* name, real option)
-
void setBOption(const char* name, bool option)
-
void setOOption(const char* name, Object* option)
-
virtual void loadXFile(XFile* file)
-
virtual void saveXFile(XFile* file)
-
void load(const char* filename)
-
void save(const char* filename)
-
void* operator new(size_t size, Allocator* allocator_=NULL)
-
void* operator new(size_t size, Allocator* allocator_, void* ptr_)
-
void operator delete(void* ptr)
Documentation
Provides an interface to sample data, for use by methods such
as cross-validation
- int** train_subsets
- Training examples for each fold
- int** test_subsets
- Test examples for each fold
- int* n_train_subsets
- Number of training examples for each fold
- int* n_test_subsets
- Number of test examples for each fold
- KFold(Trainer* trainer_, int kfold_)
- virtual void crossValidate(DataSet* data, MeasurerList* train_measurers=NULL, MeasurerList* test_measurers=NULL, MeasurerList* cross_valid_measurers=NULL)
- Do a cross-validation over data.
train_measurers are called in each "train pass" for each fold.
test_measurers are called in each "test pass" for each fold.
cross_valid_measurers are called during the cross-validation loop.
- virtual void sample(int n_examples)
- Prepare the sample.
Given n_examples, puts the right examples-indices in train_subsets
and test_subsets, and updates n_train_subsets and n_test_subsets.
(You don't have to allocate these arrays).
The provided sample function is a standard sample for cross-validation,
but you could imagine what you want!
- This class has no child classes.
- Author:
- Samy Bengio<EMAIL_ADDRESS>Ronan Collobert<EMAIL_ADDRESS>Alphabetic index HTML hierarchy of classes or Java
This page was generated with the help of DOC++.


Suarez: Barca Stars Had No Say In Neymar Transfer!
by SL InternationalFC Barcelona superstar Luis Suarez has played down Gerard Pique's comments regarding the club's pursuit of Paris Saint-Germain star Neymar.
Read: 'I Could Have Been Mentioned Alongside Messi & Ronaldo'
Neymar was involved in the biggest transfer saga in the last window after the Ligue 1 giants revealed he wanted to leave the club, with a return to Barcelona on the cards.
Pique revealed last month some of the players would change their contracts due to the Financial Fair Play issue should they sign the Brazilian.
However, Suarez insists the players had no say when it came to the pursuit of their former star, who registered 105 goals and 76 assists in 186 appearances.
"Sometimes you have to take what Geri says with a pinch of salt," Suarez told Sport.
"He has the gift of the gab and a lot of experience in making comments. In this case, he knows and is completely aware that the players were completely removed from the Ney case.
"We were ready to welcome him - him or any other player that wants to come - but always distanced from what was going on."


This document gives a few suggestions to analyse a dataset composed by a numeric variable measured on groups and subgroups, with several observations for each combinations.
The dataset used as an example describes the amount that restaurant staff receive in tips based on various indicators like the client sex, the day of the week and if the client smokes or not.
Data come from the Seaborn Python library. A clean .csv
version is available in the data-to-viz.com github repository.
# Libraries
library(tidyverse)
library(hrbrthemes)
library(kableExtra)
options(knitr.table.format = "html")
library(viridis)
library(ggrepel)
library(plotly)
# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/10_OneNumSevCatSubgroupsSevObs.csv", header=T, sep=",") %>%
mutate(tip = round(tip/total_bill*100, 1))
# show data
data %>% head(6) %>% select(tip, sex, day, smoker) %>% kable() %>%
kable_styling(bootstrap_options = "striped", full_width = F)
| tip | sex | day | smoker |
|---|---|---|---|
| 5.9 | Female | Sun | No |
| 16.1 | Male | Sun | No |
| 16.7 | Male | Sun | No |
| 14.0 | Male | Sun | No |
| 14.7 | Female | Sun | No |
| 18.6 | Male | Sun | No |
The most common way to represent that kind of dataset is probably the grouped boxplot. Each combination of group is represented by a box. This allows to quickly understand what is the distribution of the numeric variable for each combination.
Here, it looks like there is not much difference in tip values from one day to the other in average, except a slight increase on sunday. Moreover, it looks like females tend to tip more than males on friday. Note that individual data points are presented using jittering
, what allows to detect more particular pattern and assess the sample size of each group.
# Counts the number of value per group and subgroup
counts = data %>%
group_by(day, sex) %>%
summarize(
n=n(),
median=median(tip)
)
# Grouped
data %>%
mutate(day = fct_reorder(day, tip)) %>%
mutate(day = factor(day, levels=c("Thur", "Fri", "Sat", "Sun"))) %>%
ggplot(aes(fill=sex, y=tip, x=day)) +
geom_boxplot(position=position_dodge2(preserve = "total"), alpha=0.5, outlier.colour="transparent", varwidth = TRUE) +
geom_point(color="grey", size=1, width=0.1, position=position_jitterdodge() , alpha=0.4) +
scale_fill_viridis(discrete=T, name="") +
geom_text(data=counts, aes(label=paste0("n: ",n), y=median-2), position=position_dodge(1), hjust=0.5) +
theme_ipsum() +
xlab("") +
ylab("Tip (%)") +
ylim(0,35)
In the above chart categories are grouped by day. It is possible to build the same kind of visualization, grouping by Sex instead. In the first case, it is easy to compare the behavior or each sex day by day. On the second one, the idea is more to compare the difference by day for each sex.
# Grouped
data %>%
mutate(day = fct_reorder(day, tip)) %>%
mutate(day = factor(day, levels=c("Thur", "Fri", "Sat", "Sun"))) %>%
ggplot(aes(fill=day, y=tip, x=sex)) +
geom_boxplot(position="dodge", alpha=0.5, outlier.colour="transparent") +
geom_point(color="grey", size=1, width=0.1, position=position_jitterdodge() , alpha=0.4) +
scale_fill_viridis(discrete=T, name="") +
theme_ipsum() +
xlab("") +
ylab("Tip (%)") +
ylim(0,40)
The violin plot can be used exactly in the same situation that the boxplot. Using the same grouping technique, we got here a grouped violin plot.
# Grouped
data %>%
mutate(day = fct_reorder(day, tip)) %>%
mutate(day = factor(day, levels=c("Thur", "Fri", "Sat", "Sun"))) %>%
ggplot(aes(fill=sex, y=tip, x=day)) +
geom_violin(position="dodge", alpha=0.5, outlier.colour="transparent") +
scale_fill_viridis(discrete=T, name="") +
theme_ipsum() +
xlab("") +
ylab("Tip (%)") +
ylim(0,40)
Small multiple is a powerful technique that can be used with that kind of data. Here, each combination is represented in a part of the grid, allowing a quick comparison between them. Histograms are used here, but the same result could be obtained with density plot.
# Grouped
data %>%
mutate(day = fct_reorder(day, tip)) %>%
mutate(day = factor(day, levels=c("Thur", "Fri", "Sat", "Sun"))) %>%
ggplot(aes(x=tip)) +
geom_histogram(bins=20, fill="#69b3a2", color="white") +
facet_grid(sex~time) +
theme_ipsum() +
xlab("") +
ylab("Tip")
You can learn more about each type of graphic presented in this story in the dedicated sections. Click the icon below:
Any thoughts on this? Found any mistake? Have another way to show the data? Please drop me a word on Twitter or in the comment section below:
A work by Yan Holtz for data-to-viz.com


Amaya is a Web client that acts both as a browser and as an authoring tool. It has been designed by W3C with the primary purpose of demonstrating new Web technologies in a What You See Is What You Get (WYSIWYG) environment. The current version implements the Hypertext Markup Language (HTML), Extensible Hypertext Markup Language (XHTML), Mathematical Markup Language (MathML), Scalable Vector Graphics (SVG), the animation module of Synchronized Multimedia (SMIL Animation), Cascading Style Sheets (CSS), and Hypertext Transfer Protocol (HTTP).
With Amaya, you can manipulate rich Web pages containing forms, tables, and the most advanced features from HTML. You can create and edit complex mathematical expressions and simple SVG graphics within Web pages. You can style your documents using Cascading Style Sheets. You can publish HTML, XHTML, MathML, and SVG documents on local or remote servers through HTTP. A first support of generic Extensible Markup Language (XML) allows you to display the content of every XML document and to associate with it a CSS Stylesheet.
Browsing and authoring are integrated seamlessly. You can browse and edit Web pages at the same time. To make editing easier, a simple click in Amaya moves the caret and allows text input; to follow a link, you have to double click. This behavior can be changed as well as many other features using the Edit/Preferences menu.
Amaya includes a collaborative annotation application based on W3C technologies (Resource Description Framework (RDF), XLink, and XPointer). Annotations are external comments, notes, remarks that can be attached to any Web document or a selected part of the document. Annotations are stored either in the local file system or on publically-accessible annotation servers. The creation of annotations on a document does not modify the document itself.
A User's Manual is available online. You can access it with the Help menu, which displays each section separately. You can also print it: just follow this Online Manual link. You will get the front page. Then build the whole book with the "Make book" entry from the XHTML menu and print the result.
Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee or royalty is hereby granted, provided that the full text of the MIT and INRIA Copyright Statement appears with all copies of the software and documentation or portions thereof, including modifications that you make.


Menu
Order
About
Location
Contact
Menu
Hours
Order Now
Order form
Quick. Efficient. Quality
Pizza
Crust
Thin
Thick
Type
Small (10")
Medium (13")
Large (15")
Cheese
Pepperoni
The Hog
Veggie
Hawaiian
Supreme
Drinks
Coke
Diet Coke
Dr.Pepper
Sprite
Iced Tea
Sides
Salad
Sticks
Sticks (Cheese)
Submit


Heavenly Father, I have sinned against you. I want forgiveness for all my sins. I believe that Jesus died on the cross for me and rose again. Father, I give you my life to do with as you wish. I want Jesus Christ to come into my life and into my heart. This I ask in Jesus' name. Amen.
New Believer Questions and Directions


--- layout: post title: Brand new published: true date: 2010-09-01 categories: [] posterous_url: http://blog.hungerandthirstdesign.com/post/1047073980/brand-new posterous_slug: post/1047073980/brand-new ---
First job as a freelance web designed is now out in the wild.
Still wrestling between domain name providers to transfer the old domain over (from NetworkSolutions to GoDaddy). Just as a technical FYI, NetworkSolutions currently does not allow setting of a single A Record name (say www) to multiple ip addresses (as is needed with Heroku via this article.
Still work to be done in allowing the end admins to be able to customize the copy without my intervention, but that’ll come. This weekend was the deadline to make the switch over from their old static page site to mine. Not too bad….


About {{domain}}
A simple and modern URL shortener built with Express.js, MongoDB, and Handlebars.js built for easy deployment to Heroku!
System Info
Node Env: {{config.nenv}}
Short Domain: {{config.domain}}
Base URL: {{config.externalUrl}}
Base Redirect URL: {{config.mainDomain}}
URL Not Found Redirect: {{config.notFoundRedirect}}


|
Systolic Simulator
A simulation of systolic algorithmic flow in C++
|
Simulation of the flow of systolic algorithms; where computational units called "cell" are working on parallel, computing the result given by the last cell before feeding the result into the next one.
This project is done in “modern” C++ with CMake and hence required:
The geneal usage of the Systolic Simulator is to decalare a new container of type Systolic::Container
and to generate a predefined amount of cells, whose type and value are configurable by the user.
To simplify the creation of cells, the use of the Systolic::Container::CellArrayBuilder
can be used in conjonction with the board, to generate the instances of the cells from theit types and value. Special cases are made for polynomial equations.
The Container can then be used to solves the equation either step by step, using the step()
function or until completion using the compute()
function.
Results and logs of the computations, partial or completed, can be queried using respectively dumpOutput()
, getCurrentLog()
or getLog()
.
Additional information about using the Systolic Simulator library can be found in the Doc folder.
The command line usage of the library is intended to be used for solving polynomial equation using the Horner's Rule.
For this end, the user must enter either all the coefficients of the operation in order using the --coefs=
option or directly the equation using the --equation=
option as well as the values of X using --with-x=
.
The CLI offers the following options:
### On UNIX
will create an executable named systolic
at the root of the build
folder.
Using the Developer Command Prompt for Visual Studio: First, create the folder:
Then, generate the project file: For the latest Msvc in date:
Or for previous releases:
Lastly, compile the program:
A program named systolic.exe
will now be present in the build\Release
folder.
Every files of this repository is licensed under Apache License 2.0.
Please see the LICENSE file for further information.
Régis BERTHELOT, 2019, as part of his master degree at the UVT.


Table of Contents
Help System
Aoi's help system makes it easy to find the command you're looking for without leaving Discord. It consists of 3 basic commands:-
,modules
- this command lists Aoi's modules -
,commands module_name
- this command shows you the commands in a specified moduleBy default, this command only shows you the commands you can run in the current channel. To change this, you can use,cmds module_name --all
-
,help command_name
- this command gives you help for a specific command
,help
can look up commands by their
alias, too. For example, ,help
's alias is ,h
, so the two can be used interchangeably.
Server Configuration
,configs
- View your server configs,configs settings value
- Set a server config. You need Manage Server for this.
| Setting | Explanation | Type | Default |
|---|---|---|---|
| {{config.name}} | {{config.description}} | {{config.type}} | {{config.default}} |
{{config.name}}
- Type: {{config.type}}
- Default: {{config.default}}
- {{config.description}}
What's with colors?
Aoi accepts a few different color formats for commands that use them.
- 6 digit hex colors (
000000
) - 3 digit hex colors (
000
) -
Extended colors Expand color list
{% for color in webcolors %}{% endfor %}{{color}} {{webcolors[color]}}
I want to host my own copy of Aoi! How can I do that?
As of the writing of this guide, the selfhost script for Aoi is a WIP, but you can still selfhost by following the directions below
Install prerequisites
You need to be running at least Python 3.8 to run Aoi.
- For Windows and Linux machines with a GUI, you can get python from here
- For Linux machines without a GUI:
- Debian/Ubuntu -
sudo apt install python3
- OpenSUSE -
sudo zypper in python3
- Debian/Ubuntu -
You also need git and redis
- For Windows, you can get git from here and redis from
- For Linux, install via your package manager
- Debian/Ubuntu -
sudo apt install git redis
- OpenSUSE -
sudo zypper in git redis && sudo systemctl start redis@yourusername
- Debian/Ubuntu -
Downloading Aoi
Once you have Python and git installed, you can download Aoi from github by running the following commands
git clone https://github.com/aoi-bot/Aoi.git cd Aoi git submodule init git submodule update
Setting up a virtual environment
Run the following commands to install venv and activate the virtual environment where you'll be installing Aoi's dependencies
-
Windows
py -m pip install --user virtualenv py -m venv venv .\venv\Scripts\activate
-
Linux
python3 -m pip install --user virtualenv python3 -m venv venv source venv/bin/activate
Next, install the prerequisites Aoi needs
pip install -U -r requirements.txt
Set up your .env
file
- Make a copy of the file named
.env-example
in theAoi
folder. Name it.env
- Open the file in a text editor
.env
file. An explanation of each key is below
TOKEN
- this is your bot's token. You can use this guide to show you how to make a bot accountThis is the only required API key or token. The rest that follow are for using specific commands or groups of commands in Aoi.WEATHER_GOV_API
- according to weather.gov, this should be something that uniquely identifies your application. Used for weather related commandsGOOGLE_API_KEY
- used for the geolocation commands. See Google's documentation on how to get your key and activate itNASA
- used for LANDSAT and APOD commands. See api.nasa.gov for information on how to get your keyIMGUR
andIMGUR_SECRET
- used for imgur command. See Imgur's site for documentation on how to get your keyPATREON_ID
andPATREON_SECRET
- set these if you want to allow users to get global currency for donating to your patreon. See this tutorial to get them
Start Aoi
To start Aoi, simply runpython main.py
Updating Aoi
- Stop the bot
- Reactivate your virtualenv if you have to
- Windows -
.\venv\Scripts\activate
- Linux -
source venv/bin/activate
- Windows -
-
Update the bot with
git pull --recurse-submodules
-
Make sure your dependencies are up to date with
pip install -U -r requirements.txt
- Start the bot, as above
How to: Leave and Join messages
,cmds WelcomeGoodbye
Welcome to Gaming Server, @jimmy!
Jimmy#4452 has left us. :(Run the following commands:
,joinmsg Welcome to **&guild_name;**, &user_mention;!
- this sets the message,joinmsgchnl #general
- to set the channel,joinmsgdel 120
- 120s = 2m,leavemsg &user_tag; has left us :(
- this sets the message,leavemsgchnl #general
- to set the channel,leavemsgdel 120
- 120s = 2m
How to: Role add message
Aoi has a feature to send a message in a designated channel when a role is added to or removed from someone. This can be used to welcome someone to your staff team, or thank your new donors. These commands are located in the Triggers module. You can view the commands with,cmds Triggers
For example, if your staff role is @Staff, then you can run:
,onroleadd @Staff #staff-channel
Welcome to the staff team, &user_mention;!
If you don't want to mention the role, you can also
use
its ID.
Placeholders
Placeholders can be used in many places that take a message, such as greetings.| Placeholders | Explanation | Example |
|---|---|---|
&{{placeholder.name}}; |
{{placeholder.description}} | {{placeholder.example}} |
&{{placeholder.name}};
- Example: {{placeholder.example}}
- {{placeholder.description}}


The Web was invented around 1990's and approximately has 30 billion pages today. Whether it is a Document or an image or a video on the web they are linked or glued together through HTML .The Web is a collection of many HTML documents.When a person uses the internet through his browser , a request is placed to the server through HTTP (Hypertext Transfer Protocol) . Then the Server finds that particular HTML document and sends it to the user through the same channel. Here is a video that explains the concept more clearly.
HTML stands for Hyper text Markup Language . HTML is made up of text content (what you see ), markup (what it looks like), links to other pages and reference to other documents (like videos or images ).
HTML Markups are set of commands inserted in a file for a particular display on the browser. They are made up of elements and tags. An example of basic tag is explained in this particular video . Tags are single commands placed between brackets whereas elements are components of HTML document. This video explains it in detail.
When a user while writing a HTML Document wants to refer a particular link on the web in this particular document, he uses the HTML attributes for the tag which in this case is an anchor tag. A clear example is given in this video
Both these elements are used to organise the content. But there is a difference in the usage. Inline elements can display the organised content and span the space of the content. Whereas block elements place an invisible block around the content allowing it to be displayed as a new line. Unlike inline elements, block elements occupy the width of the parent if no width is specified. Here is a video thats explains this concept.
While creating HTML document in order to add spaces between the lines or to create a new paragraph, there must be a specific command in the text. otherwise, all the spaces given through tab are deleted while displaying the content. The additional space is called the whitespace
A developer tool enables a developer to view the structure of the page as interpreted by browser. While coding if there are any errors or any visual changes that are required those can be identified through developer tools. By using inspect element we can look into the details of an element.
HTML, CSS and JavaScript are the important components of the web. HTML is the structure of the webpage,CSS controls the style of the page. whereas Javascript is a scripting language which allows to manupalate the DOM. DOM represents tree like structure of a page. These three components together form the Web page.
Elements can have other elements inside them which forms a structure similar to the family tree structure and hence the name. In a browser this structure comes up as a series of boxes inside other boxes and so on.
Everything on the webpage is made up of grids or boxes. Even if the images are of irregular shapes CSS styles it in a rectangular box. Boxes are placed around every single element that is to be displayed on the page.
Programmers use special text editing program like sublime text to code HTML document. A text editor is a program that helps to type the text in a particular format that computer understands. later, that editorial is converted in a document that other people read.
CSS is Cascading Style Sheets
. It also can be interpreted as a search and replace tool. Idetify a class/tag of the element you want to find, and than what you want to do with it (or) add property values to replace it with different ones. CSS is a code written to control the style
of a page.
While writing a Code it is very essential to avoid repetitions otherwise, programmers have to do the same thing again and again. Doing it repetitie times can lead to errors. Some errors are so small that it can become very difficult to locate them.
The process is simply divided into three parts Code
, Test
and refine
. First programmers will write a code, than test it and finally if required make any changes. There are a few steps involved.
steps:


Hi sorry for the english but I'm using google.
Let me know if you can extend many meters of cables of the current sensors.
The current sensors can be installed in junction boxes, together with other cables must be isolated
length current sensors
Submitted by Guest on Sun, 18/11/2012 - 10:33»
Re: length current sensors
I think you should keep them as short a possible. Can someone confirm if this is true?
Re: length current sensors
Some considerations:
If the CT's are located too far away from the emonTx then you should consider loss in the current measured and interference from other electromagnetic sources like other high current conductors in the vicinity.
Depending on the distance you need you can try to use a very good quality shielded wires, like coaxial cables.
Since the impedance presented by the emonTx is very low (the burden resistor mainly, which is around 20 to 50 ohms) the type of cable wont`t make substantial differences, just use a good one but keep them as short as possible anyway.
Hope this helps.
Re: length current sensors
Two points.
The main problem is likely to be interference from other cables and switches. Avoid running the cable parallel to any other cable unless at least 1 m separates the two cables, if it must cross, cross at 90°.
A cable like this http://uk.rs-online.com/web/p/multicore-microphone-instrument-cable/2074... should be suitable.
You should keep the cable as short as possible.
Re: length current sensors
so if there are other cables near to interference?
how far you have to find??


TomEE provides a simple but powerful way to define resources that can be injected into managed components inside your application, or looked up via JNDI. To use a resource, it needs to be defined in the tomee.xml
configuration file, a resources.xml
file within an application, or as a system property. Defining a resource in tomee.xml
will make it available server-wide, whereas defining the resource within a resources.xml
file makes it available to a specific application.
As a simple example, a JMS queue can be defined within tomee.xml
with the following configuration.
<tomee>
<Resource id="MyQueue" type="javax.jms.Queue"/>
</tomee>
Once the resource has been defined, the server will create an instance of the resource during startup, and it will be available to be injected into managed components using the @Resource
annotation, as shown below. The name
attribute on the @Resource
annotation should match the id
attribute on the Resource
tag.
public class JmsClient {
@Resource(name="MyQueue")
private Queue queue;
public void sendMessage() {
// implementation here...
}
}
As an alternative to defining a resource in XML, resources can also be defined using system properties:
MyQueue = new://Resource?type=javax.jms.Queue
Resources, or attributes for resources specified using system properties will override definitions specified in tomee.xml
.
Server-wide resources can be looked up in JNDI under the following name: openejb:Resources/resource id.
The <Resource>
tag has a number of attributes, and a resource may also have a number of fields that can be configured by adding properties to the body of the Resource
tag.
For example, a DataSource resource needs a JDBC driver, URL, username and password to be able to connect to a database. That would be configured with the following syntax. Notice the key/value pair syntax for the properties within the <Resource>
tag.
<Resource id="DB" type="DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://localhost/test
UserName test
Password password
</Resource>
Specifying the key/value pairs specific to a Resource can also be done when defining the resource via system properties. This is done be specifying an additional property for each key/value pair, using the resource ID as a prefix: <resourceId>.<propertyName>=<value>
. The system properties equivalent of the resource above is:
p.setProperty("DB", "new://Resource?type=DataSource");
p.setProperty("DB.JdbcDriver", "com.mysql.jdbc.Driver");
p.setProperty("DB,JdbcUrl", "jdbc:mysql://localhost/test");
p.setProperty("DB.UserName", "test");
p.setProperty("DB.Password", "password");
The <Resource>
tag has a number of attributes which control the way that the resource get created.
A type that TomEE knows. The type is associated with a provider that knows how to create that type, and also any default properties that the resource should have if they are not specified in the resource definition. See service-jar.xml for an example set of service providers that come with TomEE.
Explicitly specifies a provider to create the resource, using defaults for any properties not specified.
The fully qualified class that creates the resource. This might the resource class itself, which is created by calling the constructor, or a factory class that provides a specific factory method to create the resource.
The name of the method to call to create the resource. If this is not specified, the constructor for the class specified by class-name will be used.
Specifies a comma separated list of constructor arguments. These can be other services, or attributes on the resource itself.
TomEE allows you to define resources using your own Java classes, and these can also be injected into managed components in the same way as known resource types are.
So the following simple resource
public class Configuration {
private String url;
private String username;
private int poolSize;
// getters and setters
}
Can be defined in tomee.xml
using the following configuration (note the class-name
attribute):
<Resource id="config" class-name="org.superbiz.Configuration">
url http://localhost
username tomee
poolSize 20
</Resource>
This resource must be available in TomEE's system classpath - i.e. it must be defined in a .jar within the lib/
directory.
As shown above, a resource class can define a number of fields, and TomEE will attempt to apply the values from the resource definition onto those fields.
As an alternative to this, you can also add a properties field as shown below, and this will have any used properties from the resource configuration set added to it. So as an alternative to the above code, you could do:
public class Configuration {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(final Properties properties) {
this.properties = properties;
}
}
Using the same resource definition:
<Resource id="config" class-name="org.superbiz.Configuration">
url http://localhost
username tomee
poolSize 20
</Resource>
the url, username and poolSize values will now be available in the properties field, so for example, the username property could be accessed via properties.getProperty("username");
Resources can also be defined within an application, and optionally use classes from the application's classpath. To define resources in a .war file, include a WEB-INF/resources.xml
. For an ejb-jar module, use META-INF/resources.xml
.
The format of resources.xml
uses the same <Resource>
tag as tomee.xml
. One key difference is the root element of the XML is <resources>
and not <tomee>
.
<resources>
<Resource id="config" class-name="org.superbiz.Configuration">
url http://localhost
username tomee
poolSize 20
</Resource>
</resources>
This mechanism allows you to package your custom resources within your application, alongside your application code, rather than requiring a .jar file in the lib/
directory.
Application resources are bound in JNDI under openejb:Resource/appname/resource id.
Resources are typically discovered, created, and bound to JNDI very early on in the deployment process, as other components depend on them. This may lead to problems where the final classpath for the application has not yet been determined, and therefore TomEE is unable to load your custom resource.
The following properties can be used to change this behavior.
This is a boolean value, which when true, creates a proxy that defers the actual instantiation of the resource until the first time it is looked up from JNDI. This can be useful if the resource's classpath until the application is started (see below), or to improve startup time by not fully initializing resources that might not be used.
This boolean value forces a lazily instantiated resource to use the application classloader, instead of the classloader available when the resources were first processed.
This boolean setting forces a resource created with the Lazy property to be instantiated once the application has started, as opposed to waiting for it to be looked up. Use this flag if you require the resource to be loaded, irrespective of whether it is injected into a managed component or manually looked up.
By default, all of these settings are false
, unless TomEE encounters a custom application resource that cannot be instantiated until the application has started. In this case, it will set these three flags to true
, unless the Lazy
flag has been explicitly set.
By default, if no factory-name attribute and no constructor attribute is specified on the Resource
, TomEE will instantiate the resource using its no-arg constructor. If you wish to pass constructor arguments, specify the arguments as a comma separated list:
<Resource id="config" class-name="org.superbiz.Configuration" constructor="id, poolSize">
url http://localhost
username tomee
poolSize 20
</Resource>
In some circumstances, it may be desirable to add some additional logic to the creation process, or to use a factory pattern to create resources. TomEE also provides this facility via the factory-name
method. The factory-name
attribute on the resource can reference any no argument method that returns an object on the class specified in the class-name
attribute.
For example:
public class Factory {
private Properties properties;
public Object create() {
MyResource resource = new MyResource();
// some custom logic here, maybe using this.properties
return resource;
}
public Properties getProperties() {
return properties;
}
public void setProperties(final Properties properties) {
this.properties = properties;
}
}
<resources>
<Resource id="MyResource" class-name="org.superbiz.Factory" factory-name="create">
UserName tomee
</Resource>
</resources>
As an alternative to using a factory method or a constructor, you can use @PostConstruct and @PreDestroy methods within your resource class (note that you cannot use this within a different factory class) to manage any additional creation or cleanup activities. TomEE will automatically call these methods when the application is started and destroyed. Using @PostConstruct will effectively force a lazily loaded resource to be instantiated when the application is starting - in the same way that the InitializeAfterDeployment
property does.
public class MyClass {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(final Properties properties) {
this.properties = properties;
}
@PostConstruct
public void postConstruct() throws MBeanRegistrationException {
// some custom initialization
}
}
}
The following examples demonstrate including custom resources within your application:


Check out the comprehensive documentation here!
- What is FelFlame?
- What is ECS? - Components - Entities - Systems - Scenes - Stage
- Usage
- Contribution
What is FelFlame?
FelFlame is an ECS framework for developing games in the Ruby language. FelFlame has been designed from the ground up with these three ideas in mind:
- Engine Agnostic: FelFlame has been designed to be rendering engine agnostic as long as the target rendering engine is written in Ruby. This means that this framework can be dropped into existing rendering engines such as Ruby2D or DRGTK with little modifications.
- Easily Extensible: FelFlame has been designed such that extensions to its capabilities can be easily added. Extensions such as rendering engine wrappers, premade systems, premade components, etcetera can be easily coded and then distributed as gems.
- Priciple of (My) Least Astonishment: I want to develop games using a language and framework I love and makes sense to me, inspired by the Philosophy of the creator of Ruby.
What is ECS?
ECS is a software architectural pattern that is used in video game development. Traditionally games were programmed using an object oriented method, while ECS instead attempts to program games using a data oriented method instead.
ECS stands for Entity, Component, and System.
Components
This is where the data or information of a given "object" is stored. There is no logic or code here.
Entities
Entities will contain one or more Components, but contains no logic or data otherwise
Systems
Systems are where all the logic or code is kept. There is no data stored in here.
By using this pattern it allows programmers to easily control what an "object" or entity can do and how much data it needs to have. It avoids the issue of inhertance as no inhertance is ever required in this system. If you need a certain entity to have a certain functionality you just add the relevant component to it, and the systems that automatically go over specific components will give your entitiy the desired functionality.
"But your framework also has Scenes
and a Stage
, what is that about?"
Scenes
Scenes are simply a collection or subset of Systems. This allows for an easy way to activate and deactivate Systems.
Stage
The Stage is Scenes which are activated. This means any Scenes on the Stage are executed each frame, while the rest of the Systems are not.
If all of this sounds very confusing, don't worry. A video tutorial series is in the works where I will build a game using this framework and explain every step of the way. You can also read some examples and explanations below.
Usage
To use FelFlame simply install the gem using gem install felflame
or using bundler bundle add felflame
and then require it in your project like so: require 'felflame'
. Working outside of the gem for rendering engines that do not support the usage of gems is a planned feature in the works.
Entities
Creation
Entities are essentially "objects" in the game world. To create a new Entity we do the following:
@entity = FelFlame::Entities.new
or if we want to add (any number of)components to it:
@entity = FelFlame::Entites.new(
FelFlame::Components::Health.new,
@component,
FelFlame::Components::Armour[7]
)
Accessing
Once components are created we can access them using their ID like so:
@entity = FelFlame::Entities[2]
Get ID
Entity ID's are generated starting from 0 and ascending, unless if there is a missing ID because of a deleted entity where a new entity will claim that ID. To get the ID of an Entity:
@entity.id
Adding and Removing Components
We can still add or remove Components from an Entity after it has been created. Here is how:
@entity.add @component
@entity.remove @component
Accessing Entities' Attached Components
When Components are added to Entities, they can be accessed from the Entity. By using a Component Manager as a key we can access an array of all components created from that Component Manager that are attached to an entity:
@entity.components[@component_manager] # => [@component1, @component2, component3]
Deletion
To have all Components from an Entity removed and the Entity deleted we do the following:
@entity.delete
Components
Creating a Component Manager
Components are where all the data is stored. The data is stored in variables or accessors in each component. These accessors and their defaults are configured when a component manager is created, like so:
@component_manager = FelFlame::Components.new('Stats', :armour, hp: 100)
In this example we created a component manager called "Stats".
The name given to component managers must follow the same rules for naming constants in ruby for a reason you will shortly see.
The parameters following are all creating the attributes we can set.
We can set any number of parameters we wish, in this example we define two.
The :armour
parameter is being created without a default, it will equal to nil
when a new component is created, while hp
will be equal to 100 when a component is created.
When defining attributes symbols should be used.
Creating a Component from a Component Manager
Now that we have a component manager we can make components from it like so:
@component = FelFlame::Components::Stats.new
Or we can even change the defaults:
@component = FelFlame::Components::Stats.new(armour: 'steel')
Accessing and Getting ID
Just like Entities, Components have IDs. These IDs are only unique within the scope of their respective Component Managers. Here is how we can get the ID, as well as how to access a Component from its Component Manager.
@component = FelFlame::Components::Stats[2]
@component.id # => 2
Accessing Attributes and Changing Them
There are a few different ways we can read or change the attributes of a component depending on what our needs are. Here are the ways to edit attrubutes, followed by the ways to read them.
@component.armour = 'Mythril'
@component.update_attrs(armour: 'Leather', hp: 95)
@component.hp # => 95
@component.attrs # => {armour: 'Leather', hp: 95}
Deleting Components
Deleting a Component is the same format as deleting an Entity. When a Component is deleted referenced to it such as to entities are automatically cleared.
@component.delete
Iterating over Components
When you make Systems you will want to be able to iterate over all Components of the same Component Manager(for example iterating over all sprites to render them). Here is how we do that:
FelFlame::Components::Sprites.each do |component|
#do something with components
end
Accessing Components' attached Entities
Components also keep track of what Entities are using it. To access this list we do the following:
@component.entities # => [@entity1, @entity2, @entity3]
Systems
Creation
We can create Systems like so:
FelFlame::Systems.new(name: 'Render', priority: 2) do
# Code and Logic
end
The name we assign is how we can access the System, like so:
FelFlame::Systems::Render
Priority determines the order Systems should be executed, this is used for Scenes
and the Stage
.
The lower the number, the earlier a given System will be executed.
E.g priority 1 will go first, priority 2 will go second, etcetera.
Often we will want to execute some logic on each Component in a given Component Manager so our code might look like this:
FelFlame::Systems.new(name: 'Render', priority: 2) do
FelFlame::Components::Sprites.each do |component|
# do something with these components
end
end
Execution
After we create a System, it won't do anything on its own until we tell it to. Here is how:
FelFlame::Systems::Render.call
Sometimes you might want to manually activate a System, but the more common way to have Systems be triggered is to use Scenes and the Stage or the alternative ways of execution.
Alternative Execution
Sometimes you want a System to automatically trigger when a special even happens. FelFlame can keep track of when a Component is added, removed, or when an attribute is changed and then execute Systems linked to these events. Here is how to create these links:
# When this Component is added to an Entity, this System will be called
FelFlame::Systems::PassiveRegen.trigger_when_added(@component)
# When this Component is removed from an Entity, this System will be called
FelFlame::Systems::PassiveRegen.trigger_when_removed(@component)
# When this Component's health attribute is changed, this System will be called
FelFlame::Systems::PassiveRegen.trigger_when_is_set(@component, :health)
If we want these triggers to happen for all Components that belong to specific Component Manager then we can do that instead:
# When a Component from this Component Manager is added to an Entity, this System will be called
FelFlame::Systems::PassiveRegen.trigger_when_added(@component_manager)
# When a Component from this Component Manager is removed from an Entity, this System will be called
FelFlame::Systems::PassiveRegen.trigger_when_removed(@component_manager)
# When this Component's health attribute from this Component Manager is changed, this System will be called
FelFlame::Systems::PassiveRegen.trigger_when_is_set(@component_manager, :health)
We can create any number of these links between Systems, Components, and Component Manangers as we like, simply call the method again with our other Components and Component Managers
Clearing Alternative Executions
If we wish to remove these links that we created, we can do that using the follwing function in any of the following ways:
# clears ALL triggers with this system
FelFlame::Systems::PassiveRegen.clear_triggers
# clears ALL triggers with this Component Manager
FelFlame::Systems::PassiveRegen.clear_triggers(@component)
# clear the 'trigger_when_added' for this Component
FelFlame::Systems::PassiveRegen.clear_triggers(@component, :added)
# clear the 'trigger_when_removed' for this Component
FelFlame::Systems::PassiveRegen.clear_triggers(@component, :removed)
# clear the 'trigger_when_is_set' for this Component specifically for the health attribute
FelFlame::Systems::PassiveRegen.clear_triggers(@component, :is_set, :health)
Likewise we can do the same with Component Managers:
# clears ALL triggers with this Component
FelFlame::Systems::PassiveRegen.clear_triggers(@component_manager)
# clear the 'trigger_when_added' for this Component Manager
FelFlame::Systems::PassiveRegen.clear_triggers(@component_manager, :added)
# clear the 'trigger_when_removed' for this Component Manager
FelFlame::Systems::PassiveRegen.clear_triggers(@component_manager, :removed)
# clear the 'trigger_when_is_set' for this Component Manager specifically for the health attribute
FelFlame::Systems::PassiveRegen.clear_triggers(@component_manager, :is_set, :health)
Redefinition
If we wanted to change what code or logic a given System executes, we could do that with:
FelFlame::Systems::PassiveRegen.redefine do
# Some new logic or code
end
Scenes
Creation
Once we have all the core parts of ECS, we will want to organize our Systems. To do this we will use Scenes to group up Systems so they can quickly be enabled or disabled. Note that Alternative Executions will occur even if they are not part of a Scene. Here is how we make a new Scene:
@scene = FelFlame::Scenes.new('ExampleScene')
Accessing
Just like other classes in FelFlame, the name we gave the Scene is how we access it:
@scene = FelFlame::Scenes::ExampleScene
Adding Systems
Adding Systems is simple. We can add as many as we want. In this example we add 3 different systems:
FelFlame::Scenes::ExampleScene.add(FelFlame::Systems::Render, @system2, @system3)
Removing Systems
Removing Systems works simularly:
FelFlame::Scenes::ExampleScene.remove(FelFlame::Systems::Render, @system2, @system3)
Clearing
If you want to remove all Systems from a Scene here is how we do it:
@scene.clear
Execution
To execute all Systems within a scene once we can just do:
@scene.call
The Scene will make sure that the systems are executed in the correct order based on their given priorities
Stage
Adding Scenes
Finally we have the Stage. There is only a single Stage and we do not have to create it as it exists by default. By adding a Scene to the Stage we are saying that the Scene is active. To add a Scene we do the following:
FelFlame::Stage.add FelFlame::Scene::ExampleScene
Removing Scenes
Likewise we can remove Scenes:
FelFlame::Stage.remove FelFlame::Scene::ExampleScene
Executing
On each frame of the game we want to execute the Stage once. When the Stage is executed it is progressing your game 1 frame forward. The Stage will make sure for you that all the Systems from all Scenes added will be executed in the correct order according to their priority. Here is how we do it:
FelFlame::Stage.call
Closing Notes
There are some methods I haven't gone over in the overview. If you want to see everything and read in more detail check out the Documentation!
Contribution
Contributors are welcome! I am always looking to impove the capabilities of game development in Ruby. Feel free to open an issue to discuss a proposed changed or fix. To code a change or fix first fork the project. Next write your changes or fixes. Make sure all your changes and fixes are properly documented using Yard(I will not merge if it is not 100% documented) and make sure everything has tests written for it with Rspec(I will also not merge if it does not have 100% test coverage). Once you have your changes made then simply make a pull request.
If you need help writing documentation or tests feel free to ask!
If you want to contribute to development with a thanks you can always buy me a coffee ;^)


You make the decision to weigh anchor and allow the Korean fleet to catch up to strengthen your forces.
However, months pass without the other fleet arriving. Fearing the worst, you assume that they will never come and begin to search for a landing location. But you cannot find a suitable landing location for your fleet because of the walls built by the Japanese prevent you from finding any sort of suitable landing. Finally, you find a patch in the wall that was hastily built and is much weaker than the rest of the wall. You may not come across a better landing location, but the weakness is heavily defended by Japanese samurai.
Do you launch a full-scale attack on the weak spot in the wall or continue searching for an opening?


The steps of the
geo hashing
algorithm:
- Concatenate the date and that date's (or most recent) Dow opening into one string: 2005-05-26-10458.68
- Hash it with MD5: db9318c2259923d08b672cb305440f97
- Split the hash into two parts: 0.db9318c2259923d0 and 0.8b672cb305440f97
- Convert the parts to decimal: 0.857713... and 0.544543...
- Combine the decimals with the given graticule : 37.857713 -122.544543


Examples of the main structure classes Hegel has to offer, and the styling that Argon provides.
There are two kinds of buttons (small, regular), and two states (normal, pulse).
Everything you see here is inside a card. Cards can be stacked, and will take up the maximum possible width.
List boxes can be used to create brickwork-like grids of small elements. They can have compact or regular spacing, and they can flow vertically or horizontally.
Both examples above are themselves in a column list box.
Paragraphs are formatted to have a 1.7em line-height, for best readability. For text, either use paragraph tags, or apply the text tag. This is an example of a drop-caps paragraph.
Text can be formatted as bold, highlight, italic, underlined, small, or a combination of any styles.
Links are formatted like so: This is a link. Visited links are greyed out.
You have a choice of two types of navbars. Click the buttons below and scroll to see a demo of each. We handle only the navbar container, what goes inside, and handling responsiveness is up to you - at least, for now.
Use image containers for features like captions.
An autohide hides when scrolling down, either after passing its own height, or after passing an element with the navbar_hidepoint id.
We take care of anchors for you - smooth scrolling, no url updates, and no worrying about the navbar overlapping the target.
Add more features, try and make the navbar grid a native Hegel component. Maybe create some masonry classes.
Hegel: style Argon. By Aarush Kumbhakern. View on Github.


{% extends "layout.html" %} {% block page_title %} {% endblock %} {% block content %} The prototype doesn't currently cover this. Continue with the prototype. {% endblock %}
The prototype doesn't currently cover this.
Continue with the prototype.


Need someone to help with move your couch? Need a Pirate Hat for Princetoween? Have a vacuum cleaner lying around? Free and down to fill surveys? No worries - SNBS is HERE for YOU!
Through our research and personal experiences we know that students have everyday needs, other students can fulfill these needs, and we can be the link between these students. We are committed to facilitating business transactions between these students so as to improve the quality of life of both parties involved.
Our company started in spring of 2018 from a class project at Princeton University. We saw the need to streamline the process
of connecting students with a need to students with a solution. Though we had polled interested from many campuses,
we implemented our prototype on Princeton’s campus. Since then, we have successfully expanded to campuses all over
the east coast and hope to grow nationwide.
SERVICES
What we offer
EASY TO USE
The website is so easy to navigate, your grandparents could do it!
TIME SAVER
We expedite the process of matching people who need and can provide.
SECURE
Our service can be integrated with Duo to ensure a two-step identity verification process.
INSURED TRANSACTIONS
Your request is fulfilled or your money back! If you provide you will be paid.
TRANSPARENT
You see everything from the offering to the execution of the service.
COMMUNITY ORIENTED
We foster connections within your own school.
Portfolio
Our Customer Base
Princeton University
Initial sponsoring, 2018 Q1
Rutgers University
Second customer, 2018 Q2
New York University
First entire campus integration, 2018 Q3
Massachusetts Institute of Technology
Upcoming expansion, 2019 Q2
Real Quotes from Real Users
“You scratch my back, I scratch yours”
Professor Kornhauser, Princeton University
"Thanks to this website, I will never waste time searching for an iron again!"
Grant Eckhardt, Rutgers University
"Love the convenience of this website!"
Laura Britanisky, University of Alabama


Toggle navigation
Scoreboard
Live Scoring
Match Control
Robot Control
Network Monitor
Post Match
Live Scoring
-1 Offline
-1 Offline
?
1:00
?
-1 Offline
-1 Offline
Offline
Offline
Settings
Automatically Set Match Number and Phase
Match Number
Phase
Autonomous
Teleop
ws://
:8000
Points Scored
Blue Alliance
10
+
-
5
+
-
1
+
-
Gold Alliance
10
+
-
5
+
-
1
+
-


response:
Called with the response after it is received. Response interceptors can modify and return the Response, or create a new one to be returned to the caller.
response:
Called with the response after it is received. Response interceptors can modify and return the Response, or create a new one to be returned to the caller.


--- layout: post title: 'MobileYouth: Music and Fun' date: 2006-11-24 00:00:00 categories: digital-media mobile ---
MobileYouth: Music and FunGB: Music is social currency, used by youth for communication.
Dan Whiley, VP Commercial - Digital Media, MTV
Charlie Henderson, Director of Business Development, Motorola
Nigel Sheldon, Director of Digital, Starcom UK
GB (to the audience): What's the social value of music to young people?
Answers from delegates: clothing, listening to pirate radio, defining meeting places, karaoke, taking drugs, photos from TV, being in a band, DJing, tattoos, festivals, roller discos, choir, gigs, posters, kissing the TV, merchandise, political statements, many more.
GB: The Ghettoblaster was the predecessor of the iPod in that it was a status symbol. MP3 took some of the overt displaying of music (through physical items) away. How are companies using this to engage with young people?
DW: It all boils down to community.
GB: TOTP used to be the main event of the week, stimulating discussion the next day. Now it's been edged out - why?
DW: They didn't do anything wrong, they just got old. MTV invented music TV but has stayed fresh. MTV has many sub-brands now: 9 or 10 in the UK.
GB: But the mobile industry uses generic brands.
CH: I listened to music I didn't like, because I wanted to be part of a community. Kids are playing music out of their phone speakers in order to identify themselves and make a statement: this is the most important thing for them and music right now. Big headphones are cool right now: again, a display behaviour. Things aren't cool when everyone has the same thing: there'll be a backlash against the iPod.
GB: Youth are buying products that fulfil social needs, not those the industry is wanting them to meet. The Motorola V3 is a basic phone: 50-60m+ sold (equalling all makes of iPod). (To me, this indicates the power of good industrial design and marketing).
CH: Some people bought a silver RAZR, then upgraded to black, then pink, then went back to silver because it's now retro! The mobile industry doesn't have strong enough brands to appeal to youth alone. Therefore in the accessory business, we have to partner with appropriate other organisations. Motorola has no credibility in snowboarding, so we partner with Burton. (Demonstrates a musical jacket).
GB: The record labels have experienced MP3, for better or worse. How do they see mobile?
NS: Personalisation, the desire for simplicity, etc. are important. Overall experiences are important, beyond buying CDs: living Glastonbury, say. Mobile delivers a number of new behaviours: people being more in control, with more intricate behaviours. My teenage son moves from texting, to online, to IM, etc. They multitask better. Ad ad agencies and media agencies, we have to look at how we reach consumers in this context.
GB: UGC and social media are buzzwords, but how do we make them work around mobile and music - with technical, legal, etc. limitations and bearing in mind the important role that (worried) record labels have?
NS: It's quite intangible for most people. There are some interesting services out there (but he doesn't give any specific examples, grr).
Video of youth interviews: some have ipods, some have phones. Some like convergence, some don't.
DW: People don't want to pay for music on the phone, because they don't want to pay for music full stop. Kids don't differentiate between devices or channels as much as we do, such distinctions are artificial. Youth don't work with technology, they just take it for granted. They don't know what "community services" or "web 2.0" are, but use them nonetheless. Mobile music is just music.
CH: As a large technology company, we often invent without considering relevance.
NS: 8-10 year olds are different to later generations. Adults presume kids are distracted, but they have a different mindset. Observe them to understand them. Test and experiment.
Question from audience: operators don't get the fact that to appeal to market niches, they are not appropriate brands. Vodafone are not cool.
DW: Everyone is concerned about technology, we're more bothered about the screen. We don't care whether it's 3G or DVB-H.
Question from audience: isn't the key now to encourage downloads, through content discovery, personalisation, recommendation?
DW: Why do you want them to download music? That's taking a traditional model and trying to replicate it in a medium that may not suit it. Why not stop looking for the killer app, and recognise there may be 4 or 5 new opportunities. The internet may not be the sole answer. Steve Jobs did a good job of creating the digital download market by selling the record labels something they understand: "it's like a CD without the plastic". So, the next step: how do people interact with music as a whole?


My Own Personal Hell O...
| DOSE: |
133 mg |
insufflated |
Ketamine |
(powder / crystals) |
My friends freinds dad is a vet and he has access to ketamine. Now I was told NOT to do a lot fo it at one time for it is VERY potent. My friend and I bought a half gram (turned out to be 0.3g) OH WELL! Anyways I had done ketamine in the past before and thought I knew how powerfull it is. We decided that because it was only 0.3g we would sniff it all at once. So we made out 4 piles and we each sniffed one, and then the others almost right after. EVerything was going good for about 5min and then time slowed down. The next thing that happened was I thought that I knew everyting my buddy was going before it happenedand vise versa.
Right then I knew I was fucked.
About 2min after I was right into a K-Hole. I was in the hole for about an hour or two and woke up on my bed with a bucket of puke beside my bed...
When I was in this K-Hole it felt like my brain was on a rollercoaster! My mind was travellign so fast in every direction. It was like I was in space with all these colorfull tiles around me. Some times I thought that I had died and was on my way to heaven.
There was me, a sober sitter, and my other buddy.
In the K-Hole I had visions of those two and I had audio distortions of them. A WHILE ago I had a bad trip on mushrooms (5g dose) and I was having some of my thoughts from that night running through my mind in the K-Hole. I had then thought that I HAD DONE IT AGAIN with the shrooms. I thought I was going to wake up in the hospital becuase I knew I was laying down but I can't remember getting on my bed. When I came to my buddies had just come into my room and I was SOOO GLAD to be in my room, I had never felt this 'hell' before and it scared the shit out me, I thought Ketamine was the gateway into other worlds where ANYTHING is possible, even time travel. I have not done it since and have no immediate plans of doing it in the near future...
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


DragonSnake
The Dragon is ready, select a world to start our travel!
Commands: use [W][S][A][D] + [Z][X] to go up in the sky
Score: 0
Length: 0
♫ ♫ ♫ Music is ON AIR ♫ ♫ ♫
GAME OVER


| Xmega Application Note | |||||
Driver private struct. More...
Data Fields | |
| uint16_t | alarm_high |
| High value of alarm time. | |
| uint16_t | alarm_low |
| Low value of alarm time. | |
| rtc_callback_t | callback |
| Callback function to use on alarm. | |
| uint16_t | counter_high |
| High value of counter. |
Driver private struct.
For internal use only.
Definition at line 59 of file rtc.c.
| uint16_t rtc_data_struct::alarm_high |
High value of alarm time.
Definition at line 63 of file rtc.c.
Referenced by ISR(), and rtc_set_alarm().
| uint16_t rtc_data_struct::alarm_low |
Low value of alarm time.
Definition at line 65 of file rtc.c.
Referenced by ISR(), and rtc_set_alarm().
Callback function to use on alarm.
Definition at line 67 of file rtc.c.
Referenced by ISR(), and rtc_set_callback().
| uint16_t rtc_data_struct::counter_high |
High value of counter.
Definition at line 61 of file rtc.c.
Referenced by ISR(), rtc_get_time(), and rtc_set_time().
| Generated on Fri Oct 22 12:15:26 2010 for AVR1300 Using the Xmega ADC by 1.6.3 |


HISTORY
Talk on life of Bishop Quinlan in Borrisoleigh
by John ConnorsBorrisoleigh Historical Society will host a talk on the life of Bishop Thomas Quinlan on Friday, November 29 in the Community Centre Borrisoleigh at 8pm.
Thomas Quinlan was born in Pallas, Borrisoleigh and as a young man he joined the Columban Order of missionary priests.
Posted first to China, in 1934 he joined the Order’s mission in Korea. His time in Korea coincided with a most troublesome period in the history of that country, surviving Japanese occupation, house arrest, the Second World War and the Korean War with its infamous death march.
Upperchurch man, Eugene Shortt has extensively studied on the life of Thomas Quinlan and has compiled a detailed lecture on the life of the Pallas missionary.
This talk gives a fuller and rounder picture of the man who, although chiefly associated with that Death March, was involved in and led, many more initiatives and accomplishments on the Korean peninsula.
Talk begins at 8pm, admission is €5. All welcome.


Module: TableSetter
- Defined in:
- lib/table_setter.rb,
lib/table_setter/app.rb,
lib/table_setter/table.rb,
lib/table_setter/command.rb
Defined Under Namespace
Constant Summary
- ROOT =
File.(File.dirname(__FILE__) + "/..") unless defined? ROOT
Class Attribute Summary
- + (Object) config_path readonly Returns the value of attribute config_path.
Class Method Summary
Class Attribute Details
+ (Object) config_path (readonly)
Returns the value of attribute config_path
21 22 23 |
# File 'lib/table_setter.rb', line 21 def config_path @config_path end |
Class Method Details
+ (Object) configure(path)
23 24 25 |
# File 'lib/table_setter.rb', line 23 def configure(path) @config_path = File.(path) end |
+ (Object) table_path
27 28 29 |
# File 'lib/table_setter.rb', line 27 def table_path @config_path + "/tables/" end |


About
I’m Steve. I’m from asdf.
I do a lot of different things.
If you want to get in touch with me you can email me or find me on BitBucket, GitHub, Twitter, Forrst, or Flickr.
Programming
I went to Rochester Institute of Technology for a degree in Computer Science.
I’ve done a lot of different things in the field so far. Right now the things that are captivating me are artificial intelligence and clean, simple, useful web applications.
I find programming beautiful. That might sound strange, but there are aspects of programming and math that I can’t describe any other way.
You can take a look at my projects to see some of the major stuff I’ve worked on, or cut to the chase and look at my BitBucket account.
Photography
I like photographing people. Other things as well, but especially people. I tend to gravitate toward the “art” aspects of photography more than the “journalism” aspects, but I can appreciate both.
I shoot digital and film (35mm and medium format) depending on my time limits and mood. I develop film in my bathroom and print it in a rented darkroom. When I print digital I use a lab nearby; I don’t have the money for a professional printer just yet.
I post most of what I take on my Flickr account.
Dancing
I teach blues dancing here in Rochester as part of Lady Luck Blues. I started blues dancing a few years ago and haven’t stopped since. My favorite aspect of dancing is connection and blues seems to bring that out more than any other dance.
I’ve also been swing dancing for about seven years. My first love is Lindy Hop; I go to classes, workshops and exchanges as often as my schedule and budget will allow.
Lately I’ve begun getting my feet wet in tango. Whether it’ll ever become as important to me as blues or Lindy remains to be seen.
Music
I play electric and upright bass. I’ve played in a metal band in the past, but right now my focus is on jazz and blues.
I DJ at swing and blues dances fairly often. My taste is pretty broad, and I’ll cater to whatever the floor wants, but I tend to personally enjoy slightly down-tempo, small-group music. Let me know if you need a DJ for a dance.
About the Site
If you want to know more about my site you should check out the blog post about how I rewrote it.


We've updated our Privacy Policy
We've updated our Privacy Policy and Terms of Service to support the growth of our products as well as CCPA privacy law. There are a few updates we'd like to highlight for you:
We hope these changes are helpful as we continue improving JUSTFASHIONNOW to make it even easier to discover great items you'll love. If you have any questions, we encourage you to contact us. Thank you for reading with Justfashionnow!
- The Justfashionnow Team
To make sure you don't miss out on the latest news and sale alerts, please add
<EMAIL_ADDRESS>to your address book.
If you have any questions, please do not hesitate to contact us at
support@justfashionnow.com


Gaussian Distribution
A responsive theme for your project on GitHub Pages
View on GitHub
Website Code
Insert URL of image below to run. (Some links may not work due to their website CORS policy.)
Start
The Larger the Image, the longer it will take to process


This code block makes weaknesses such as XML External Entity or SQL Injection harder to exploit
While it should never be considered as an effective countermeasure in itself, displaying generic error messages can increase the level of sophistication required to exploit a programming flaw, because the attacker must conduct the exploit blindly, without relying on the application output.
For example an SQL Injection attack may be a bit harder to detect and to exploit if the application only displays the message:
An error has ocurred
Obviously if the application displays the message below, it is much easier to exploit because the attacker has the exact query and does not need to do any guessing.
java.sql.SQLSyntaxErrorException: Syntax error: Encountered "\'" at line 1, column 49. Query:select * from users where usr='admin' and pwd='''
Displaying detailed error messages is a vulnerability in itself although not one of the top Sans 25 or OWASP Top 10. Many times such messages may reveal information about the system being attacked such as file paths or exception call stacks. These errors make the attacker's life much easier.


--- layout: archive title: Zulip Chat Archive permalink: /stream/116395-maths/topic/Refactoring.20polynomials.html ---
I'm starting a new thread on this topic. For reference, @Yury G. Kudryashov wrote a proposal over here: #1864
A lot of previous discussion is over here: https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Algebraic.20geometry.20course/near/186673407
One thing that I would really like to have is given f : polynomial R
and r : R
, that f r
becomes f.eval r
. I guess that is possible with coe_to_fun
.
However... can we do a similar thing for mv polynomials, and maintain readability?
This would require some hackery, because it requires a linear ordering on σ
Suppose that f : mv_polynomial (fin 3) R
. Then I would love to be able to write f [r₁, r₂, r₃]
.
Is there any chance we can make that happen?
Should we add special support for polynomials in n : ℕ
variables?
I've been doing algebraic geometry and I'm just at the point where I want to talk about polynomials in n variables. I don't really know what to do. I know what theorems I want to prove but I'm still very confused about what exactly is being suggested. I would happily start refactoring mv_polynomial
if someone said "here's the definitions, here are ten theorems, can you prove then?" but I don't know where to start if I don't have definitions.
I think, a good first step would be to move algebra
below polynomial
s in the import
chain. This means moving aeval
to polynomials.
The next step is to define monoid_algebra
(e.g., as finsupp
or dfinsupp
) and prove the universal property (is it already in finsupp
?).
@Johan Commelin We have fin.cons
It has the desired type but lacks notation.
{% endraw %}Last updated: Apr 24 2020 at 19:02 UTC


This snac used by client and server for mini typing notification (MTN). Basically,
when you begin typing something you send a "typing begun" message, then a few
seconds later you send a "text typed" message, then after you actually
send the message, you send a "no more text has been typed" message. You also send
the "typing finished" message if you delete all the stuff you've typed.
Remote clients know that your client supports MTN because the server appends an
empty type 0x000b TLV to all outgoing IMs. You tell the server you want this TLV
appended when you send the SNAC(04,02).
Just set message flags bit4=1. Send and receive SNACs has the same type=0x14.
Here is the known notification types list:
0x0000 - typing finished sign
0x0001 - text typed sign
0x0002 - typing begun sign
| 00 04 |
|
word |
|
SNAC family |
| 00 14 |
|
word |
|
SNAC subtype |
| 00 00 |
|
word |
|
SNAC flags |
| xx xx xx xx |
|
dword |
|
SNAC request-id |
|
00 00 00 00 00 00 00 00 |
|
qword |
|
notification-id cookie |
| xx xx |
|
word |
|
notification channel |
| xx |
|
byte |
|
screenname string length |
| xx .. |
|
string |
|
screenname string |
| xx xx |
|
word |
|
notification type (see above) |
|
|
|


Gui Sudoku
For my daughter Gabby
1
2
3
4
5
6
7
8
9
generating a new grid…
Select level:
Easy
Medium
Difficult
Insane
Restart game?
Cancel
Yes
Help
Main symbols
make an hypothesis
validate hypothesis
rule out hypothesis
restart same grid
generate a new grid
Additional tools
Solve current grid
Legend


--- layout: post date: 2012-08-29 time: "11:00:00" authors: ["Greg Wilson"] title: Please Help the Hunter Family tags: ["Community"] ---
We are very sad to report that John Hunter, the principal author of the widely-used Python plotting package Matplotlib, is losing his battle with cancer. If you would like to help his family in this difficult time, please see Stefan van der Walt's post, or make a donation to the memorial fund set up to help with his children's education.


| Property | Description | Data Type |
|---|---|---|
|
protocol identifier
required |
Trial identifier used by lead organization, ie. Center for Experimental Therapeutics Program (CTEP) ID or Industry Sponsored ID. This is usually a short identifier. Example: E4412. | < string > |
|
assay creator
required |
Indicates what site is filling out the assay. |
<
string
>
|
|
batch id
required |
A unique ID that separates the different batches of Nanostring. | < string > |
|
raw data csv
required |
Information about a comma separated file. | csv |
|
normalized data csv
required |
Information about a comma separated file. | csv |
Runs
| Property | Description | Data Type |
|---|---|---|
|
run id
required |
A unique ID that separates the different runs of the given same sample. | < string > |
|
reference data rcc
required |
Information about a Nanostring output file. XML-formatted comma-separated tables | rcc |
| Property | Description | Data Type |
|---|---|---|
|
protocol identifier
required |
Trial identifier used by lead organization, ie. Center for Experimental Therapeutics Program (CTEP) ID or Industry Sponsored ID. This is usually a short identifier. Example: E4412. | < string > |
|
batch id
required |
A unique ID that separates the different batches of Nanostring. | < string > |
raw data
| Property | Description | Data Type |
|---|---|---|
|
run id
required |
A unique ID that separates the different runs of the given same sample. | < string > |
|
cimac id
required |
Specimen identifier assigned by the CIMAC-CIDC Network. Formatted as CTTTPPPSS.AA for trial code TTT, participant PPP, sample SS, and aliquot AA. |
<
string
>
as regex ^C[A-Z0-9]{3}[A-Z0-9]{3}[A-Z0-9]{2}.[0-9]{2}$
|
|
data rcc
required |
Information about a Nanostring output file. XML-formatted comma-separated tables | rcc |


The ConnectionFactory allows access maintained connections in the siesta.config.json file.
// accessing the default connection $defaultConnection = ConnectionFactory::getConnection(); // accessing a connection by name $customConnection = ConnectionFactory::getConnection("custom");
The connection class abstracts database specific and allows to start transaction and executing queries.
$connection = ConnectionFactory::getConnection(); try { $connection->startTransaction(); ... $resultSet = $connection->query("UPDATE ..."); $connection->commit(); } catch (SQLException $sql) { $connection->rollback(); }
Custom stored procedures allow to return ResultSet objects. ResultSet objects allow iterating over the list rows found including type aware access to the data.
$resultSet = $artistService->getMyCustomList("Parameter1", "parameter2");
// hasNext() method will tell if there is another row available.
while($resultSet->hasNext()) {
// getter allow to access row data
// using the generated const
for every column
$isCool = $resultSet->getBooleanValue(Artist::COLUMN_IS_COOL);
$numberOfAlbums = $resultSet->getIntegerValue(Artist::COLUMN_NUMBER_OF_ALBUMS);
// you can also use name of a column directly
$custom = $resultSet->getFloatValue("custom_column_name");
$artistName = $resultSet->getStringValue(Artist::COLUMN_NAME);
$dob = $resultSet->getDateTime(Artist::COLUMN_DOB);
}
// mandatory(!!!) with storeprocedures
$resultSet->close();


%load_ext ipython_pytest
Testing with Mocking
What is Mocking?
pytest-mock
One of the mainstream mocking library is the standard one from unittest
, there are also pytest plugin pytest-mock
which wraps on unittest
.
%%pytest
def test_sum():
assert 1 == 1
============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: C:\Users\lrcno\AppData\Local\Temp\tmpiih077gv
plugins: anyio-3.5.0, cov-3.0.0, mock-1.13.0
collected 1 item
_ipytesttmp.py . [100%]
============================== 1 passed in 0.06s ==============================
Mocking is important for a few reasons. * You want to have fast unittest (within second) * You don’t want to put loading or have any side-effect to your actual servers/database (e.g. mock writing to a database)
Mock
and MagicMock
There are two main mock object you can used with the standard unittest
library from unittest.mock
.
from unittest.mock import Mock, MagicMock, patch
Mock
= Mock() mock
With the Mock
object, you can treat it like a magic object that have any attributes or methods.
mock.super_method(), mock.attribute_that_does_not_exist_at_all
(<Mock name='mock.super_method()' id='1587554283232'>,
<Mock name='mock.attribute_that_does_not_exist_at_all' id='1587554282512'>)
str(mock)
"<Mock id='1587554282848'>"
MagicMock
The “magic” comes from the magic methods of python object, for example, when you add two object together, it is calling the __add__
magic method under the hook.
+ mock mock
TypeError: unsupported operand type(s) for +: 'Mock' and 'Mock'
= MagicMock() magic_mock
+ magic_mock magic_mock
<MagicMock name='mock.__add__()' id='1587563722784'>
With MagicMock
, you get these magic methods for free, this is why adding two mock will not throw an error but adding two Mock
will result in a TypeError
Let say we want to mock the pandas.read_csv
function, because we don’t actually want it to read a data, but just return some mock data whenever it is called. It’s easier to explain with an example.
 However, with create=True
you can make the test pass again. Normally you won’t want to do this, but it is an option that available.
%%pytest
import pandas as pd
def test_read_csv(mocker): # mocker is a special pytest fixture, so even though we haven't define it here but pytest understands it.
"pandas.read_special_csv", return_value = "fake_data", create=True)
mocker.patch(assert pd.read_special_csv("some_data") == "fake_data"
============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: C:\Users\lrcno\AppData\Local\Temp\tmphqbckliw
plugins: anyio-3.5.0, cov-3.0.0, mock-1.13.0
collected 1 item
_ipytesttmp.py . [100%]
============================== 1 passed in 0.10s ==============================
More often, you would want your mock resemble your real object, which means it has the same attributes and method, but it should fails when the method being called isn’t valid. You may specify the return_value
with the mock type
%%pytest -vvv
import pandas as pd
from unittest.mock import Mock
import pytest
def test_read_csv_valid_method(mocker): # mocker is a special pytest fixture, so even though we haven't define it here but pytest understands it.
"pandas.read_csv", return_value = Mock(pd.DataFrame))
mocker.patch(= pd.read_csv("some_data")
df # A DataFrame method
df.mean()
def test_read_csv_invalid_method(mocker): # mocker is a special pytest fixture, so even though we haven't define it here but pytest understands it.
"pandas.read_csv", return_value = Mock(pd.DataFrame))
mocker.patch(= pd.read_csv("some_data")
df with pytest.raises(Exception):
df.not_a_dataframe_method()
============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- c:\users\lrcno\miniconda3\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\lrcno\AppData\Local\Temp\tmpyfiqtkoy
plugins: anyio-3.5.0, cov-3.0.0, mock-1.13.0
collecting ... collected 2 items
_ipytesttmp.py::test_read_csv_valid_method PASSED [ 50%]
_ipytesttmp.py::test_read_csv_invalid_method PASSED [100%]
============================== 2 passed in 0.16s ==============================


LayerStyle "NOSHADING|IGNORETRACKEVENTS", //Both
LayerStyle "IGNORETRACKEVENTS",
Purpose: Does not trigger Frame Mouse events and can't be clicked.
LayerStyle "NOSHADING",
Purpose:
Used in: EveryWhere


Torrent or Magnet link
Fetching Torrent Metadata...
Download as Zip
file_download
{{m.torrent.name}}
Open in browser
open_in_new
{{file.name}}
{{size(file.length, 1)}}
Go Back. Stops torrent
keyboard_backspace


Time from
This field is required
Time to
This field is required
Date from
This field is required
Date to
This field is required
Location
This field is required
Description
This field is required
Paied
Paied
This field is required
Save