Tutorial for using stagewiseNN¶
Here is a tutorial of using StagewiseNN to build the single-cell graph and developmental tree from scratch, i.e., using the raw count data.
The sample data used here is a 20%-subsample (29775 cells) of the original scRNA-seq data (~140k cells), which can be download from here.
Note that any normalized data-matrix (with stage labels) can be run with StagewiseNN.
[1]:
import os
import sys
from pathlib import Path
from typing import Sequence, Mapping, Optional, Union, Callable
import logging
import pandas as pd
import numpy as np
import scanpy as sc
if the package is not installed, you can also import it by appending the swnn’s parent directory to sys.path
.
[2]:
ROOT = Path('../')
sys.path.append(str(ROOT))
import swnn
from swnn import describe_dataframe, set_adata_hvgs, change_names
0 Setting paths and load data¶
[3]:
resdir = ROOT / '_temp' # The result directory, reset by user!
swnn.check_dirs(resdir)
already exists:
../_temp
Load the sample data (as an AnnData
object)
[4]:
DATADIR = ROOT / 'sample_data' # reset by user!
path_adata = DATADIR / 'subsampled_B-L0-0.2.h5ad' # reset by user!
adata_raw = sc.read_h5ad(path_adata)
adata_raw
[4]:
AnnData object with n_obs × n_vars = 29775 × 24410
obs: 'stage_id', 'primer', 'n_genes', 'n_counts', 'stage_primer', 'stg_leiden', 'stage_stg_leiden', 'refined_group', 'leiden_new', 'parent_bcd', 'lineage', 'stage_name', 'stagewise_cluster'
uns: 'lineage_colors'
[5]:
# swnn.describe_dataframe(adata_raw.obs)
1 preprocessing¶
1.1 Normalize data and compute HVGs from scratch¶
Here we list two ways of normalization (where the first way is most commonly adopted):
[6]:
# way 1, the most commonly adopted
adata_norm = swnn.normalize_default(adata_raw, target_sum=None, copy=True, )
[7]:
# way 2, less general, but works better for SplitSeq data (our sample data) in practice
adata_norm1 = swnn.normalize_log_then_total(adata_raw, target_sum=None, copy=True, )
1.2 Select HVGs from each group (stage) of data¶
[8]:
adata = adata_norm1
# adata = adata_norm
hvg_freq, hvg_dict = swnn.groupwise_hvgs_freq(adata, groupby='stage_name')
Take the HVGs that are detected on more that 3 stages:
[9]:
hvgs = swnn.take_high_freq_elements(hvg_freq, min_freq=3)
print('Total of %d HVGs are used.' % len(hvgs))
Total of 4613 HVGs are used.
NOTE
If you have already computed the HVG frequencies, you can directly load them, and take ones with high-frequencies.
hvg_freq = pd.read_csv(path_hvg_freq, index_col=0, header=None).iloc[:, 0].to_dict()
hvgs = swnn.take_high_freq_elements(hvg_freq, min_freq=3)
Next, set HVGs to adata
[10]:
adata = set_adata_hvgs(adata, gene_list=hvgs)
1.3 Compute z-scores¶
Centering and scaling to unit variances, grouped by each “batch” (specified by the groupby
parameter).
[11]:
batch_key = 'stage_primer'
swnn.wrapper_scale(adata, groupby=batch_key)
adata, adata.X[:2, :]
[11]:
(AnnData object with n_obs × n_vars = 29775 × 4613
obs: 'stage_id', 'primer', 'n_genes', 'n_counts', 'stage_primer', 'stg_leiden', 'stage_stg_leiden', 'refined_group', 'leiden_new', 'parent_bcd', 'lineage', 'stage_name', 'stagewise_cluster'
var: 'highly_variable'
uns: 'lineage_colors', 'log1p',
array([[-0.28615636, -0.35525173, -0.12650372, ..., -0.25878315,
-0.19844045, -0.20785098],
[-0.19452356, -0.25703438, -0.0802073 , ..., -0.24499079,
-0.11594469, -0.13195746]]))
2 The main process¶
2.0 Setting inputs and the parameters¶
[12]:
# ====== Inputs ======
data_matrix = adata.X
stage_order = ("B", "G3", "G4", "G5", "G6", "N0", "N1", "N3", "L0")
stage_labels = adata.obs['stage_name']
# only used for building tree, each group will be taken as a tree node
group_labels = adata.obs['stagewise_cluster']
# ====== Parameters ======
ks = [10] * 7 + [3] * 2 # specified for different stages
n_pcs = 30 # you can also set it a list like ``ks``
leaf_size = 1 # 1 for exact KNN
Initialize a Builder object:
[13]:
builder = swnn.Builder(stage_order=stage_order)
2.1 Building a (stage-wise) single-cell graph¶
[14]:
distmat, connect = builder.build_graph(
X=data_matrix, stage_lbs=stage_labels,
ks=ks, n_pcs=n_pcs,
leaf_size=leaf_size,
)
perform KNN searching: B in B
perform KNN searching: G3 in B
perform KNN searching: G4 in G3
perform KNN searching: G5 in G4
perform KNN searching: G6 in G5
perform KNN searching: N0 in G6
perform KNN searching: N1 in N0
perform KNN searching: N3 in N1
perform KNN searching: L0 in N3
2.1.1 Further visualization¶
Compute UMAP based on your precomputed single-cell-graph
[15]:
swnn.set_precomputed_neighbors(adata, distmat, connect)
sc.tl.umap(adata, min_dist=0.1)
WARNING: You’re trying to run this on 4613 dimensions of `.X`, if you really want this, set `use_rep='X'`.
Falling back to preprocessing with `sc.pp.pca` and default params.
[16]:
sc.settings.figdir = resdir
sc.set_figure_params(fontsize=14)
sc.pl.umap(adata, color='lineage', ncols=1, save='_lineage.pdf')
sc.pl.umap(adata, color='stage_name', palette='plasma_r', save='_stage.pdf')
WARNING: saving figure to file ../_temp/umap_lineage.pdf
WARNING: saving figure to file ../_temp/umap_stage.pdf
We can see that the UMAP-plot computed from the 20%-subsample is similar to that built from the full data.
2.2 Build a developmental tree from the single-cell graph¶
[17]:
edgedf, refined_group_lbs = builder.build_tree(group_labels, stage_labels,)
connecting stage B and G3
---> aggregating edges...
unique labels of rows: ['B_1' 'B_0' 'B_2']
unique labels of columns: ['G3_1' 'G3_0' 'G3_3' 'G3_4' 'G3_2' 'G3_5']
grouping elements (edges)
shape of the one-hot-labels: (1596, 3) (1826, 6)
parent nodes that had no descendent: ['B_2']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['B_1' 'B_0' 'B_2']
unique labels of columns: ['G3_1' 'G3_0' 'G3_3' 'G3_4' 'G3_2' 'G3_5' 'G3_6']
grouping elements (edges)
shape of the one-hot-labels: (1596, 3) (1826, 7)
connecting stage G3 and G4
---> aggregating edges...
unique labels of rows: ['G3_0', 'G3_1', 'G3_2', 'G3_3', 'G3_4', 'G3_5', 'G3_6']
unique labels of columns: ['G4_0' 'G4_4' 'G4_2' 'G4_3' 'G4_1']
grouping elements (edges)
shape of the one-hot-labels: (1826, 7) (1477, 5)
parent nodes that had no descendent: ['G3_3', 'G3_6']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['G3_0', 'G3_1', 'G3_2', 'G3_3', 'G3_4', 'G3_5', 'G3_6']
unique labels of columns: ['G4_0' 'G4_4' 'G4_2' 'G4_3' 'G4_1' 'G4_5']
grouping elements (edges)
shape of the one-hot-labels: (1826, 7) (1477, 6)
connecting stage G4 and G5
---> aggregating edges...
unique labels of rows: ['G4_0', 'G4_1', 'G4_2', 'G4_3', 'G4_4', 'G4_5']
unique labels of columns: ['G5_2' 'G5_0' 'G5_3' 'G5_1' 'G5_5' 'G5_8' 'G5_6' 'G5_4' 'G5_7']
grouping elements (edges)
shape of the one-hot-labels: (1477, 6) (4098, 9)
parent nodes that had no descendent: ['G4_5']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['G4_0', 'G4_1', 'G4_2', 'G4_3', 'G4_4', 'G4_5']
unique labels of columns: ['G5_2' 'G5_0' 'G5_3' 'G5_1' 'G5_5' 'G5_8' 'G5_6' 'G5_4' 'G5_7' 'G5_9']
grouping elements (edges)
shape of the one-hot-labels: (1477, 6) (4098, 10)
connecting stage G5 and G6
---> aggregating edges...
unique labels of rows: ['G5_0', 'G5_1', 'G5_2', 'G5_3', 'G5_4', 'G5_5', 'G5_6', 'G5_7', 'G5_8', 'G5_9']
unique labels of columns: ['G6_1' 'G6_0' 'G6_3' 'G6_4' 'G6_8' 'G6_7' 'G6_5' 'G6_6' 'G6_2']
grouping elements (edges)
shape of the one-hot-labels: (4098, 10) (4775, 9)
parent nodes that had no descendent: ['G5_8', 'G5_9']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['G5_0', 'G5_1', 'G5_2', 'G5_3', 'G5_4', 'G5_5', 'G5_6', 'G5_7', 'G5_8', 'G5_9']
unique labels of columns: ['G6_1' 'G6_0' 'G6_3' 'G6_4' 'G6_8' 'G6_7' 'G6_5' 'G6_6' 'G6_9' 'G6_2'
'G6_10']
grouping elements (edges)
shape of the one-hot-labels: (4098, 10) (4775, 11)
connecting stage G6 and N0
---> aggregating edges...
unique labels of rows: ['G6_0', 'G6_1', 'G6_2', 'G6_3', 'G6_4', 'G6_5', 'G6_6', 'G6_7', 'G6_8', 'G6_9', 'G6_10']
unique labels of columns: ['N0_6' 'N0_2' 'N0_8' 'N0_5' 'N0_4' 'N0_3' 'N0_1' 'N0_0' 'N0_9' 'N0_7']
grouping elements (edges)
shape of the one-hot-labels: (4775, 11) (4992, 10)
parent nodes that had no descendent: ['G6_9', 'G6_10']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['G6_0', 'G6_1', 'G6_2', 'G6_3', 'G6_4', 'G6_5', 'G6_6', 'G6_7', 'G6_8', 'G6_9', 'G6_10']
unique labels of columns: ['N0_6' 'N0_2' 'N0_8' 'N0_5' 'N0_4' 'N0_3' 'N0_1' 'N0_0' 'N0_9' 'N0_7'
'N0_10' 'N0_11']
grouping elements (edges)
shape of the one-hot-labels: (4775, 11) (4992, 12)
connecting stage N0 and N1
---> aggregating edges...
unique labels of rows: ['N0_0', 'N0_1', 'N0_2', 'N0_3', 'N0_4', 'N0_5', 'N0_6', 'N0_7', 'N0_8', 'N0_9', 'N0_10', 'N0_11']
unique labels of columns: ['N1_4' 'N1_3' 'N1_2' 'N1_0' 'N1_7' 'N1_6' 'N1_5' 'N1_8' 'N1_1' 'N1_9']
grouping elements (edges)
shape of the one-hot-labels: (4992, 12) (4399, 10)
parent nodes that had no descendent: ['N0_10', 'N0_11']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['N0_0', 'N0_1', 'N0_2', 'N0_3', 'N0_4', 'N0_5', 'N0_6', 'N0_7', 'N0_8', 'N0_9', 'N0_10', 'N0_11']
unique labels of columns: ['N1_4' 'N1_3' 'N1_2' 'N1_0' 'N1_7' 'N1_6' 'N1_5' 'N1_8' 'N1_1' 'N1_9'
'N1_10']
grouping elements (edges)
shape of the one-hot-labels: (4992, 12) (4399, 11)
connecting stage N1 and N3
---> aggregating edges...
unique labels of rows: ['N1_0', 'N1_1', 'N1_2', 'N1_3', 'N1_4', 'N1_5', 'N1_6', 'N1_7', 'N1_8', 'N1_9', 'N1_10']
unique labels of columns: ['N3_0' 'N3_6' 'N3_2' 'N3_8' 'N3_4' 'N3_10' 'N3_9' 'N3_1' 'N3_13' 'N3_3'
'N3_7' 'N3_5' 'N3_11' 'N3_12']
grouping elements (edges)
shape of the one-hot-labels: (4399, 11) (4448, 14)
parent nodes that had no descendent: ['N1_3', 'N1_9', 'N1_10']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['N1_0', 'N1_1', 'N1_2', 'N1_3', 'N1_4', 'N1_5', 'N1_6', 'N1_7', 'N1_8', 'N1_9', 'N1_10']
unique labels of columns: ['N3_0' 'N3_6' 'N3_2' 'N3_8' 'N3_4' 'N3_10' 'N3_9' 'N3_1' 'N3_13' 'N3_3'
'N3_7' 'N3_5' 'N3_11' 'N3_12' 'N3_15' 'N3_14' 'N3_16']
grouping elements (edges)
shape of the one-hot-labels: (4399, 11) (4448, 17)
connecting stage N3 and L0
---> aggregating edges...
unique labels of rows: ['N3_0', 'N3_1', 'N3_2', 'N3_3', 'N3_4', 'N3_5', 'N3_6', 'N3_7', 'N3_8', 'N3_9', 'N3_10', 'N3_11', 'N3_12', 'N3_13', 'N3_14', 'N3_15', 'N3_16']
unique labels of columns: ['L0_4' 'L0_1' 'L0_0' 'L0_14' 'L0_6' 'L0_7' 'L0_12' 'L0_10' 'L0_11' 'L0_5'
'L0_8' 'L0_2' 'L0_9' 'L0_16' 'L0_3' 'L0_15' 'L0_13']
grouping elements (edges)
shape of the one-hot-labels: (4448, 17) (2164, 17)
parent nodes that had no descendent: ['N3_4', 'N3_5', 'N3_11', 'N3_14', 'N3_15', 'N3_16']
Taking descendant-points from other nodes (groups)
pasting stage labels
---> aggregating edges...
unique labels of rows: ['N3_0', 'N3_1', 'N3_2', 'N3_3', 'N3_4', 'N3_5', 'N3_6', 'N3_7', 'N3_8', 'N3_9', 'N3_10', 'N3_11', 'N3_12', 'N3_13', 'N3_14', 'N3_15', 'N3_16']
unique labels of columns: ['L0_4' 'L0_1' 'L0_0' 'L0_14' 'L0_6' 'L0_7' 'L0_12' 'L0_10' 'L0_11' 'L0_5'
'L0_8' 'L0_2' 'L0_9' 'L0_16' 'L0_19' 'L0_3' 'L0_15' 'L0_13' 'L0_21'
'L0_18' 'L0_20' 'L0_17' 'L0_22']
grouping elements (edges)
shape of the one-hot-labels: (4448, 17) (2164, 23)
[18]:
edgedf.head()
[18]:
| node | parent | prop | |
|---|---|---|---|
| 0 | G3_1 | B_1 | 0.676985 |
| 1 | G3_0 | B_0 | 0.985633 |
| 2 | G3_3 | B_0 | 0.581227 |
| 3 | G3_4 | B_0 | 0.946490 |
| 4 | G3_2 | B_0 | 0.584790 |
The values in ‘prop’ column of edgedf
is the voting proportions from ‘node’ to the most likely ‘parent’.
[ ]:
# save the results
edgedf.to_csv(resdir / 'edgedf.csv')
# set the refined labels
adata.obs['refined_group'] = refined_group_lbs


Clients set their preffered delivery location, where by
Ater setting their location customer is free to choose a product that they would like to be delivered
once your order is with us it will be delivered to your door step
Located along Langata Road
DIALANDDELIVERY(DAD)
Tel:0742422690


On clicking the “File Upload” button you’ll be directed to a page for uploading your file(s). After successfully uploading your file(s) (this may take a little time if your file size is big enough), you’ll have to click on the “View Results'' button, to view results in the form of various graphs and visualizations. There’ll be a button on the “View Result” page that directs you to the main home page.


The Range set to open new store in Durham City, creating 80 jobs
The Range will open at Dragon Lane Retail Park in County Durham on Friday, where there will also be an Iceland Foods and cafe
by Kali LindsayA new homeware shop is set to open in Durham city, creating 80 jobs.
The Range will open on Friday at 9am, selling home leisure and gardens products across 16 departments.
There will also be an Iceland Foods and family cafe at the Dragon Lane Retail Park outlet.
It will create 80 full and part-time jobs which includes store and department managers, warehouse workers and retail assistants.
Chris Dawson, the founder of the firm, commented on the upcoming opening: “The Durham store has been in the pipeline for some time with it being a new build site.
"It is exciting that we are now ready to welcome our customers to the newly developed Dragon Lane Retail Park and we are thrilled to be bringing a new national retailer to the town.
"The job provision that comes with the new store, especially with it being a new build, should be a great boost to the local area."
There will be a number of new stores offers for customers, which will run until December 8.
Mayor of Durham, Councillor Katie Corrigan, will open the shop and there will be in-store events after the grand openings that will include a £250 Range gift card competition with Metro Radio.
There will be a giveaway for the first 50 people in the queue and activities for children in the opening day, with a range of free demos taking place over opening weekend.


CLOVIS is a concept, an idea, on visual intelligence systems. The concept is to bring together what we know on local labour markets and what we do in terms of our programs to assist decision-makers and program areas to better respond to actual needs based on more pragmatic and precise information. Developing visual information systems for ourselves is the future of consuming data for policy and decision-making. It is an important objective to develop tools at no additional cost in terms of software in leveraging open source data technology while offering an opportunity to analysts to develop capacity for better open data science. As such, this application is based on open source technology.
The data shown in CLOVIS is from the Center for Special Business Projects at Statistics Canada. All data are public from CENSUS 2011 and NHS 2011 or public administrative data from ESDC's wesbsite.
For the purpose of the information contained in this application, Official Language Minorities (OLM) refers to Francophones residing outside the province of Quebec and Anglophones residing within the province of Quebec.
Estimates for the OLM population, and other variables are derived from the first official language spoken (FOLS) variable in Statistics Canada’s Census and national household survey 2011. FOLS is used in the application of the Official languages Act (OLA). As such, it is also a standard in estimating OLM populations.
FOLS is derived from responses to Census questions on knowledge of the two official languages, the language spoken at home and the mother tongue. The derivation method and the use of FOLS are described in the OLA’s regulations.
When we refer to “communities”, we are referring to population estimates in relation to a given geography.
This work is driven by the development a new geography: the self-contained labour marketr areas (SLA) or local labour market areas. These areas are a grouping of census subdivisions (CSD) based on commuting flows of the employed labour force. In other words it represents the movement of people from their place of residence to their place of work. People who work from home are included because, while they don’t travel to work, they are part of the local workforce.
Commuting data comes from the National Household Survey. The flows comprise the place of residence, the place of work and the number of commuters who travel from origin to destination.
For information on the methodology: Munro, Anne, Alessandro Alasia and Ray D. Bollman. Self-contained labour areas: A proposed delineation and classification by degree of rurality. Statistics Canada. Catalogue no. 21-006-X, Vol. 8, No. 8 (December 2011)
Using an algorithm, the commuting flows are processed to create groups of CSDs with people living and working in one area. A labour market area is therefore a functional area, because it represents a geographically contained space where workers with jobs are residing and jobs are filled (Munro, Alasia and Bollman, 2011).
Skills have a critical role in the development of an area and in the well-being of its residents. They are associated with higher employment rates and better jobs, which in turn fosters higher living standards and growth all of which contributing to what has been called the “virtuous cycle.” For communities, skills development is an important part of any development strategy.
On the other hand, a focus on supplying skills alone may lead to skills surplus, tight competition among workers and outmigration of skilled workers, adding little to local sustainability and development. Work undertaken by the OECD Local Economic and Employment Development (LEED) led to the development of a methodology and framework which allows for the assessment of the match or equilibrium between the supply and demand for skills.
The Skills for Competitiveness Study (Giguere and Froy - 2009) included the development of the Skills Equilibrium methodology. To summarize skill demand is estimated using income and percentage of the people employed in medium- to high-skilled jobs. Skill supply is estimated by the percentage of the population with post-secondary education. This methodology has been adapted for the purposes of this work.
The Skills for Competiveness Study recommended that investment in skills upgrading be accompanied by stimulation of local demand for these skills, by encouraging local enterprises to increase their productivity and raise competitiveness. This can take the shape of investments in technology, optimization of forms of work organization and more management training to increase firms’ competitiveness and thus local demand for skilled labour. Such a comprehensive approach opens up the possibility for a region to move towards a situation with high demand for skilled labour balanced by an adequate labour supply, i.e. the so-called high skills equilibrium.
For more information on the Skills for Competitiveness Study or on the Skills Equilibrium Methodology: OECD's skills for competitiveness project
This is the old prototype version of the index and is not the final version. It is used here as an example. The index is designed to give an overview of the economic health of an area. It incorporates six timely dimensions of economic wellbeing into a single Economic Performance Index (EPI) calculated at the municipal and labour market area. Each dimension of the EPI reflects a separate concept of performance and is captured either as a single indicator or as a combination of multiple indicators. These six dimensions are:
Each of these dimensions takes the range of 0-1, with 0 indicating that the area has the least favourable outcome in terms of economic progress and 1 indicating that the area had the most favorable outcome. The final result is an index that provides a single performance measure and which can be decomposed into its various dimensions for the purposes of more detailed analysis and comparison of areas.
While information based on the index is included in the application, it remains a work in progress. It will be refined and updated information will be provided as it becomes available.
Some “self-contained labour areas” transcend provincial boundaries where there is cross border commuting to and from work. In the context of the information contained in this application, the most comlex issue is in those areas neighbouring the province of Quebec (Ontario and New Brunswick).In the “self-contained labour areas” that straddle the borders of Quebec and Ontario or New Brunswick, the OLM population is a mix of the English-speaking OLM of Quebec and the Francophone OLM of the other provinces. Depending on the area, the proportions can be representative of one or the other province’s official language minority. As an example, the Petawawa area is more representative of the Francophones in Ontario, not of the Anglophones in Quebec.
The “self-contained labour areas” where this phenomenon occurs are:
When exploring these areas, caution is advised in interpreting the information found.


MHKiT Quality Control Module¶
The following example runs a simple quality control analysis on wave elevation data using the MHKiT QC module. The data file used in this example is stored in the \MHKiT\examples\data directory.
Start by importing the necessary Python packages and MHKiT modules.
[1]:
import pandas as pd
from mhkit import qc, utils
Load Data¶
The wave elevation data used in this example includes several issues, including timestamps that are out of order, corrupt data with values of -999, data outside the expected range, and stagnant data.
The data is loaded into a pandas DataFrame using the pandas method read_csv
. The first 5 rows of data are shown below, along with a plot.
[2]:
# Load data from the csv file into a DataFrame
data = pd.read_csv('data/qc/wave_elevation_data.csv', index_col='Time')
# Plot the data
data.plot(figsize=(15,5), ylim=(-60,60))
# Print the first 5 rows of data
print(data.head())
probe1 probe2 probe3
Time
10.000 24.48 28.27 1.3
10.002 34.48 40.27 -8.7
10.004 30.48 38.27 -13.7
10.006 12.48 24.27 -32.7
10.008 13.48 22.27 -21.7
The data is indexed by time in seconds. To use the quality control functions, the data must be indexed by datetime. The index can be converted to datetime using the following utility function.
[3]:
# Convert the index to datetime
data.index = utils.index_to_datetime(data.index, origin='2019-05-20')
# Print the first 5 rows of data
print(data.head())
probe1 probe2 probe3
Time
2019-05-20 00:00:10.000 24.48 28.27 1.3
2019-05-20 00:00:10.002 34.48 40.27 -8.7
2019-05-20 00:00:10.004 30.48 38.27 -13.7
2019-05-20 00:00:10.006 12.48 24.27 -32.7
2019-05-20 00:00:10.008 13.48 22.27 -21.7
Quality control tests¶
The following quality control tests are used to identify timestamp issues, corrupt data, data outside the expected range, and stagnant data.
Each quality control tests results in the following information:
Cleaned data, which is a DataFrame that has NaN in place of data that did not pass the quality control test
Boolean mask, which is a DataFrame with True/False that indicates if each data point passed the quality control test
Summary of the quality control test results, the summary includes the variable name (which is blank for timestamp issues), the start and end time of the test failure, and an error flag for each test failure
Check timestamp¶
Quality control analysis generally starts by checking the timestamp index of the data.
The following test checks to see if 1) the data contains duplicate timestamps, 2) timestamps are not monotonically increasing, and 3) timestamps occur at irregular intervals (an interval of 0.002s is expected for this data).
If duplicate timestamps are found, the resulting DataFrames (cleaned data and mask) keep the first occurrence. If timestamps are not monotonic, the timestamps in the resulting DataFrames are reordered.
[4]:
# Define expected frequency of the data, in seconds
frequency = 0.002
# Run the timestamp quality control test
results = qc.check_timestamp(data, frequency)
The cleaned data, boolean mask, and test results summary are shown below. The summary is transposed (using .T) so that it is easier to read.
[5]:
# Plot cleaned data
results['cleaned_data'].plot(figsize=(15,5), ylim=(-60,60))
# Print the first 5 rows of the cleaned data
print(results['cleaned_data'].head())
probe1 probe2 probe3
2019-05-20 00:00:10.000 24.48 28.27 1.3
2019-05-20 00:00:10.002 34.48 40.27 -8.7
2019-05-20 00:00:10.004 30.48 38.27 -13.7
2019-05-20 00:00:10.006 12.48 24.27 -32.7
2019-05-20 00:00:10.008 13.48 22.27 -21.7
[6]:
# Print the first 5 rows of the mask
print(results['mask'].head())
probe1 probe2 probe3
2019-05-20 00:00:10.000 True True True
2019-05-20 00:00:10.002 True True True
2019-05-20 00:00:10.004 True True True
2019-05-20 00:00:10.006 True True True
2019-05-20 00:00:10.008 True True True
[7]:
# Print the test results summary
# The summary is transposed (using .T) so that it is easier to read.
print(results['test_results'].T)
0 1 \
Variable Name
Start Time 2019-05-20 00:00:10.230000 2019-05-20 00:00:10.340000
End Time 2019-05-20 00:00:10.230000 2019-05-20 00:00:10.340000
Timesteps 1 1
Error Flag Nonmonotonic timestamp Duplicate timestamp
2
Variable Name
Start Time 2019-05-20 00:00:10.042000
End Time 2019-05-20 00:00:10.044000
Timesteps 2
Error Flag Missing timestamp
Check for corrupt data¶
In the following quality control tests, the cleaned data from the previous test is used as input to the subsequent test. For each quality control test, a plot of the cleaned data is shown along with the test results summary.
Note, that if you want to run a series of quality control tests before extracting the cumulative cleaned data, boolean mask, and summary, we recommend using Pecos directly with the object-oriented approach, see https://pecos.readthedocs.io/ for more details.
The quality control test below checks for corrupt data, indicated by a value of -999.
[8]:
# Define corrupt values
corrupt_values = [-999]
# Run the corrupt data quality control test
results = qc.check_corrupt(results['cleaned_data'], corrupt_values)
# Plot cleaned data
results['cleaned_data'].plot(figsize=(15,5), ylim=(-60,60))
# Print test results summary
print(results['test_results'].T)
0 1
Variable Name probe1 probe3
Start Time 2019-05-20 00:00:10.110000 2019-05-20 00:00:10.834000
End Time 2019-05-20 00:00:10.134000 2019-05-20 00:00:10.848000
Timesteps 13 8
Error Flag Corrupt data Corrupt data
Check for data outside the expected range¶
The next quality control test checks for data that is greater than 50 or less than -50. Note that expected range tests can also be used to compare measured values to a model, or analyze the expected relationships between data columns.
[9]:
# Define expected lower and upper bound ([lower bound, upper bound])
expected_bounds = [-50, 50]
# Run expected range quality control test
results = qc.check_range(results['cleaned_data'], expected_bounds)
# Plot cleaned data
results['cleaned_data'].plot(figsize=(15,5), ylim=(-60,60))
# Print test results summary
print(results['test_results'].T)
0 1 \
Variable Name probe3 probe3
Start Time 2019-05-20 00:00:10.240000 2019-05-20 00:00:10.468000
End Time 2019-05-20 00:00:10.240000 2019-05-20 00:00:10.468000
Timesteps 1 1
Error Flag Data < lower bound, -50 Data < lower bound, -50
2
Variable Name probe3
Start Time 2019-05-20 00:00:10.716000
End Time 2019-05-20 00:00:10.716000
Timesteps 1
Error Flag Data > upper bound, 50
Check for stagnant data¶
The final quality control test checks for stagnant data by looking for data that changes by less than 0.001 within a 0.02 second moving window.
[10]:
# Define expected lower bound (no upper bound is specified in this example)
expected_bound = [0.001, None]
# Define the moving window, in seconds
window = 0.02
# Run the delta quality control test
results = qc.check_delta(results['cleaned_data'], expected_bound, window)
# Plot cleaned data
results['cleaned_data'].plot(figsize=(15,5), ylim=(-60,60))
# Print test results summary
print(results['test_results'].T)
0
Variable Name probe2
Start Time 2019-05-20 00:00:10.400000
End Time 2019-05-20 00:00:10.544000
Timesteps 73
Error Flag Delta < lower bound, 0.001
Cleaned Data¶
The cleaned data can be used directly in MHKiT analysis, or the missing values can be replaced using various methods before analysis is run. Data replacement strategies are generally defined on a case by case basis. Pandas includes methods to interpolate, replace, and fill missing values.
[11]:
# Extract final cleaned data for MHKiT analysis
cleaned_data = results['cleaned_data']


Baken
cheetos
doritos
fritos
lays
Take this coins, but pay me later.
penny
five
dime
quarter
dollar
here is your order
Pay


Welcome to the "Keep It Simple: Package Manager", a simple package management standard and implementation coming to ask a simple question. Does package management have to be this complex? On all fronts, the answer is no. This project aims to prove that all package mananagers need are a simple set of scripts. We designed the whole system to be as simple, easy, and quick as possible. Current package managers for Linux and BSD are more complicated than they have to be.  FreeBSD's package manager is the best to describe how even in most best case scenarios in package management, it's way too complicated.
FreeBSD, you build a port, add it to the rest of the ports, then done. However, it takes 3 or more files, one of them is a Makefile which have irritating syntax, they require the code in an external place anyways, you probably need a couple other weird files, and the make file adds insult to injury by having a dependency Makefile to be linked in order to work! Plus, the work for the FreeBSD devs to get those ports as packages is difficult, and hosting your own package manager source is not really too easy. And remember, FreeBSD has a better package management build system.
The question to answer to "Can we make package management simple?" is yes. Welcome to KISPM. While KISPM is not much more than an experiment, even going as far as to not bother with makesums like every other package manager, it does work.
Design
Making a KISPM file is as easy as writing the commands to compile your script in the first place. Here is the list of design choices made to make KISPM easy:
- There are only two required files,
manifest.kis
andbuild.kis
. - Running a repository is simple as possible. It will be in the Repo Documentation.
- Making a build script is essentially making a shell script. Read
build.kis
Documentation. - Both
manifest.kis
andbuild.kis
are available specifically tools for repo owners. - Install commands are easy to read and understand.
- Adding a new repo is simple, read Getting Started.
Purpose
Here are the four goals of the KISPM project.
- Make things simple for developers.
- Make repo hosting simple.
- Make it accessable.
- Keep It Simple, Stupid.
To Note
The KISPM project is a work-in-progress standardization package manager project by the Potabi Foundation.


Hello world!
ASCII printable characters (32-127)
ASCII was the first character encoding standard (also called character set). Because ANSI and ISO-8859-1 were so limited, HTML 4 also supported UTF-8. UTF-8 (Unicode) covers almost all of the characters and symbols in the world. The default character set for HTML5 is UTF-8.


micom
will construct communities from a specification via a Pandas DataFrame. Here, the DataFrame needs at least two columns: “id” and “file” which specify the ID of the organism/tissue and a file containing the actual individual model.
To make more sense of that we can look at a small example. micom
comes with a function that generates a simple example community specification consisting of several copies of a small E. coli model containing only the central carbon metabolism.
[1]:
from micom.data import test_taxonomy
taxonomy = test_taxonomy()
taxonomy
[1]:
| id | genus | species | reactions | metabolites | file | |
|---|---|---|---|---|---|---|
| 0 | Escherichia_coli_1 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... |
| 1 | Escherichia_coli_2 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... |
| 2 | Escherichia_coli_3 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... |
| 3 | Escherichia_coli_4 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... |
As we see this specification contains the required fields and some more information. In fact the specification may contain any number of additional information which will be saved along with the community model. One special example is “abundance” which we will get to know soon :) The logic behind requiring the community information in this table format is that this table can be appended as supplement to your project or publication as is and describes your community composition without any doubt.
In order to convert the specification in a community model we will use the Community
class from micom
which derives from the cobrapy Model
class.
[2]:
from micom import Community
com = Community(taxonomy)
print("Build a community with a total of {} reactions.".format(len(com.reactions)))
Build a community with a total of 400 reactions.
This includes the correctly scaled exchange reactions with the internal medium and initializes the external imports to the maximum found in all models. The original taxonomy is maintained in the com.taxonomy
attribute.
Note that micom
can figure out how to read a variety of different file types based on the extension. It curently supports:
.pickle
for pickled models
.xml
or .gz
for XML models
.json
for JSON models
.mat
for COBRAtoolbox models
[3]:
com.taxonomy
[3]:
| id | genus | species | reactions | metabolites | file | abundance | |
|---|---|---|---|---|---|---|---|
| id | |||||||
| Escherichia_coli_1 | Escherichia_coli_1 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... | 0.25 |
| Escherichia_coli_2 | Escherichia_coli_2 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... | 0.25 |
| Escherichia_coli_3 | Escherichia_coli_3 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... | 0.25 |
| Escherichia_coli_4 | Escherichia_coli_4 | Escherichia | Escherichia coli | 95 | 72 | /home/cdiener/code/micom/micom/data/e_coli_cor... | 0.25 |
As you can notice we have gained a new column called abundance
. This column quantifies the relative quantity of each individual in the community. Since we did not specify this in the original taxonomy micom
assumes that all individuals are present in the same quantity.
The presented community here is pretty simplistic. For microbial communities micom
includes a larger taxonomy for 773 microbial species from the AGORA paper. Here the “file” column only contains the base names for the files but you can easily prepend any path as demonstrated in the following:
[4]:
from micom.data import agora
tax = agora.copy()
tax.file = "models/" + tax.file # assuming you have downloaded the AGORA models to the "models" folder
tax.head()
[4]:
| organism | seedid | kingdom | phylum | mclass | order | family | genus | oxygenstat | metabolism | ... | draftcreated | phenotype | imgid | ncbiid | platform | kbaseid | species | file | id | taxa_id | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Abiotrophia defectiva ATCC 49176 | Abiotrophia defectiva ATCC 49176 (592010.4) | Bacteria | Firmicutes | Bacilli | Lactobacillales | Aerococcaceae | Abiotrophia | Facultative anaerobe | Saccharolytic, fermentative or respiratory | ... | 07/01/14 | 1.0 | 2.562617e+09 | 592010.0 | ModelSEED | NaN | defectiva | models/Abiotrophia_defectiva_ATCC_49176.xml | Abiotrophia_defectiva_ATCC_49176 | 46125.0 |
| 1 | Achromobacter xylosoxidans A8 | Achromobacter xylosoxidans A8 (762376.5) | Bacteria | Proteobacteria | Betaproteobacteria | Burkholderiales | Alcaligenaceae | Achromobacter | Aerobe | Respiratory | ... | NaN | NaN | NaN | 762376.0 | ModelSEED | kb_g_3268_model_gf | xylosoxidans | models/Achromobacter_xylosoxidans_A8.xml | Achromobacter_xylosoxidans_A8 | 85698.0 |
| 2 | Achromobacter xylosoxidans NBRC 15126 = ATCC 2... | NaN | Bacteria | Proteobacteria | Betaproteobacteria | Burkholderiales | Alcaligenaceae | Achromobacter | Aerobe | Respiratory | ... | NaN | NaN | NaN | 1216976.0 | Kbase | kb|g.208127 | xylosoxidans | models/Achromobacter_xylosoxidans_NBRC_15126.xml | Achromobacter_xylosoxidans_NBRC_15126 | 85698.0 |
| 3 | Acidaminococcus fermentans DSM 20731 | Acidaminococcus fermentans DSM 20731 (591001.3) | Bacteria | Firmicutes | Negativicutes | Acidaminococcales | Acidaminococcaceae | Acidaminococcus | Obligate anaerobe | Fermentative | ... | 04/17/16 | NaN | 6.463119e+08 | 591001.0 | Kbase | kb|g.2555 | fermentans | models/Acidaminococcus_fermentans_DSM_20731.xml | Acidaminococcus_fermentans_DSM_20731 | 905.0 |
| 4 | Acidaminococcus intestini RyC-MR95 | Acidaminococcus intestini RyC-MR95 (568816.4) | Bacteria | Firmicutes | Negativicutes | Selenomonadales | Acidaminococcaceae | Acidaminococcus | Obligate anaerobe | Asaccharolytic, glutamate is fermented | ... | 08/03/14 | 4.0 | 2.511231e+09 | 568816.0 | Kbase | NaN | intestini | models/Acidaminococcus_intestini_RyC_MR95.xml | Acidaminococcus_intestini_RyC_MR95 | 187327.0 |
5 rows × 26 columns
Contructing large community models can be slow which is due to performance limitations of the solvers. In essence, adding a single variable/constraint to a model qih 10 variables is much faster than adding it to a model with 10 million variables. Thus, we recommend you save the constructed community in a serialized format afterwards which will be much faster in loading repetitively.
[5]:
%time com = Community(taxonomy)
CPU times: user 756 ms, sys: 12.6 ms, total: 768 ms
Wall time: 776 ms
[6]:
%time com.to_pickle("community.pickle")
CPU times: user 77.8 ms, sys: 3.77 ms, total: 81.6 ms
Wall time: 81.4 ms
[7]:
from micom import load_pickle
%time com = load_pickle("community.pickle")
CPU times: user 36.4 ms, sys: 7.71 ms, total: 44.1 ms
Wall time: 43.6 ms
As we can see loading the model from the pickle format is much faster than creating it de novo.
[ ]:


The Enyo Community Gallery is a collection of libraries, controls, and doodads written by the larger Enyo JavaScript programming community.
For contribution information, see the Enyo Gallery github page.
The gallery includes:


Reports strings in method parameters and return values annotated with the @Nls annotation with a "capitalization" parameter
to conform to capitalization rules that exist in most platform UI guidelines.
Example:
void<EMAIL_ADDRESS>String title) {}
setTitle("This is sentence capitalization but should be title");
After the quick-fix is applied:
setTitle("This Is Sentence Capitalization but Should Be Title");


I want to fill this text out quite a lot, and get everything possible represented in RDF, but for now here's the serialised version...
I got my first electric guitar as a teenager, though never learned how to play it (wasn't so necessary for the punk at the time). Over the following years I got through another two or three, but then didn't have one for at least a decade, until last year. Then we bought a cheap Squier Strat from the shop in Lucca, along with a bass for Caroline and a couple of combo amps. For the price the Squier was remarkably good, but I wasn't really satisfied with the sound. I swapped out the pickups and spent quite a bit of time playing with wiring combinations. This made a huge difference, but there was still a weak link - the body. The Squier has a much thinner body than a regular Strat. I don't know what kind of wood they're made from but I'm fairly sure it's built up from smaller blocks. The net effect is that it seems to act on the overall response like a flannel.
A few months ago I inherited a source of interesting wood, so decided to start another guitar more or less from scratch. I have very little woodworking experience (a bit of carving) so decided to leave the hardest part to the expert machines - I bought a replacement Strat neck from StewMac. I bought the hardware too, I'm not remotely equipped for metal machining and haven't the patience for pickup winding. What's left is body construction and assembly. Here are some photos of the process I went through, some are a bit blurry I'm afraid - the cheap HP camera has focus issues.
Here's as far as I've got. It works, feels good, sounds great. It's not yet finished, but I'm going to leave is a month or so in this state to try it out, and let it settle. Amongst other things I expect to have to do a little more contouring before finishing the body, probably with oil & wax. I expect the body to go quite a bit darker and hopefully for the grain to stand out more, with the scratchplate/control panel being virtually the same colour (they're made from the same wood as the body itself).
It's called the Vinocaster because it's made from wood reclaimed from a wine vat (tino), the one on the right in the picture below. It was left in the cantina in our new/old house. Achille, who's barrel it was reckoned it was chestnut (castagna) - I'm not 100% sure, it might be oak. Oak is the traditional barrel wood, but given that we live in a chestnut forest (Garfagnana) it's a distinct possibility. In appearance, when prepared, the local oak and chestnut wood is fairly indistinguishable. The reason I have any doubts is that in some places in the barrel woodworm had tunnelled quite deep. Chestnut is very high in tannin, and most old wood only has fairly surface worm attack.
Neither chestnut or oak is exactly known as a tone wood, but I assumed that given the hardness of the stuff, if I made the body suitably thick then it would worst case be rigid. It's worth noting that Fender's early designs were based largely on wood availability and ease of (factory) construction - two of my considerations.
My priorities were for sound and playability, appearance being well down the list. While most guitars aimed at being ergonomic tend to be lightweight, I actually wanted to go the other way, I feel more comfortable playing something with a bit of mass. I opted for a Stratocaster shape in part because I had the Squier to use as a guide, but mostly because I think Fender happened to hit on a remarkably good design.
I could have used the bottom of the barrel for the body, but decided (this time around at least) to use the staves. These were not only thinner and narrower than required, but also bent. A lot of time went into preparing these.
I don't seem to have a photo of the exact pieces I used for the body, but I cleaned up quite a few more for future use (thinking maybe window frames and furniture). Here's one of the staves from the older barrels prior to clean-up:
I cut these particular ones in half lengthwise because they were too bent to be much in full. The first bit of cleanup I did with a mallet and old chisel. The inside of the barrels was covered in a purple encrustation. I'm not sure if that was just grape residue or they'd been lined with a bit of gesso. It tasted of gravel.
After getting the worst grolly off, I used an electric plane to partially level and smooth the surfaces. Messy.
With the pieces for the guitar I improvised a pair of tracks for the router so I could get at least one side flat. I'm completely inexperience with a router so ended up having to use a hand plane to clean up. I'd handplaned one edge square and flat, cut the width on the bandsaw and used the plane again to smooth the other edge. It sounds a lot more straightforward than it was - I went round and round on this, the bend of the staves was really persistent.
Early on I'd also made up a plywood template of the body shape, traced on paper from the Squier then cut out with the bandsaw, perimeter finished off with hand tools. Once I'd got the edges and one face of the staves flat I next glued them edge to edge.
I'd decided to use epoxy resin for glue, and the best that was available from the nearest hardware shop was 48 hr setting, grey-coloured. Appearance was a low priority and I was fairly sure the joins would match well enough that it wouldn't be a real eyesore. I got one side of the pieces as flat as I could, and clamped against some thick flat plywood.
I was aiming for 2 inch thickness all over to start with, so needed two layers. The best faces produced from the edge gluing were fairly flat, a little hand smoothing got them good enough for me. Then I glued the two flats face-to-face.
The result wasn't perfect, but I was very happy.
After planing the outside surfaces more level, I used the bandsaw to roughly cut out the shape.
Thickness was about right.
The staves appeared like they'd come from fairly small trees/branches, I thought it probably best to line them up as in the offcut from the end.
The way I'd planned it was for four parallel lengths across the front, five across the back. The idea being that the centre length on the back would act as a solid spine, parallel to the run of the strings.
This is a lot thicker than the Squier.
I couldn't get a narrow bandsaw blade locally so I just did my best with what I had, making lots of straight cuts into curves before cutting them. Although the edge surface came out really uneven and scorched quite a bit, the bandsaw was still a brilliant timesaver.
I then cleaned up the edges a bit with gouges and a spokeshave (an antique wooden one I had - I'd have bought a new steel one if any of the shops around here had stocked them). Time to start thinking about attaching the neck.
I roughed out the neck pocket by eye with the router, with a couple of fences to be on the safe side. The fences were a marvellous find in a hardware shop - they're rectangular tubes of aluminium, dead straight, intended for something like curtain rails (not sure).
Seemed to me the best way of getting a good fit on the neck was to use it to put guides in place for the router. I'd got a router bit with bearings on it which could run directly along the edge of the aluminium bits (photo below).
Despite taking time over this, my inexperience with the router showed, I messed up the inner edge a bit and the bottom was fairly uneven.
But the sides (which would have been the hardest part to fix) came out spot on. Very snug fit.
I then checked the alignment, taping the bridge in place and putting on a couple of strings.
Not bad at all. The bridge I'd bought allows some sideways adjustment of the string positions, so I was delighted to see the alignment was easily close enough.
Because the body was still 2" thick, I routed down an area on the other side (to 1.75") to take the fixing plate. I placed the back plate in the pocket to position the screw holes, drilling through from that side. The drill bit broke in the wood on the last hole. That caused a lot of grief.
A significant amount of cursing later, I had the neck attached.
Next I moved on to routing holes in the front for the pickup (I decided to try just the one at first) and controls. Again I roughed out the hole by eye. I'd bought templates from StewMac, held down with double-sided tape (which worked well).
The bearings are meant to run against the template, the blade cutting the edge of the wood exactly in line. That's the idea, but again I was a bit clumsy, somehow trimmed a chunk out of the template.
The result was fine though, after I realised that I'd not taken the thickness of the template into account when setting the cutter depth.
Because I wasn't sure quite how I wanted the controls, I made a hole to match the Strat's jack socket plate. For starters I'd use a regular jack socket and a single volume pot mounted in that area.
I then used an absurdly long drill bit to make a hole from the pickup to the control recess.
Next I made a temporary scratchplate and control front panel from flat plastic. Once done, I attached the rest of the hardware and wired up the pickup. It took a while but was relatively straightforward. Remarkably the action hardly needed any adjustment. Glee.
I then plugged it in and gave it a twiddle.
The pickup I'd chosen for the bridge was a TV Jones Magna'Tron in a regular humbucker-shaped mount. I'd been very worried this might have been a mistake because I'd not really thought it through before ordering. For a start I didn't need to have chosen the humbucker mount, I was making the hole into which it would sit after all (their standard mount looks a lot cooler, boo). But more importantly the Magna'Tron has fixed pole pieces, if the volume balance across the strings was out I'd be out of luck.
But TV Jones is known for magic, and this thing Just Worked. The sound was wonderful. More glee.
My favourite sound from the Squier was a mix of the bridge & middle pickups, I left the switch there most of the time. When I did an A-B test against the Squier the nearest sound to the Vinocaster (which now had earned a name) was with that bridge & middle configuration. What's more the timbre seemed that much richer somehow, and actually better balanced across the strings (even though I'd tweaked the Squier a lot).
Much glee.
Ok, so far so good.
Next I routed recesses for two more pickups (forgot to photograph this bit). Then I contoured the body using gouges & the spokeshave, and gave it a basic sanding. I also cut some veneer from the spare barrel wood for scratchplate and controls, putting a thin layer of epoxy on the back followed by copper tape.
The wiring should have been straightforward, had I not ordered the wrong switch. I wanted a 5-way, I ended up with a 3-way. A bit of file work gave it the additional positions, but the circuit was another matter. I wanted a straight neck/neck+middle/middle/middle+bridge/bridge set of options. Can you see that here?
After a lot of sketching & trial & error I ended up near-enough. If the switch is fully in the bridge position it's silent, but tweaked a teeny fraction it works.
That one piece on the back looks a bit weird, but should look better after final sanding & finishing. Not bothered anyhow - it's on the back.
For the contours I approximated those of the Squier, with just a little more off the lower bout where my right arm rests.
It still needs cleaing up, but I am so pleased with that neck joint.
I think I've made a minor error with the machine heads. It seems these Sperzel locking tuners are actually of different heights, and low enough that string trees aren't needed (I used some fancy roller string trees, what the heck).
The white pickups are Seymour Duncans, a Duckbucker in the middle, Cool Rails in the neck. I had these plus a Lil'59 (pseudo-Gibson humbucker sound) on the Squier, left that behind because I already have a real humbucker. The Cool Rails gives a mellow, vaguely Strat-ish sound, very Jazz. The Duckbucker sounds very Strat but I'm not sure whether I'll leave it there - it's low output compared with the others, and in combination it pulls down the combined level (I suspect its coils are wired in parallel, but I think there were only 2 wires available).
The scratch/pickup plate wasn't intended to be so blocky, it started with 'ears' extending up the sides of the neck-end. But I cut the line across the cut-out the wrong place and it looked terrible, so I dispatched the ears. (It still remains to be seen whether the material I've used for these panels will be durable enough, could well end up changing).
The Sperzel roller bridge I'd chosen because it took the strings through its end, and not through the body. As it happens it's a nice thing in other ways - very solid feeling, and the rollers can be moved side-to-side in addition to the usual height/intonation adjustments.
As well as the deep contouring on the left of the lower bout, the whole front has a slight slope (3/16" at most) from the middle (on the perimeter of the the pickup/bridge area) to the edges.
The nut needed work, it was way too high. I think I've got it pretty close now, very careful file & knife work.
I've not got the setup optimal just yet, but the action is great.
I may well redo the control panel, not just because it's layout is a bit wonky. I still think the knob is too close to the playing area of the strings. That's the biggest design flaw of the Strat IMHO, the controls are in the way. It feels much better having open space all around that area.
The control placement isn't very good for the stand either, but I think I'll leave it there.
So aside from minor adjustements now I'm going to leave it bare a month or so to play and see if any changes are needed, especially to the contouring.


pycollect¶
-
class
pycollect.
PythonFileCollector
(use_regex_patterns: bool = False, additional_file_exclusion_patterns: Iterable[str] = None, additional_dir_exclusion_patterns: Iterable[str] = None)[source]¶ PythonFileCollector provides method
collect()
to collect files while applying exclusion patterns to files and directories.Exclusion patterns are in respect to file and directory names only, NOT taking into account the absolute nor the relative file or directory path.
When not using regex patterns, a single wildcard,
*
, can be used anywhere in a pattern to filter names “starting with” and/or “ending with”. Also, a single exclamation mark,!
, can be used at the beginning of the pattern to negate it. These only applies when the parameteruse_regex_patterns
isFalse
.Note
Using regex patterns may be slower as it consumes more CPU.
- Parameters
use_regex_patterns – (default:
False
) flag to indicate whether or not to use regex to match patterns. When this flag it set toFalse
the*
character is interpreted as wildcard and patterns starting with the!
character are negated.additional_file_exclusion_patterns – (default:
None
) additional patterns to filter out of collection files. In addition to the PythonFileCollector._DEFAULT_FILE_EXCLUSION_PATTERNS or PythonFileCollector._DEFAULT_FILE_EXCLUSION_REGEX_PATTERNS any file that matches these patterns will be excluded from collection.additional_dir_exclusion_patterns – (default:
None
) additional patterns to filter out of collection directories. In addition to the PythonFileCollector._DEFAULT_DIR_EXCLUSION_PATTERNS or PythonFileCollector._DEFAULT_DIR_EXCLUSION_REGEX_PATTERNS any directory that matches these patterns will be excluded from collection.
-
DEFAULT_DIR_EXCLUSION_PATTERNS
= {'*~', '.*', '__pycache__', 'bin', 'build', 'develop-eggs', 'dist', 'eggs', 'htmlcov', 'parts', 'pyvenv*', 'sdist', 'tmp', 'var', 'venv*', 'wheelhouse'}¶ The default set of directory exclusion patterns.
Are excluded by default:
Directories starting with a dot (
.
);Directories ending with a tilde (
~
).Directories with common names indicating auto-generated content, binaries, cache and temporary content (e.g.,
__pycache__
,tmp
,dist
)
-
DEFAULT_FILE_EXCLUSION_PATTERNS
= {'!*.py', '.*', '~*'}¶ The default set of file exclusion patterns.
Are excluded by default:
Files without the
.py
extension;Files starting with a dot (
.
); andFiles starting with a tilde (
~
).
-
collect
(search_path: Optional[str] = None, recursion_limit: Optional[int] = None, follow_symlinks: bool = True) → Set[posix.DirEntry][source]¶ Method to perform Python files collection in the specified search path, respecting exclusion patterns set to the class object.
- Parameters
search_path – (default: uses the caller’s path) absolute or relative path from which to search for when collecting Python files. This is expected to be a directory.
recursion_limit – (default: None) directory recursion limit. The directory indicated by the :param search_path: is considered level 0 of recursion.
follow_symlinks – (default: True) boolean indicating whether or not to follow symbolic links when collecting Python files.
- Returns
A set of DirEntry instances referring to each collected file is returned.
-
pycollect.
find_module_name
(filepath: Union[str, os.PathLike], innermost: bool = False) → Optional[str][source]¶ Utility function to find the Python module name of a python file.
- Parameters
filepath – The absolute filepath as a DirEntry object, path string or PathLike object.
innermost – (default: False) By default the outermost possible module name is returned. When this flag is set to True, the first found, innermost possible module name is then returned without further looking.
- Returns
The module name string or None if no module was found for the specified filepath.


Full-stack web developer, techie, and fellow human being who is collaborative, hands-on, and entrepreneurial to the core. Humble when it comes to learning more while knowing that one does not know everything. A creative designer who takes innovative approaches. Focused and goal oriented when it comes to problem solving.
HTML, CSS, Javascript, Ruby on Rails
A shamless twitter app that is poop themed. 💩
MongoDB, Express, React, Node.js
Git Repo
A classic turn-based Role Playing Game where you create a party and battle against random enemies in random places!
HTML, CSS, Javascript
Git Repo
A social media service where people post small task or odd jobs for people to do for money.
HTML, CSS, MongoDB, ejs
Git Repo


Wells
Look, I'm in a well!
Look, I'm in a well!
Look, I'm in a well!
Look, I'm in a well!
Responsive embed


PPT
ARTICLES
VIDEOS
EVENTS
PPT Upload
Title
PDF Discription
Aarticle Upload
Title
Write your Article here...
Video
Video URL
Video Discription
Events


A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word "and" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn’t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their.
0 Years Experienced
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts.
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
$29.00 / month
$59.00 / month
$79.00 / month
$89.50 / month
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
A small river named Duden flows by their place and supplies it with the necessary regelialia.
A small river named Duden flows by their place and supplies it with the necessary regelialia.
A small river named Duden flows by their place and supplies it with the necessary regelialia.
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
198 West 21th Street, Suite 721 New York NY 10016


I've just got started with 2 EmonTxs monitoring 8 AC circuits and 1 using Robins PV diverter into 2 dump loads (soon to be 3).
I'm trying out emoncms as a replacement for my current logging software. It looks as if it may do the job, but I'm wondering about its' performance and the hardware requirements for decent performance.
My first idea was to install it on a PC that's currently a WHS system serving files, and doing a few other things. That's more or less failed for various reasons, so I'm using the RaspberryPi HD version, which works, but is horribly slow to serve simple graphs with about 30 feeds. That makes me think that it will give up when logging 2-300 feeds.
What is a reasonable spec PC to use as an emoncms server logging a minimum of 200 feeds at 20 second intervals which will draw graphics reasonably snappily?
Re: PC spec for adequate performance of emoncms
Are your feeds configured to use Timestore or MySQL?
MySQL was notoriously slow at rendering graphs, whilst Timestore saw a dramatic increase in performance.
I'm using a humble Raspberry Pi to render 20 feeds, whilst supporting a media & file server, as well as a continuous cloud backup/sync, and graphs are rendered pretty quickly.
Paul
Re: PC spec for adequate performance of emoncms
Just uploaded a quick screen capture to youtube showing speed of rendering as per last post.
I suppose it depends what you call fast!
Paul
Re: PC spec for adequate performance of emoncms
Thanks for doing that. That seems to be a similar update speed to my installation, if you are just using one multi-graph. That's acceptable though a bit slow. If you add more lines, or make a dashboard with more than one graph it becomes very slow; I've made one dashboard with 6 bargraphs - it takes 15 seconds to load over my local network. This is when it's not got much load logging data. I suspect that it'll give up if it has to do a lot more logging.
It's a mixture of feeds; the emonTXs use Timestore the ECM1240/btmon.py seems to have decided to use MySQL. The 6 bargraph dashboard uses 3 of each.


5 Lead Generation Ideas to Help You Better
We’ve established a lineup of effective web design and development services to facilitate the growth of your business.
With our 17+ years of experience, our SEO services will get your site ranking.
From blogs and social posts to infographics videos we create and promote quality.
Boost brand awareness and reach your customers on a human level.
Let our web design portfolio speak for itself and prove you we’re the best.
Buffalo Crend Tours is a brand-new business that Mainstreethost branded from the ground up. We designed their logo and website, and do some blogging for them, to boot.
websiteBuffalo Crend Tours is a brand-new business that Mainstreethost branded from the ground up. We designed their logo and website, and do some blogging for them, to boot.
websiteAll of the tools right at your fingertips. With one quick click, you can see how your site is doing. The dashboard offers instant access to reports.
1877 Perry Street Swartz Creekson, MI 48473
Phone: (012) 345 - 6789
Fax:<PHONE_NUMBER>
Monday to Saturday: 8:00am - 9:00pm Sunday: Closed
SeoPress is a battle-hardened team of search engine experts in San Francisco. Partner with us today to see how search experience optimization can revolutionize the way your website is found online.


Of all of David Lynch's films, I find myself ranking "Blue Velvet" on a lower meter. It's a good, blazingly original film that is also wholly uneven, obscene and tasteless to the core. The latter terms are not meant as a critique - Lynch at his best is always obscene and tasteless. But I also find "Blue Velvet" to be underwhelming, as say compared to "Eraserhead" (his greatest film) or the neo-noir/horror picture "Lost Highway." It's just that their themes are more complex and disturbing than this perverse take on suburbia.
"Blue Velvet" was released back in 1986 and was highly controversional for its time, mainly due to graphic scenes of torture and sex. There was also much talk about the sequence where Isabella Rossellini (Ingrid Bergman's daughter) is naked and publicly embarrassed, while teeth marks and cigarette burns cover her entire body. There is no question that Lynch has always had trouble protraying women in a positive light (take a close look at Patricia Arquette forced stripping at gunpoint in "Lost Highway"), but this particular sequence is pure misogyny serving no purpose in the entire film. Consequently, Rossellini also endures several beatings by a helium-sniffing psycho named Frank (a truly classic performance of psychotic rage by Dennis Hopper). There are also numerous close-up shots of ants and cockroaches littering the screen as if they were aware of something beyond our knowledge. Of course, the wonderful opening scenes of the film, including the shot of ants scowering the e! arth, suggest an evil lurking beneath a conservative town of white picket fences, rose gardens, people mowing their lawns, etc.
The story in "Blue Velvet" revolves around a potential murder mystery that is never quite explained or resolved (at least, not to my liking though Raymond Chandler's novels are often so complex that even he did not know what they were about). Kyle MacLachlan plays a college student named Jeffrey, who is visiting his picture-postcard hometown, Lumberton. One day, he discovers a severed human ear on an open field. He contacts the police and then decides to investigate on his own. This all leads to the apartment of a distraught singer (played by Rossellini), who occasionally sings "Blue Velvet" at a nightclub. Enter the deranged killer Frank who tortures and humiliates the poor singer, and the scenes between the two of them are as startling and effective as any other scene in the film. They contain a raw, vicious power that is unparalleled in the history of cinema, but they are often tempered with a joke or some sly humorous poke in the arm. There is such an intense buildup of em! otions that eventually Lynch throws it all away by winking at the audience - in effect saying, hey, this is not as bad as it looks. This reminds me of a similar scene in "Wild at Heart" where a similar psycho played by Willem DaFoe humiliated and sexually teased Laura Dern to the point where it was lessened by an unnecessary joke.
As Jeffrey veers further into this S & M world with the help of a policeman's daughter, Sandy (Laura Dern), things get much weirder especially when Dean Stockwell shows up as a Kabuki transvestite. Both Stockwell and Hopper must hold the record for spouting more obscenities on film than Eddie Murphy.
"Blue Velvet" is a fascinating, intriguing film but it is not completely successful. The elements of the mystery are so warped that I gave up after a while trying to follow it. It is true that some of Lynch's later work was more confounding and that it did not bother me much, but this mystery is actually more conventional and, dare I say, realistic so I did expect to be able to follow it. The performances are mostly shouting matches, especially between Hopper and Rosselini though their scenes lend the necessary realism to their strange, sexual bond. Kyle MacLachlan and Laura Dern merely react than act, except for one exquisitely subtle scene at a cafe. I also think the music by Angelo Badalamenti is far too offputting, though the songs by Julee Cruise enhance the theme of a town with dark secrets ready to explode. Plus, the uplifting ending negates the darkness that preceded it, though I did like the shot of the bird with a wasp in its mouth. That shot actually adds a sly perv! erse touch, but I could have lived without the annoying sappiness of it all.
For whatever strange reason I cannot comprehend, I still liked "Blue Velvet" because nobody has ever produced or directed anything like it prior to its release. There isn't anything you can easily compare it to. It is definitely Lynch's wildest endeavor and, somehow, strangely compelling. Being a huge Lynch fan, I will probably look at the film again ten years from now, and perhaps call it a masterpiece as many have. For now, this is just fairly good Lynch fare.
For more reviews, check out JERRY AT THE MOVIES at http://buffs.moviething.com/buffs/faust/
E-mail me with any questions, comments or general complaints at<EMAIL_ADDRESS>or at<EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


About Me
The reason I want to learn web design is so I can manage my own companies site.
I want to be able to understand HTML/CSS and make changes to our site without needing to email the web designer.
Qualifications
Enthusiastically synergize reliable manufactured products with interdependent e-business. Compellingly productivate sustainable niches before cooperative opportunities. Seamlessly coordinate long-term high-impact information via magnetic technology. Proactively customize functional scenarios through performance based systems. Professionally productize wireless strategic theme areas after bleeding-edge web services.
Experience
Enthusiastically synergize reliable manufactured products with interdependent e-business. Compellingly productivate sustainable niches before cooperative opportunities. Seamlessly coordinate long-term high-impact information via magnetic technology.
Hobbies
Telling bad jokes.


[Brent Downey] As a user of Salesforce for seven years, I’ve grown accustomed to Salesforce Classic, but have embraced Lightning Experience as much as possible, working to be an advocate for the new user experience and overall platform. While there are so many positives and exponential potential with the platform, as an end user and Administrator – Learn more at Admin Hero
Review
2017-02-10
2017-01-17
[DreamOps Crew] The ant-sf buildfile supplements tasks provided by the Ant-Salesforce JAR. The JAR provides a core set of tasks for retrieving and deploying metadata between Salesforce orgs and a Git version control repository.
The buildfile supports using task branches, where each task is a separate JIRA issue. Each task (or feature) can be developed in its own Salesforce environment, and merged back into the mainline of development.
Targets are provided for both direct consulting projects and managed package products. For products, either sandboxes or trial orgs can be used with a corresponding task branch.
2016-11-20
[DreamOps Crew] The DreamOps Guide helps Salesforce developers implement continuous delivery on the Force.com platform with step-by-step instructions that you can use to develop, package, release, monitor, and upgrade managed packages. Get more done, better and faster, by following a tried-and-true path. – DreamOps.org/guide – (under construction)
2016-10-25
[Ted Husted] In a classic Ted Talk (no relation), Tom Hulme asks “What can we learn from shortcuts?”. For years, many of us have been looking for shortcuts through the Salesforce application lifecycle, so that we can use continuous delivery to develop packages – Learn more at NimbleUser
2016-10-20
[Ted Husted] As the maker of two managed packages, Nimble AMS hs a vested interest in developing the very best code we can. According to Economics of Software Quality (by Caspers Jones), the most effective software quality assurance tools are (1) static program analysis and (2) peer review. – Learn more at NimbleUser
2016-10-14
[Keir Bowden] As regular readers of this blog will know, I wrote a book three years ago - the Visualforce Development Cookbook - and I really haven’t stopped banging on about it since. Well things just got worse as I finished the second edition in September and I’m obviously keen to shift as many copies as possible! – Learn more at Bob Buzzard Blog
2016-07-25
[Garry Polmateer] Salesforce has quietly rolled out a tool that could be of major value to you. It’s a Lightning assessment tool that quickly inventories an org’s features and generates an easy-to-read report that outlines those currently used features, plus notes on which ones are Lightning enabled. – Learn more at Red Argyle
2016-07-19
[Andrew Fawcett] Flow is a great technology for providing a means for non-coders to build functionality. More so than any other point and click facility on the platform, even Process Builder. Why? Because it offers a rich set of Elements (operations) that contain conditional branching, loop and storage of variables. Along with the ability to read or update any object (API accessible) you like. It’s almost like a programming language – Learn more at Andy In The Cloud
2016-06-14
[James Ward] Last week at the TrailheaDX Salesforce Dev Conference, we launched the DreamHouse sample application to showcase the Salesforce App Cloud and numerous possible integrations. I built an integration with the open source PredictionIO Machine Learning framework. The use case for ML in DreamHouse is a real estate recommendation engine that learns based on users with similar favorites. – Learn more at James Ward
2016-06-01
[Adam Torman] The Salesforce App Cloud platform has important auditing capabilities built in to ensure that you can focus on what’s most important: your business. One of these foundational audit tools is Login History. The Login History audit trail enables administrators to download the last six months of logins to the Force.com platform, either via a CSV download link in the setup user interface or via the API. With Login History, you can track login successes and failures by user, IP, application, API, or browser to name a few key attributes. In addition, Event Monitoring provides access to the Login log lines as well. As you can tell, we consider Login an important event to keep track of! – Learn more at Salesforce Hacker


OFFICE SPACE (M). (Twentieth Century Fox) Director: Mike Judge Stars: Ron Livingston, Jennifer Aniston, Gary Cole, David Herman, Ajay Naidu, Stephen Root, Diedrich Bader, Richard Riehle, John C McGinley, Alexandra Wentworth, Paul Willson Running time: 90 minutes.
Mike Judge, the creator of animated favourites Beavis And Butthead and King Of the Hill, turns his hand to live action comedy with Office Space, a sort of slacker's guide on how to succeed in business without really trying. This enjoyable enough comedy about the plight of office workers everywhere centres around a disenchanted computer programmer who finds himself unexpectedly promoted, despite his best efforts to get himself fired from his mundane job.
Peter Gibbons (Ron Livingston, from Swingers, etc) is a computer programmer at high tech computer firm Initech, but he has grown more stressed out and disenchanted by his job and lack of opportunity. Following a hypnosis therapy session that ends with the death of his analyst, Peter becomes far more relaxed and easy going, turning up to work late and casually dressed. A team of corporate consultants somehow identify his attitude as perfect management material and recommend him for promotion. He and two colleagues also put into motion a small scheme to help sabotage the company, which backfires.
A less interesting subplot centres around the growing romance between Peter and Joanna (Friends' star Jennifer Aniston), a waitress in a tacky fast food restaurant. Joanna is also growing tired of her thankless job and her manager's insistence on the employees wearing "lots of flair" and projecting a happy attitude. Aniston is wasted in an under developed role.
The film loses much of its comic energy and invention when it moves outside the office and away from the office politics of Initech.
One of the more fascinating characters here is Milton (Stephen Root), the mild, mumbling, much put upon employee who works in an increasingly cluttered office. Gary Cole (American Gothic, etc) is wonderfully droll as Lumbergh, the firm's laconic and irritating boss.
The film's very obvious philosophy is that there is more to life than working nine to five purely for the money to pay the bills. Man wasn't meant to spend all day sitting inside a tiny cubicle staring at a computer screen, or filling in meaningless forms in triplicate. Many within the audience will identify with the frustrations of the put-upon white collar characters here and sympathise with the movie's sentiments. However, they may find little consolation from some of the more extreme solutions that Judge suggests.
** greg king http://www.netau.com.au/gregking
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Hmm. We're having trouble getting your data from the internet. Please check your network connection and try again.
If you have a good connection it may be a problem with the data source. Please try again later.
We apologize for the inconvenience.
Car Recalls
Car recall information.
Version <IP_ADDRESS>
A Mindtile App
Realtime car recall data from the National Highway Traffic Safety Administration (NHTSA).


In order to expand the scope of this community, this year we will invite a large number of our conference guests through an open call. We welcome artists, programmers, activists, educators, hobbyists from all cultural, educational, and professional backgrounds to submit a proposal for a lightning talk or a session related to one of our themed-tracks this year.
LA-based applicants who work to empower trans, gender non-conforming, disabled, neuro-atypical, P.O.C., or any other underserved communities are especially encouraged to apply. We are looking for applicants who can address art, code, and / or this year’s themes in radical and empowering ways; you are more than welcome but not required to discuss or use Processing / p5.js in your presentation.
We are looking for lightning talk proposals that bring refreshing ideas and engage the community by addressing a particular track. All lightning talks will be live-streamed over the Internet and documented for the Processing Foundation archive.
Each session should address a specific track and run for 45 minutes, and you are in charge of the session format — it can be a workshop, a forum, a group project, a mini-hackathon etc. A session can fill up to 35 people. Please make a note in your application if your proposed session has a limit of attendees.
Date: August 10, 2018
Participants: Taeyoon Choi, A.M. Darke, Tega Brain, Sam Lavigne, Chandler McWilliams, Xin Xin, Dorothy Santos, Lauren McCarthy, Casey Reas, Dan Shiffman


libcurl-multi - how to use the multi interface
DESCRIPTION
This is an overview on how to use the libcurl multi inter-
face in your C programs. There are specific man pages for
each function mentioned in here. There's also the libcurl-
the-guide document for a complete tutorial to programming
with libcurl and the libcurl(3) man page for an overview
of the libcurl easy interface.
All functions in the multi interface are prefixed with
curl_multi.
PLEASE NOTICE
The multi interface is a rather new member of the libcurl
family. It has not yet been very widely used. It may still
be a few more bugs lurking in there than we are used to.
That said, it might also just work in every aspect you try
it. Please report all bugs and oddities you see.
OBJECTIVES
The multi interface introduces several new abilities that
the easy interface refuses to offer. They are mainly:
1. Enable a "pull" interface. The application that uses
libcurl decides where and when to ask libcurl to get/send
data.
2. Enable multiple simultaneous transfers in the same
thread without making it complicated for the application.
3. Enable the application to select() on its own file
descriptors and curl's file descriptors simultaneous eas-
ily.
ONE MULTI HANDLE MANY EASY HANDLES
To use the multi interface, you must first create a 'multi
handle' with curl_multi_init. This handle is then used as
input to all further curl_multi_* functions.
Each single transfer is built up with an easy handle. You
must create them, and setup the appropriate options for
each easy handle, as outlined in the libcurl(3) man page,
using curl_easy_setopt(3).
When the easy handle is setup for a transfer, then instead
of using curl_easy_perform (as when using the easy inter-
face for transfers), you should instead add the easy han-
dle to the multi handle using curl_easy_add_handl. The
multi handle is sometimes referred to as a 'multi stack'
because of the fact that it may hold a large amount of
easy handles.
removed from the multi stack using curl_multi_remove_han-
dle. Once removed from the multi handle, you can again use
other easy interface functions like curl_easy_perform on
the handle or whatever you think is necessary.
Adding the easy handle to the multi handle does not start
the transfer. Remember that one of the main ideas with
this interface is to let your application drive. You drive
the transfers by invoking curl_multi_perform. libcurl will
then transfer data if there is anything available to
transfer. It'll use the callbacks and everything else you
have setup in the individual easy handles. It'll transfer
data on all current transfers in the multi stack that are
ready to transfer anything. It may be all, it may be none.
Your application can acquire knowledge from libcurl when
it would like to get invoked to transfer data, so that you
don't have to busy-loop and call that curl_multi_perform
like crazy. curl_multi_fdset offers an interface using
which you can extract fd_sets from libcurl to use in
select() or poll() calls in order to get to know when the
transfers in the multi stack might need attention. This
also makes it very easy for your program to wait for input
on your own private file descriptors at the same time or
perhaps timeout every now and then, should you want that.
A little note here about the return codes from the multi
functions, and especially the curl_multi_perform: if you
receive CURLM_CALL_MULTI_PERFORM, this basicly means that
you should call curlm_call_multi_perform again, before you
select() on more actions. You don't have to do it immedi-
ately, but the return code means that libcurl may have
more data available to return or that there may be more
data to send off before it is "satisfied".
curl_multi_perform stores the number of still running
transfers in one of its input arguments, and by reading
that you can figure out when all the transfers in the
multi handles are done. 'done' does not mean successful.
One or more of the transfers may have failed. Tracking
when this number changes, you know when one or more trans-
fers are done.
To get information about completed transfers, to figure
out success or not and similar, curl_multi_info_read
should be called. It can return a message about a current
or previous transfer. Repeated invokes of the function get
more messages until the message queue is empty. The infor-
mation you receive there includes an easy handle pointer
which you may use to identify which easy handle the infor-
mation regards.
please note that you MUST invoke separate
curl_easy_cleanup calls on every single easy handle to
clean them up properly.
If you want to re-use an easy handle that was added to the
multi handle for transfer, you must first remove it from
the multi stack and then re-add it again (possbily after
having altered some options at your own choice).
Man(1) output converted with
man2html


AJAX utility functions for Django that can be accessed via a single URL (ala WordPress admin-ajax.php)
Bambu AJAX lets you write utility functions for your Django apps that can be called via AJAX, without having to specify a separate URL pattern and view for each one.
This is part of a toolset called Bambu Tools. It’s being moved from a namespace of bambu to its own ‘root-level’ package, along with all the other tools in the set. If you’re upgrading from a version prior to 2.0, please make sure to update your code to use bambu_ajax rather than bambu.ajax.
Install the package via Pip:
pip install bambu-ajax
Add it to your INSTALLED_APPS list:
INSTALLED_APPS = (
...
'bambu_ajax'
)
Add bambu_ajax.urls to your URLconf:
urlpatterns = patterns('',
...
url(r'^ajax/', include('bambu_ajax.urls')),
)
Create a file called ajax.php within your Django app, and import the necessary module from the bambu-ajax package, like so:
from bambu_ajax import site
@site.register
def my_ajax_function(request):
return [
'a', 'list', 'of', 'things'
]
Using the site.register decorator registers your AJAX function with the bambu_ajax view.
To leverage this function from within a Django template, use the ajaxurl template tag, like so:
{% load ajax %}
<script>
$.getJSON('{% ajaxurl 'my_project.my_app.my_ajax_function' %}&callback=?',
function(data) {
console.log(data);
}
);
</script>
Here, my_project should refer to the name of your Django project, my_app should be the name of the app you put your ajax.py file in, and my_ajax_function is the name of the function you defined within ajax.py.
The notation is similar to that used when referring to Django models, in that you always skip the common portion ajax from the naming convention.
Make your life easier by including the utility library in your template:
<script src="{% url 'ajax_utility' %}"></script>
<script>
bambu.ajax.get('my_project.my_app.my_ajax_function',
function(data) {
console.log(data);
}
);
</script>
This achieves the same result, but in a much cleaner way.
As well as returning JSON-serialisable data per the examples above, you can also use AJAX functions just like views, in that they can return an HttpResponse object.
Using that method, the example above would print out the HTML (or other data) returned in the HTTP response.
You can of course add other decorators, just as you would with normal views.
Find me on Twitter (@iamsteadman) or visit my blog.


|
xpcc
|
Public Types | |
| enum | Direction { In, Out, InOut, Special } |
| Declares the direction of a GPIO. | |
Static Public Attributes | |
| static constexpr bool | Low |
| These constants refer to the logical state of the GPIO. More... | |
| static constexpr bool | High |
| These constants refer to the logical state of the GPIO. More... | |
|
static |
The physical state is determined by the configuration and external connection.
|
static |
The physical state is determined by the configuration and external connection.


This gateway is used for the Kannel HTTP interface.
This interface requires the following settings in SMSServer's configuration file:
| Option | Description |
| url | URL used to send SMS through Kannel. |
| username | Kannel send-sms Username. |
| password | Kannel send-sms Password. |
| outbound | yes if the gateway should be used as an outbound gateway, otherwise no. |
The following settings are optional:
| Option | Description |
| adminurl | URL used to send SMS through Kannel. |
| adminpassword | Kannel's send-sms Username. |
| statuspassword | Kannel's send-sms Password. |
| autostartsmsc | yes if a start-smsc command should be sent to Kannel when the gateway starts, otherwise no. |
| autostopsmsc | yes if a stop-smsc command should be sent to Kannel when the gateway stops, otherwise no. |
Example:
gateway.0=myKannel, KannelHttp
myKannel.url=http://localhost:13013/cgi-bin/sendsms
myKannel.username=simple
myKannel.password=elpmis
myKannel.outbound=yes
myKannel.adminurl=http://localhost:13000
myKannel.adminpassword=bar
myKannel.statuspassword=pass
myKannel.autostartsmsc=no
myKannel.autostopsmsc=no


Welcome! I'm Medical Chatbot, but you can call me Meddy.
What symptoms are you currently experiencing? When you've
entered all of your symptoms, please write 'Done'.
Make sure you enter as much symptoms as possible so the prediction can be as correct as possible.


ML planning and simulation for self-driving¶
This repostitory and the associated datasets contains a framework for developing learning-based ML planning and simulation systems for self-driving. State-of-the-art solutions to these problems still require significant amount of hand-engineering and unlike, i.e. perception, didn’t benefit much from deep learning and the vast amount of available data.
The purpose of this framework is to make it easier for engineers and researchers to experiment with new approaches to data-driven self-driving planning and simulation in realistic scenarios and this way improve on existing state-of-the-art.
This software is developed by Lyft Level 5 self-driving division but is open to contributors from outside.
Examples¶
Things you can build using this framework:
Turn planning and simulation problems into data problems and train them on real data.
Use neural networks to model key components of autonomous vehicles (AV) stack.
Predict future movement of cars around AV derived from historical observations.
Plan decisions of AV to immitate human driving.
Test performance of AV offline using reactive simulation learned from data.
Study the improvement in performance as the amount of data increases.
News¶
Overview¶
The content of the framework consists of three parts:
Datasets - data available for training ML models.
L5Kit - the core library supporting functionality for reading the data and framing planning and simulation problems as ML problems.
Examples - ever-expanding jupyter notebooks demonstrating use of L5Kit for different tasks in AV.
1. Datasets¶
To use the framework you will need to download the Lyft Level 5 Prediction dataset from https://level5.lyft.com/. It consists of the following components:
1000h of logged perception output around Lyft AVs operating in Palo Alto in 30sec chunks using zarr format.
Hand-annotated HD semantic map capturing positions of lanes, crosswalks etc stored as protobuf.
High-definition aerial picture of the Palo Alto area stored with resolution 8cm per pixel (provided by NearMap).
To read more about the dataset and how it was generated read the dataset whitepaper.
2. L5Kit¶
A library with the following functionality:
Loading drivig scenes from zarr files
Reading semantic maps
Reading aerial pictures
Creating birds-eye-view (BEV) representations around AV and other vehicles
Sampling data
Training neural networks
Visualising results
3. Examples¶
The examples
folder contains examples in jupyter notebook format you can use as a foundation for building your ML planning and simulation solutions. Currently we are providing two examples, with more following soon:
Dataset visualisation¶
Show how to use L5Kit toolkit to load and visualise samples from a dataset.
Agent motion prediction¶
An example of training a neural network to predict future positions of nearby cars around self-driving car. This example is a baseline solution for the Lyft 2020 Kaggle motion prediction challenge.
Installation¶
1. Clone the repo¶
git clone https://github.com/lyft/l5kit.git ./
2. Download the datasets¶
Register at https://level5.lyft.com/dataset/ and download the 2020 Lyft prediction dataset and store all files in one folder. The resulting directory structure should be:
prediction-dataset/
+- sample_scenes/
+- scenes/
+- aerial_map/
+- semantic_map/
3. Install L5Kit¶
cd l5kit
pip install -r requirements.txt
4. Generate L5Kit code html documentation (optional)¶
sphinx-apidoc --module-first --separate -o API/ l5kit/l5kit l5kit/l5kit/tests*
sphinx-build . html
5. Run example¶
jupyter notebook examples/visualisation/visualise_data.ipynb
Credits¶
The framework was developed at Lyft Level 5 and is maintained by the following authors and contributors:


Class SpeechStubSettings.Builder (2.0.0)
public static class SpeechStubSettings.Builder extends StubSettings.Builder<SpeechStubSettings,SpeechStubSettings.Builder>
Builder for SpeechStubSettings.
Inherited Members
com.google.api.gax.rpc.StubSettings.Builder.getBackgroundExecutorProvider()
com.google.api.gax.rpc.StubSettings.Builder.setBackgroundExecutorProvider(com.google.api.gax.core.ExecutorProvider)
Constructors
Builder()
Builder(ClientContext clientContext)
protected Builder(ClientContext clientContext)
Parameter
Builder(SpeechStubSettings settings)
protected Builder(SpeechStubSettings settings)
Parameter
Methods
applyToAllUnaryMethods(ApiFunction<UnaryCallSettings.Builder<?,?>,Void> settingsUpdater)
public SpeechStubSettings.Builder applyToAllUnaryMethods(ApiFunction<UnaryCallSettings.Builder<?,?>,Void> settingsUpdater)
Applies the given settings updater function to all of the unary API methods in this service.
Note: This method does not support applying settings to streaming methods.
Parameter
| Name |
Description |
| settingsUpdater |
com.google.api.core.ApiFunction<Builder<?,?>,java.lang.Void>
|
Returns
build()
public SpeechStubSettings build()
Returns
Overrides
Exceptions
longRunningRecognizeOperationSettings()
public OperationCallSettings.Builder<LongRunningRecognizeRequest,LongRunningRecognizeResponse,LongRunningRecognizeMetadata> longRunningRecognizeOperationSettings()
Returns the builder for the settings used for calls to longRunningRecognize.
Returns
longRunningRecognizeSettings()
public UnaryCallSettings.Builder<LongRunningRecognizeRequest,Operation> longRunningRecognizeSettings()
Returns the builder for the settings used for calls to longRunningRecognize.
Returns
recognizeSettings()
public UnaryCallSettings.Builder<RecognizeRequest,RecognizeResponse> recognizeSettings()
Returns the builder for the settings used for calls to recognize.
Returns
streamingRecognizeSettings()
public StreamingCallSettings.Builder<StreamingRecognizeRequest,StreamingRecognizeResponse> streamingRecognizeSettings()
Returns the builder for the settings used for calls to streamingRecognize.
Returns
unaryMethodSettingsBuilders()
public ImmutableList<UnaryCallSettings.Builder<?,?>> unaryMethodSettingsBuilders()
Returns
| Type |
Description |
| com.google.common.collect.ImmutableList<Builder<?,?>> |
|


Home
Blog
Contact
Meet John Gray
Blog
The Story of Te Houtaewa
Sprint 1 Technical
Identity and Values
Sprint 1 Cultural
CSS Positioning
Sprint 2 Technical
My Learning Journey
Sprint 2 Cultural
Intro to HTML, CSS, and JS
Sprint 3 Technical
Emotional Intelligence
Sprint 3 Cultural
Problem Solving
Sprint 4 Technical
Neuroplasticity and Growth Mindset
Sprint 4 Cultural
Core Reflections and The Learning Journey
Sprint 5 Cultural
freeCodeCamp
Twitter
GitHub


- my back ground is computer engineering
- 'm graduated from Yarmouk University
- like to take this courses and i hope to improved my self
Goals : learning more and more
List of my top 10 places to visit:
- Saudi Arabia makaa
- United Arab Emirates
- Turkey
- Palestinian
- Morocco
- Ireland
- Guyana
- French
- Egypt
- Bahrain


§232-12 Powers when hearing appeals. The tax appeal court when hearing appeals, shall, in respect to the summoning and examination of witnesses and the production of papers and documents and punishment for contempts and otherwise carrying out its duties and functions, have all the powers and authority of a circuit court. [L 1932 2d, c 40, §48; RL 1935, §1948; RL 1945, §5208; RL 1955, §116-9; am L 1967, c 231, §5; HRS §232-12; am L 1973, c 133, pt of §11]
Rules of Court
See HRCP rule 45.
Case Notes
Cited: 33 H. 149, 160 (1934); 47 H. 41, 45, 384 P.2d 287 (1963).


Does your plant have a stem, stalk, vine, or trunk?
Stem
Stalk
Vine
Trunk
Is it a cactus / succulent?
Yes
No
What is your plant's leaf shape?
Round
Square
Tappered
Ivy
Are the leaves wide or thin?
Wide
Thin
How would you describe the leaf pattern?
Patchy
Solid
Striped
Is the leaf flat or thick and fleshy?
Flat
Flesshy
Does your plant have flowers?
Yes
No
What color are your plant's flowers
Purple
Pink