#assign n0_docs="active"> <#assign n1_features="active"> <#assign history="active">
SQL2011 introduced temporal extensions to SQL
including AS OF SYSTEM TIME
and VERSIONS BETWEEN SYSTEM TIME
.
Ebean has support for this extension to SQL. The support for this falls into 2 general cases where some databases have SQL2011 support built in (Oracle, DB2, MS SQL Server 2016) or where it is not built in (Postgres, MySql) and Ebean generates history tables/triggers/views to support the feature.
Oracle
via Total recallPostgres
via Triggers/history tableMySql
via Triggers/history tableH2
via Triggers/history tableFor Postgres, MySql and H2 (and in general databases that don't have SQL2011 support built in) Ebean generates DDL for History tables and associated triggers and views. This is a common "Temporal database design" approach that has been used for some time and not specific to Ebean. For example, this approach is already implemented as a Postgres extension - arkhipov/temporal_tables.
In general the history table approach results in:
union all
combine the "base table" and the "history table" to simplify history queriesWith @History changes are transactional and have the associated guarantees - changes can't be missed or lost.
With @History the database handles all changes. If other frameworks (not Ebean) or stored procedures or raw JDBC is used to update the database all these changes are captured by the database triggers. Although Ebean makes it easier to query and generate the appropriate DDL the capturing of changes is a database function and not strictly tied to Ebean or application code.
With @History it is easy to query and view the data "As of" a given timestamp and view the versions and historic changes for a given bean/row. This is also possible with Change log but requires more work (loading the change log into say ElasticSearch and creating appropriate queries to return as of and version type data).
A downside to @History relative to using Change log is that it does introduce extra costs to the database in terms of storage (history tables taking storage space) and in terms of impact to response time as updates and deletes now also copy data into the history tables.
The approach with Oracle Total Recall reduces the impact to response time by processing the copy of data from redo into the history tables in the background and in batch and that probably means it can generally be used more widely (on more base tables) than the traditional trigger based approach.
A downside to @History relative to using Change log is that schema changes (like adding a column) can mean more work / complexity as changes need to also be reflected in associated history tables and triggers. The DB migration support in Ebean mitigates this by generating all the appropriate changes to history tables and triggers etc.
Add the @History
annotation to the entity beans that you want history support on. In the
case of Postgres and MySql this means that Ebean will generate DDL (triggers, views etc) to support
history on the underlying tables. For Oracle adding @History implies that the table has had flashback
archive already assigned to the table.
Add the @HistoryExclude
annotation on entity bean properties that should be excluded from
history. This is expected to be used on large text or blob columns where there can be a relatively high
storage cost associated with keeping the history values and excluding these columns is desired.
In the case of intersection (bridge) tables for ManyToMany relationships by default the intersection
tables also have history. That is, if @History
is put on an entity bean then by default
the intersection tables for @ManyToMany
properties have history support (associated history
tables, views and triggers).
To exclude history from intersection tables @HistoryExclude
should be put on the @ManyToMany
property.
A Timestamp can be used with Query.asOf(Timestamp)
and Ebean will generate the query
such that the returning object graph represents the state as of the given timestamp. More accurately
for tables with history the query returns rows representing the table as of the given timestamp and for
other tables included in the query the rows returned represent 'current values'.
// asOf some time in the past like 1 hour ago, 1 week ago, 1 month ago etc Timestamp asOf = ...; Customer customer = Customer.find.query() .asOf(asOf) .fetch("billingAddress") .where().eq("name", "jim") .findOne();
In the above query if both Customer Address have history then both the customer data and address data will be returned 'As of' the given timestamp.
In the above query if Customer has history but Address does not then the customer data will be returned 'As of' the given timestamp but the address data will be returned using 'current data'.
The AS OF
timestamp is propagated to all secondary queries including lazy loading queries.
That is, the AS OF
timestamp applies to the entire object graph loaded by and not just the
"origin query". If Address is lazy loaded and Address has history the address data will also be 'as of'
the original timestamp.
Query.findVersionsBetween()
is used to return a list of versions for a given object
over time. The version beans returned contain a "diff" to the prior version as well as the
effective start and effective end timestamps.
Timestamp start = ...; Timestamp end = ...; List<|Version<|Customer>> customerVersions = Customer.find.query() .where() .idEq(42) .findVersionsBetween(start, end); for (Version<|Customer> customerVersion : customerVersions) { Customer bean = customerVersion.getBean(); Map<|String, ValuePair> diff = customerVersion.getDiff(); Timestamp effectiveStart = customerVersion.getStart(); Timestamp effectiveEnd = customerVersion.getEnd(); }
It is generally expected that the entity beans should contain @WhoCreated
, @WhoModified
,
@WhenCreated
and @WhenModified
properties.
/** * Common properties used by many entity beans. */ @MappedSuperclass public class BaseModel { @Id Long id; @Version Long version; @WhenCreated Timestamp whenCreated; @WhenModified Timestamp whenModified; @WhoCreated String whoCreated; @WhoModified String whoModified; ...
@History @Entity @Table(name="customer") public class Customer extends BaseModel { @Size(max = 100) String name; ...
Postgres has an existing arkhipov/temporal_tables extension and Postgres/Ebean users could use this extension. By default Ebean does not use this extension but instead generates similar triggers. The difference between using arkhipov/temporal_tables or not comes down to DDL generation. Ultimately it would be good for Ebean to support DDL generation for arkhipov/temporal_tables but that isn't built into Ebean yet.
The other notable aspect of history support in Postgres is that we can make use of the timestamp range type with expected benefits in terms on indexing performance relative to using 2 separate timestamp columns.
There is a concern with MySql in the case where DDL changes need to be applied to a production database. In the case where Triggers need to change due to a schema change (like add column) MySql has no 'create or replace trigger' and instead a table lock needs to be held to drop and create the trigger. Holding a table lock in a production database might be a problem and restrict schema changes.
Rob's View: Oracle Total recall has some nice advantages over the explicit trigger/history table approach. The main advantages being:


Toggle navigation
Dashboard
Add a New Plant...
Settings
Logout
Electricity
LiveWire ©
In the past 24 hours
Highest usage: 40%
Lowest usage: 40%
Average usage: 40%
Humidity
Light Intensity


Chemistry
Maxwell Scientific sets the standard for chemistry supplies. Choose from one of our 40 chemistry kits, developed especially for Maxwell Scientific by the Chemistry department at Princeton University. All kits have been safety-tested. Chemicals are enlosed in protected bottles, using Maxwell Scientific's patented spillproof system.
Featured Chemistry Products
Laboratory Magnetic Stirrer:
Electronic speed-controlled stirrer stirs up to 2 liters of water at 60 - 2,500 RPM. Designed for hours of continuous use with little speed deviation or heat build-up.
Price $144.95.
Stock Number: LMS01-101
Laboratory Hot Plate:
Heat beakers up to 700 degrees F in 25 minutes within an accuracy of 30 degrees F. The hot plate is made of cast aluminum for even heat distribution. Adjustable thermostatic control.
Price $119.95.
Stock Number: LHP1-700
Periodic Table Pack:
A pack of 40 periodic table cards (4" x 6") printed in full color on laminated cardboard stock.
Price: $49.95.
Stock Number: PT40-232
Test Tube Rack:
Solid wood construction, polished to minimize surface damage from spills. Holds 10 test tubes (not included).
Price :$9.95.
Stock Number: TT10-001
2000 Chemistry Set:
Developed by Princeton University, this kit includes instruction booklet for 2000 chemistry experiments. All chemicals are safe to use and include spillproof bottles and experiment dishes.
Price $199.95.
Stock Number: CH2000-100
Lab Kit Refill:
Refill kit for the Chemistry 2000 set.
Price $39.95.
Stock Number: SM4-411
Enzyme Kit:
Examine the basic function and structure of biological enzymes and enzyme reactions. Includes book of suggested experiments.
Price $119.95.
Stock Number: EZ01-941
Water Test Kit:
Perform four interesting water pollution experiments with this water testing kit.
Price $59.95.
Stock Number: WK24-811


AP Top Business News at 2:30 a.m. EST
by EndPlayPaging Dr. Robot: Artificial intelligence moves into care
China sets tougher guidelines to protect patents, copyrights
Bloomberg entry into presidential race raises ethics issues
Above-ground power lines grow in risk as climate changes
Novartis to buy The Medicines Company for $9.7 billion
Web inventor has an ambitious plan to take back the net
Jackpot! Lottery tickets on sale for 1st time in Mississippi
Harry Morton, son of Hard Rock Cafe co-founder, dies at 38
Asian shares advance amid hopes for US-China trade deal
For some rural US TV viewers, local news is anything but


In order to run this test, replace the ./data
directory with
the contents of the test_data.tar.gz
file, then
start Elasticsearch:
cd elasticsearch rm -Rf data tar -xzf plugins/migration/_site/test_data.tar.gz ./bin/elasticsearch


Login
Register
b-thinker is a very simple to-do list.
Write any task anywhere and anytime with this application. An android version is available on Google Play.


--- layout: apidoc title: Tile5 API Documentation ---
extends: T5.Marker
An image annotation is simply a T5.Annotation that has been extended to
display an image rather than a simple circle. Probably the most common type
of annotation used. Supports using either the image
or imageUrl
parameters
to use preloaded or an imageurl for displaying the annotation.
new T5.ImageMarker(params);
image
(HTMLImage, default = null) - one of either this or the imageUrl
parameter
is required and the specified image is used to display the annotation.imageUrl
(String, default = null) - one of either this of the image
parameter is
required. If specified, the image is obtained using T5.Images module and then drawn
to the canvas.animatingImage
(HTMLImage, default = null) - an optional image that can be supplied,
and if so, the specified image will be used when the annotation is animating rather than
the standard image
. If no animatingImage
(or animatingImageUrl
) is specified then
the standard image is used as a fallback when the marker is animating.animatingImageUrl
(String, default = null) - as per the animatingImage
but a url
for an image that will be loaded via T5.ImagesimageAnchor
(T5.Vector, default = null) - a T5.Vector that optionally specifies the
anchor position for an annotation. Consider that your annotation is "pin-like" then you
would want to provide an anchor vector that specified the pixel position in the image
around the center and base of the image. If not imageAnchor
parameter is provided, then
the center of the image is assumed for the anchor position.rotation
(float, default = 0) - the value of the rotation for the image marker
(in radians). Be aware that applying rotation to a marker does add an extra processing
overhead as the canvas context needs to be saved and restored as part of the operation.scale
(float, default = 1)opacity
(float, default = 1)An overriden implementation of the T5.Annotation.drawMarker which draws an image to the canvas.


Office Workers Swear Approximately 55 Times A Week, Study Finds
by Julia BanimAs much as I enjoy my job at UNILAD Towers, I’m admittedly more than a little guilty of muttering the occasional blue word under my breath.
As with any office-based job, frustrations will ultimately froth over like a temperamental work coffee machine. Laptop plugs disappear. Chairs lose their back support. And the internet decides Monday morning is the best time to have a funny turn.
Such moments require a mini explosion of expletives, even though cursing will, of course, do nothing to get Photoshop to behave. And I’m glad to know I’m not alone.
New research from 4com indicates the average British worker hears an average of 11 swear words from their colleagues every single working day.
Indeed, more than one in 10 employees (11%) have confessed to hearing more than 25 swear words at work each day. And without pointing any fingers at my own dear colleagues, this honestly doesn’t surprise me too much.
Reflecting on the frequency of their own bad language, one quarter (25%) of UK workers confessed to rarely reining in their tongue, with one in eight (12%) stating they never hide their coarse language in the workplace.
However, there are some gallant workers among us who strive to keep things PG. One in five (19%) said they tried never to swear in the presence of their co-workers, a feat surely deserving of some sort of award.
Psychotherapist and founder of The Luna Hive Dr Jo Gee told 4com:
Studies suggest swearing can be beneficial, as the process of swearing is often cathartic, letting out pent-up emotion, as well as aiding storytelling or jokes. Perceptions of those who swear are also more likely to be linked to the words ‘honest’ and ‘credible’.
As to why people use them at work, alongside the above reasons, for some, offensive language might be a ‘test’ for the work setting – with employees experiencing a thrill when swearing or using swear words to draw attention to themselves in a busy workplace.
That said, swear words often include a range of taboo words including sexual language, profanities, animal names, and vulgar terms, so this is part of why people find them offensive.
Additionally, they are linked to negative emotions and our minds associate them with anger, even if they’re not used aggressively.
Interestingly, the most frequently-cursing culprits were found to work in middle management, with more than one quarter (28%) of British workers admitting their supervisors and line managers regularly exercised their potty mouths. Second-place offenders were entry-level and admin staff, who both had 18% of votes.
At the other end of the scale, catering staff were viewed to be the most polite, with just 1% of colleagues stating they regularly used foul language.
Perhaps unsurprisingly, interns and those on work experience were also found to be keen to exhibit their very best behaviour, with just 3% using swear words while at work.
Jules studied English Literature with Creative Writing at Lancaster University before earning her masters in International Relations at Leiden University in The Netherlands (Hoi!). She then trained as a journalist through News Associates in Manchester. Jules has previously worked as a mental health blogger, copywriter and freelancer for various publications.


{% extends "layout.html" %} {% block content %}
Here product description will appear
Overview of the product
Shipping and return details of the product
A durable and trendy handmade bag, only for Rs. 300!
Check out our fresh homemade spices!
Exclusive deals on home decor!


Tang Yiliu
November 25, 2017
Bus stops at Champaign-Urbana feel slightly different.In fact, I am not really sure about the part of speech of "stops" ...
← Back


APIC
APP
Genian
Status
Setting
Logging
GENIAN INFO
Target EPG List
Save
APIC
Username
Password
Genian NAC
IP or Hostname
Passkey
asdf
asdf


---
title: "13+ Log Splitter Auckland
Background"
description: "I could not believe how much wood i could split compared to swinging my."
date: "2020-04-08"
categories:
- "Logo"
images:
- "https://cms.marsdenengineering.co.nz/uploads/Products/Tree-Rex/treerex_slider1.jpg"
featuredImage: "https://cdn.shopify.com/s/files/1/0294/2029/0107/products/DSC00516-min_SAO7A8D4JNBA_1024x1024.jpg?v=1603351257"
featured_image: "https://cdn.stamped.io/uploads/photos/124729_4505499107387_b16a3311_68c6_4829_aea2_b0969b40cee9.jpg?tr=h-800"
image: "https://res2.grays.com/handlers/imagehandler.ashx?t=sh&id=15988977&s=d&index=0&ts=636330371190000000"
---
13+ Log Splitter Auckland
Background. Read unbiased log splitter reviews from customers who are now splitting their own firewood. Buy log splitters at screwfix.com.
After i spent the day splitting firewood with the rented log splitter i was amazed. Shop our collection of electric and gas log splitters. Most will split logs into.
All at the very our log splitters are powered in various ways and come in all sizes so we are sure you will find a.
Split logs up to 20.5 in. Find out everything you need to know by reading this comprehensive log splitting guide that. Brave dual split comparison vs gripo kinetic splitter. Read unbiased log splitter reviews from customers who are now splitting their own firewood.


abstract suspend fun getAddress(accountId: Int = 0): String
Gets the address for the given account.
accountId
- the optional accountId whose address is of interest. By default, the first
account is used.
Return
the address for the given account.


WITNESS LIST Natural Resources Committee May 11, 2001 - 2:00P HB 779 ON: Mitchell, Jamie (Surfrider Foundation), Austin, TX Registering, but not testifying: On: Dean, Barbara (Self) Grimes, Bill (Self) HB 1128 Registering, but not testifying: For: Joiner, Gary Associate Legislative Director (Texas Farm Bureau), Austin, TX On: Hubert, Martin Deputy Commissioner (TX Dept of Agriculture), Austin, TX HB 1317 FOR: Stevens, Bill Executive Vice President (Texas Alliance of Energy Producers), Abilene, TX ON: Lineberry, Colin A.D. O&G Section, Office of Gen'l Counse (Railroad Commission of Texas), Austin, TX Registering, but not testifying: For: Knorpp, Kerry Regional Vice President (Texas Land & Mineral Association), Amarillo, TX HB 2134 ON: Martin, Ed IM Consultant (TSIA Texas State Inspection Association), Dallas, TX Registering, but not testifying: For: Miksa, Mary VP Govt Affairs (Texas Assoc. of Business & Chambers of Commerce), Austin, TX Smith, Tom Director (Public Citizen), Austin, TX White, Michael Attorney/Consultant (Greater Houston Partnership), Austin, TX On: Barbour, Hazel Manager, Mobile Source Section (TNRCC), Austin, TX Stout, Pat Bimmer & Bone (TSIA) HB 2271 Registering, but not testifying: On: Burnett, Dale Director, Waste Permits Division (TNRCC), Austin, TX HB 2806 FOR: Briesemeister, Janee Senior Policy Analyst (Consumers Union), Austin, TX HB 3243 FOR: Robinson, Eric Member (Drafting Committee), Bracketville, TX Senne, Herb County Judge (Kinney County), Bracketville, TX Registering, but not testifying: For: Herndon, Tootsie Mayor Pro Tem (City of Spotford), Bracketville, TX Holley, Mike Director (Fort Clark Springs MUD), Bracketville, TX Hood, Don Concerned Rancher (Kinney Co. Water District), Bracketville, TX McKelvy, Clarence President of the Board (Fort Clark Spring MUD), Bracketville, TX Melancon, Charles Commissioner Pct.4 (Kinney County), Bracketville, TX Ralston, Donald Director (Fort Clark Springs M.U.D), Bracketville, TX Shahan, Linda Owner (Kinnet County), Bracketville, TX Shahan, Tully Kinney County (County Attorney/Landowner), Bracketville, TX Wylie, Francie Commissioner Pct. 1 (Kinney County), Bracketville, TX York, Mary Secretary (Ft. Clark Bible Study Group), Bracketville, TX York, Jr., Joe Representative of Kinney County (Water Concerned Group), Bracketville, TX Young, Robert Vice-Chair (Fort Clark M.U.D), Bracketville, TX HB 3348 Registering, but not testifying: On: Stevens, Bill Executive Vice- President (TX Alliance of Energy of Energy Producers), Abilene, TX HB 3676 Registering, but not testifying: On: Musick, Steve Leader, Groundwater Planning and Assesme (TNRCC), Austin, TX SCR 54 Registering, but not testifying: For: Chambers, Spencer Gov. Affairs Manager (TX Assoc. of Business & Chambers of Commerce), Austin, TX Turner, Jill Associate Legislative Director (Texas Farm Bureau), Austin, TX On: Hubert, Martin Deputy Commissioner (TX Dept.of Agriculture), Austin, TX


|
SuperLU 6.0.0
|
Memory details. More...
#include "slu_ddefs.h"
Macros | |
| #define | StackFull(x) ( x + Glu->stack.used >= Glu->stack.size ) |
| #define | NotDoubleAlign(addr) ( (intptr_t)addr & 7 ) |
| #define | DoubleAlign(addr) ( ((intptr_t)addr + 7) & ~7L ) |
| #define | TempSpace(m, w) |
| #define | Reduce(alpha) ((alpha + 1) / 2) /* i.e. (alpha-1)/2 + 1 */ |
Functions | |
| void * | dexpand (int_t *prev_len, MemType type, int_t len_to_copy, int keep_prev, GlobalLU_t *Glu) |
| Expand the existing storage to accommodate more fill-ins. More... | |
| int | dLUWorkInit (int m, int n, int panel_size, int **iworkptr, double **dworkptr, GlobalLU_t *Glu) |
| Allocate known working storage. More... | |
| void | copy_mem_double (int_t, void *, void *) |
| void | dStackCompress (GlobalLU_t *Glu) |
| Compress the work[] array to remove fragmentation. More... | |
| void | dSetupSpace (void *work, int_t lwork, GlobalLU_t *Glu) |
| Setup the memory model to be used for factorization. More... | |
| void * | duser_malloc (int, int, GlobalLU_t *) |
| void | duser_free (int, int, GlobalLU_t *) |
| void | copy_mem_int (int, void *, void *) |
| void | user_bcopy (char *, char *, int) |
| int | dQuerySpace (SuperMatrix *L, SuperMatrix *U, mem_usage_t *mem_usage) |
| int | ilu_dQuerySpace (SuperMatrix *L, SuperMatrix *U, mem_usage_t *mem_usage) |
| int_t | dLUMemInit (fact_t fact, void *work, int_t lwork, int m, int n, int_t annz, int panel_size, double fill_ratio, SuperMatrix *L, SuperMatrix *U, GlobalLU_t *Glu, int **iwork, double **dwork) |
| Allocate storage for the data structures common to all factor routines. More... | |
| void | dSetRWork (int m, int panel_size, double *dworkptr, double **dense, double **tempv) |
| Set up pointers for real working arrays. More... | |
| void | dLUWorkFree (int *iwork, double *dwork, GlobalLU_t *Glu) |
| Free the working storage used by factor routines. More... | |
| int_t | dLUMemXpand (int jcol, int_t next, MemType mem_type, int_t *maxlen, GlobalLU_t *Glu) |
| Expand the data structures for L and U during the factorization. More... | |
| void | dallocateA (int n, int_t nnz, double **a, int_t **asub, int_t **xa) |
| Allocate storage for original matrix A. More... | |
| double * | doubleMalloc (size_t n) |
| double * | doubleCalloc (size_t n) |
| int_t | dmemory_usage (const int_t nzlmax, const int_t nzumax, const int_t nzlumax, const int n) |
Copyright (c) 2003, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from U.S. Dept. of Energy)
All rights reserved.
The source code is distributed under BSD license, see the file License.txt at the top-level directory.
-- SuperLU routine (version 4.0) -- Lawrence Berkeley National Laboratory. June 30, 2009
| #define DoubleAlign | ( | addr | ) | ( ((intptr_t)addr + 7) & ~7L ) |
| #define NotDoubleAlign | ( | addr | ) | ( (intptr_t)addr & 7 ) |
| #define Reduce | ( | alpha | ) | ((alpha + 1) / 2) /* i.e. (alpha-1)/2 + 1 */ |
| #define StackFull | ( | x | ) | ( x + Glu->stack.used >= Glu->stack.size ) |
| #define TempSpace | ( | m, | |
| w | |||
| ) |
| void copy_mem_double | ( | int_t | howmany, |
| void * | old, | ||
| void * | new | ||
| ) |
| void copy_mem_int | ( | int | , |
| void * | , | ||
| void * | |||
| ) |
| void * dexpand | ( | int_t * | prev_len, |
| MemType | type, | ||
| int_t | len_to_copy, | ||
| int | keep_prev, | ||
| GlobalLU_t * | Glu | ||
| ) |
| int_t dLUMemInit | ( | fact_t | fact, |
| void * | work, | ||
| int_t | lwork, | ||
| int | m, | ||
| int | n, | ||
| int_t | annz, | ||
| int | panel_size, | ||
| double | fill_ratio, | ||
| SuperMatrix * | L, | ||
| SuperMatrix * | U, | ||
| GlobalLU_t * | Glu, | ||
| int ** | iwork, | ||
| double ** | dwork | ||
| ) |
Memory-related.
For those unpredictable size, estimate as fill_ratio * nnz(A). Return value: If lwork = -1, return the estimated amount of space required, plus n; otherwise, return the amount of space actually allocated when memory allocation failure occurred.
| int_t dLUMemXpand | ( | int | jcol, |
| int_t | next, | ||
| MemType | mem_type, | ||
| int_t * | maxlen, | ||
| GlobalLU_t * | Glu | ||
| ) |
Return value: 0 - successful return > 0 - number of bytes allocated when run out of space
| void dLUWorkFree | ( | int * | iwork, |
| double * | dwork, | ||
| GlobalLU_t * | Glu | ||
| ) |
| int dLUWorkInit | ( | int | m, |
| int | n, | ||
| int | panel_size, | ||
| int ** | iworkptr, | ||
| double ** | dworkptr, | ||
| GlobalLU_t * | Glu | ||
| ) |
Returns 0 if success, otherwise returns the number of bytes allocated so far when failure occurred.
| double * doubleCalloc | ( | size_t | n | ) |
| double * doubleMalloc | ( | size_t | n | ) |
| int dQuerySpace | ( | SuperMatrix * | L, |
| SuperMatrix * | U, | ||
| mem_usage_t * | mem_usage | ||
| ) |
Calculate memory usage
| mem_usage | consists of the following fields:
|
| void dSetRWork | ( | int | m, |
| int | panel_size, | ||
| double * | dworkptr, | ||
| double ** | dense, | ||
| double ** | tempv | ||
| ) |
| void dSetupSpace | ( | void * | work, |
| int_t | lwork, | ||
| GlobalLU_t * | Glu | ||
| ) |
lwork = 0: use system malloc; lwork > 0: use user-supplied work[] space.
| void dStackCompress | ( | GlobalLU_t * | Glu | ) |
| void duser_free | ( | int | bytes, |
| int | which_end, | ||
| GlobalLU_t * | Glu | ||
| ) |
| void * duser_malloc | ( | int | bytes, |
| int | which_end, | ||
| GlobalLU_t * | Glu | ||
| ) |
| int ilu_dQuerySpace | ( | SuperMatrix * | L, |
| SuperMatrix * | U, | ||
| mem_usage_t * | mem_usage | ||
| ) |
Calculate memory usage
| mem_usage | consists of the following fields:
|
| void user_bcopy | ( | char * | src, |
| char * | dest, | ||
| int | bytes | ||
| ) |


Cellular automata generator
Interesting cave systems can be created using ROT.Map.Cellular
, a generator which simulates a cellular automaton. Using this generator is a bit more complex,
because it offers richer features and is more configurable.
Apart from the traditional width and height arguments, ROT.Map.Cellular
accepts also a configuration object with the following optional keys:
born
– array of neighbor counts; when an empty cell has this number of neighbors, a new cell is born
survive
– array of neighbor counts; when an existing cell has this number of neighbors, it will survive into next iteration
topology
– how are neighbors defined: a cell can have four, six or eight neighbors. Six neighbors correspond to the "hex" layouting algorithm
of ROT.Display.
It is also possible to initialize/set values for the first generation of cells. Two methods are provided:
set(x, y, value)
to directly set a cell
randomize(probability)
set all cells to "alive" with a given probability (0 = no cells, 1 = all cells)
It is possible (and desirable) to call the create
method repeatedly: every call will create a new generation. There is no need to specify a callback,
if you only want to advance into next generation, without actually retrieving the current map data. By default, the born and survive options
are set according to this Roguebasin article.
ROT.Map.Cellular
uses the following callback values:
var w = 80, h = 40;
var map = new ROT.Map.Cellular(w, h);
/* cells with 1/2 probability */
map.randomize(0.5);
/* generate and show four generations */
for (var i=0; i<4; i++) {
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.create(display.DEBUG);
}
var w = 100, h = 60;
var display = new ROT.Display({width:w, height:h, fontSize:6});
SHOW(display.getContainer());
/* custom born/survive rules */
var map = new ROT.Map.Cellular(w, h, {
born: [4, 5, 6, 7, 8],
survive: [2, 3, 4, 5]
});
map.randomize(0.9);
/* generate fifty iterations, show the last one */
for (var i=49; i>=0; i--) {
map.create(i ? null : display.DEBUG);
}
Once the map has been created, you can optionally call connect() to connect every free space. This way the player can traverse every part of the maze. You might have to refresh this page a few times to spot the differences.
var w = 80, h = 40;
/* create a connected map where the player can reach all non-wall sections */
var map = new ROT.Map.Cellular(w, h, { connected: true });
/* cells with 1/2 probability */
map.randomize(0.5);
/* make a few generations */
for (var i=0; i<4; i++) map.create();
/* display only the final map */
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.create(display.DEBUG);
/* now connect the maze */
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.connect(display.DEBUG);
You can also connect walls instead of empty space by specifying the map value that should be connected. See the second parameter of the connect() call below:
var w = 80, h = 40;
/* create a connected map where the player can reach all non-wall sections */
var map = new ROT.Map.Cellular(w, h, { connected: true });
/* cells with 1/2 probability */
map.randomize(0.5);
/* make a few generations */
for (var i=0; i<4; i++) map.create();
/* display only the final map */
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.create(display.DEBUG);
/* now connect the maze */
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.connect(display.DEBUG, 1);
Finally, you can be optionally notified when connect creates a new connection between formerly separate regions.
var w = 80, h = 40;
/* create a connected map where the player can reach all non-wall sections */
var map = new ROT.Map.Cellular(w, h, { connected: true });
/* cells with 1/2 probability */
map.randomize(0.5);
/* make a few generations */
for (var i=0; i<4; i++) map.create();
/* display only the final map */
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.create(display.DEBUG);
/* now connect the maze */
var display = new ROT.Display({width:w, height:h, fontSize:4});
SHOW(display.getContainer());
map.connect(display.DEBUG, 0, function(from, to) {
SHOW("Connection was made " + from + " to " + to);
});


Solved : {{solved_problems.length}}, Submissions : {{user.submissions.length}}
{{p.number}}
Tried but not yet solved : {{tried_problems.length}}


Last updated: 2020-05-03
Checks: 7 0
Knit directory: 033_purrr_learning/
This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.
Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.
Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.
The command set.seed(20200501)
was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.
Great job! Recording the operating system, R version, and package versions is critical for reproducibility.
Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.
Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.
Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.
The results in this page were generated with repository version 9848eb4. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.
Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish
or wflow_git_commit
). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:
Ignored files:
Ignored: .Rproj.user/
Untracked files:
Untracked: data/gap_copy.rds
Untracked: data/gap_mod.rds
Untracked: data/gapminder_raw.csv
Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.
These are the previous versions of the repository in which changes were made to the R Markdown (analysis/03_the-map-gapminder-example.Rmd
) and HTML (docs/03_the-map-gapminder-example.html
) files. If you’ve configured a remote Git repository (see ?wflow_git_remote
), click on the hyperlinks in the table below to view the files as they were in that past version.
| File | Version | Author | Date | Message |
|---|---|---|---|---|
| Rmd | 9848eb4 | ogorodriguez | 2020-05-03 | Section 4 examples |
| html | 147739b | ogorodriguez | 2020-05-02 | Build site. |
| Rmd | 68350cf | ogorodriguez | 2020-05-02 | Gampminder Examples from simple and complex |
In order to dive deeply into the functionalities of the purrr package, the author used the gapminder dataset that collects macroeconomic information about all countries.
The idea is to start from a simple example into another that is more complex.
The workflow proposed is to load the data online as saving it with meaningful name so it indicates it is the raw data. I will used teh suffix _raw
, as opposed to the one used in the reference website. Then a copy of the data set will be defined so that any modifications or data munging needed will be done to that copy.
That raw data file will be saved into the /data folder
# Download the data directly to the internet
write_csv(read_csv("https://raw.githubusercontent.com/swcarpentry/r-novice-gapminder/gh-pages/_episodes_rmd/data/gapminder-FiveYearData.csv"), here::here("data", "gapminder_raw.csv"))
# Let's create the working copy
gap_copy <- read_csv(here::here("data", "gapminder_raw.csv"))
Now that we have our working copy of the gapminder data set. We can see some description of the file.
gap_copy %>% dim()
#> [1] 1704 6
The file has 1704 rows and 6 columns.
Let’s take a glimpse of the data set
gap_copy %>%
glimpse()
#> Rows: 1,704
#> Columns: 6
#> $ country <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan...
#> $ year <dbl> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 199...
#> $ pop <dbl> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372,...
#> $ continent <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "...
#> $ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 4...
#> $ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.113...
We can see some column types of the likes of character (which I think should be factors, and some numeric)
The skimr package skim()
function will helps us see some more distributions on the character variables.
gap_copy %>%
skimr::skim()
| Name | Piped data |
| Number of rows | 1704 |
| Number of columns | 6 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| numeric | 4 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| country | 0 | 1 | 4 | 24 | 0 | 142 | 0 |
| continent | 0 | 1 | 4 | 8 | 0 | 5 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| year | 0 | 1 | 1979.50 | 17.27 | 1952.00 | 1965.75 | 1979.50 | 1993.25 | 2007.0 | ▇▅▅▅▇ |
| pop | 0 | 1 | 29601212.33 | 106157896.75 | 60011.00 | 2793664.00 | 7023595.50 | 19585221.75 |<PHONE_NUMBER>.0 | ▇▁▁▁▁ |
| lifeExp | 0 | 1 | 59.47 | 12.92 | 23.60 | 48.20 | 60.71 | 70.85 | 82.6 | ▁▆▇▇▇ |
| gdpPercap | 0 | 1 | 7215.33 | 9857.45 | 241.17 | 1202.06 | 3531.85 | 9325.46 | 113523.1 | ▇▁▁▁▁ |
The gapminder data set is widely famous and it is maintained very carefully. There are no NAs. It is a tidy data since every column correspond to a variable and every row correspond to an observation.
gap_copy %>%
head(10)
#> # A tibble: 10 x 6
#> country year pop continent lifeExp gdpPercap
#> <chr> <dbl> <dbl> <chr> <dbl> <dbl>
#> 1 Afghanistan 1952 8425333 Asia 28.8 779.
#> 2 Afghanistan 1957 9240934 Asia 30.3 821.
#> 3 Afghanistan 1962 10267083 Asia 32.0 853.
#> 4 Afghanistan 1967 11537966 Asia 34.0 836.
#> 5 Afghanistan 1972 13079460 Asia 36.1 740.
#> 6 Afghanistan 1977 14880372 Asia 38.4 786.
#> 7 Afghanistan 1982 12881816 Asia 39.9 978.
#> 8 Afghanistan 1987 13867957 Asia 40.8 852.
#> 9 Afghanistan 1992 16317921 Asia 41.7 649.
#> 10 Afghanistan 1997 22227415 Asia 41.8 635.
In this case, when using map()
the functon will iterate over every column.
One simple example will be to extract the types or class or each column in single object (vector or df for example.)
# as a data frame
gap_copy %>%
map_df(~ tibble(class = class(.x)))
#> # A tibble: 6 x 1
#> class
#> <chr>
#> 1 character
#> 2 numeric
#> 3 numeric
#> 4 character
#> 5 numeric
#> 6 numeric
Some columns are type character. The idea is that they are type factor. We can do a conversion using modify()
perhaps.
# Converting only the column types that are character into factors
gap_mod <- modify_if(.x = gap_copy,
.p = function(x) is.character(x),
.f = ~ (as_factor(.)))
gap_mod %>%
glimpse()
#> Rows: 1,704
#> Columns: 6
#> $ country <fct> Afghanistan, Afghanistan, Afghanistan, Afghanistan, Afgha...
#> $ year <dbl> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 199...
#> $ pop <dbl> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372,...
#> $ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asi...
#> $ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 4...
#> $ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.113...
Now let’s extract again its col types.
gap_copy %>%
map_chr(class)
#> country year pop continent lifeExp gdpPercap
#> "character" "numeric" "numeric" "character" "numeric" "numeric"
To get the distinct values, we can pass the map_dbl()
function since it is a count and its result has to be numeric.
gap_mod %>%
map_dbl(n_distinct)
#> country year pop continent lifeExp gdpPercap
#> 142 12 1704 5 1626 1704
These results are vectors. Ideally, it will be visually easier to interpret and even inviting to further manage if the previous information were presented as a data frame. I tried to doing that in the class()
example but was unable to.
This complicates it a bit. It seems that for us to have a data frame as a result of a map()
operation (a data frame with meaningful columns and titles) we will need to pass an anonymous function to apply to each column.
For example the following function calculates the distinct entries and the type of the current column.
gap_mod %>%
map_df(~ tibble(n_distinct = n_distinct(.x),
class = class(.x)))
#> # A tibble: 6 x 2
#> n_distinct class
#> <int> <chr>
#> 1 142 factor
#> 2 12 numeric
#> 3 1704 numeric
#> 4 5 factor
#> 5 1626 numeric
#> 6 1704 numeric
If we want to add the name of each column as another column in the previous data frame. I tried doing that by using the colnames()
or names()
functions but I got an undesired result. To solve this, the.id
argument of map_df()
has to be used. That .id
argument attaches the name of the element being iterated as a column in the output.
gap_mod %>%
map_df(~ tibble(n_distinct = n_distinct(.x),
class = class(.x)),
.id = "variable")
#> # A tibble: 6 x 3
#> variable n_distinct class
#> <chr> <int> <chr>
#> 1 country 142 factor
#> 2 year 12 numeric
#> 3 pop 1704 numeric
#> 4 continent 5 factor
#> 5 lifeExp 1626 numeric
#> 6 gdpPercap 1704 numeric
One helper to understanding how map works is trying to figure out what type of output we want with one part of the data. Then if we are able to obtain the desired result, we can then insert that formula into our map() functiont to make it work over the whole data frame.
For example. I am going to extract the first column of the gapmnder data frame. I am going to name .x for convenience later in copy pasting it into my map_df(). I will be using the gap_copy data set.
.x <- gap_copy %>% pluck(1)
Let’s preview it
.x %>% head()
#> [1] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan"
#> [6] "Afghanistan"
Now, I want to create a data frame that shows only the distinct values in this column together with its class.
tibble(n_distinct = n_distinct(.x),
class = class(.x))
#> # A tibble: 1 x 2
#> n_distinct class
#> <int> <chr>
#> 1 142 character
The result is the desired one. The idea is now to plug the previous formula into a map_df() to iterate over the all of the data frame gap_copy
gap_copy %>%
map_df(~ tibble(n_distinct = n_distinct(.x),
class = class(.x)),
.id = "variable")
#> # A tibble: 6 x 3
#> variable n_distinct class
#> <chr> <int> <chr>
#> 1 country 142 character
#> 2 year 12 numeric
#> 3 pop 1704 numeric
#> 4 continent 5 character
#> 5 lifeExp 1626 numeric
#> 6 gdpPercap 1704 numeric
Now we will save the new datasets in our system.
write_rds(gap_copy, here::here("data", "gap_copy.rds"))
write_rds(gap_mod, here::here("data", "gap_mod.rds"))
sessionInfo()
#> R version 3.6.1 (2019-07-05)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 18362)
#>
#> Matrix products: default
#>
#> locale:
#> [1] LC_COLLATE=Spanish_Spain.1252 LC_CTYPE=Spanish_Spain.1252
#> [3] LC_MONETARY=Spanish_Spain.1252 LC_NUMERIC=C
#> [5] LC_TIME=Spanish_Spain.1252
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] forcats_0.5.0 stringr_1.4.0 dplyr_0.8.5 purrr_0.3.3
#> [5] readr_1.3.1 tidyr_1.0.2 tibble_3.0.0 tidyverse_1.3.0
#> [9] ggplot2_3.3.0
#>
#> loaded via a namespace (and not attached):
#> [1] Rcpp_<IP_ADDRESS> lubridate_1.7.8 here_0.1 lattice_0.20-40
#> [5] assertthat_0.2.1 rprojroot_1.3-2 digest_0.6.25 utf8_1.1.4
#> [9] R6_2.4.1 cellranger_1.1.0 repr_1.1.0 backports_1.1.6
#> [13] reprex_0.3.0 evaluate_0.14 highr_0.8 httr_1.4.1
#> [17] pillar_1.4.3 rlang_0.4.5 curl_4.3 readxl_1.3.1
#> [21] rstudioapi_0.11 whisker_0.4 rmarkdown_2.1 munsell_0.5.0
#> [25] broom_0.5.5 compiler_3.6.1 httpuv_1.5.2 modelr_0.1.6
#> [29] xfun_0.12 base64enc_0.1-3 pkgconfig_2.0.3 htmltools_0.4.0
#> [33] tidyselect_1.0.0 workflowr_1.6.2 fansi_0.4.0 crayon_1.3.4
#> [37] dbplyr_1.4.2 withr_2.1.2 later_1.0.0 grid_3.6.1
#> [41] nlme_3.1-144 jsonlite_1.6.1 gtable_0.3.0 lifecycle_0.2.0
#> [45] DBI_1.1.0 git2r_0.26.1 magrittr_1.5 scales_1.1.0
#> [49] cli_2.0.2 stringi_1.4.6 fs_1.4.1 promises_1.1.0
#> [53] skimr_2.1 xml2_1.3.1 ellipsis_0.3.0 generics_0.0.2
#> [57] vctrs_0.2.4 tools_3.6.1 glue_1.4.0 hms_0.5.3
#> [61] yaml_2.2.1 colorspace_1.4-1 rvest_0.3.5 knitr_1.28
#> [65] haven_2.2.0


font-availability
Don't forget to try in
new private session
!
Start loading
Load event
Using font-availability


# Ansible Ubuntu PPA ## an #ansible-community update ### Presented by Deric Crago (@dericcrago), March 2021
## Current Status ### Launchpad Configuration - a singular `ansible` "user" ### Build Process - Jenkins (internal)
## Current Status ### Versions available on Launchpad - ansible 2.9 - Ubuntu 14.04 (trusty) - Ubuntu 16.04 (xenial) - Ubuntu 18.04 (bionic) - ansible-base 2.10 * - Ubuntu 18.04 (bionic) - Ubuntu 19.10 (eoan) - Ubuntu 20.04 (focal) ###### * starting with `ansible-base` `2.10` `straight.plugin` is required and only readily available for `Ubuntu >= 18.04`
## Future Status / Questions for the Community ### Launchpad Configuration - `ansible` "user" -> `ansible` "team" - eliminates the single username / password ### Build Process - Jenkins (internal) -> GitHub Action (public) - moves the build process out of our internal jenkins instance
## Future Status / Questions for the Community ### What versions of `ansible` do we want to build? #### Today / Soon-ish - ansible 2.9 - ansible 2.10 - ansible 3 #### "Tomorrow"? - latest only - latest - N
## Future Status / Questions for the Community ### What versions of `ubuntu` do we want to build for? #### Today / Soon-ish - ansible >= 2.10 - Ubuntu 20.10 (groovy) - Ubuntu 20.04 (focal) - Ubuntu 18.04 (bionic) - ansible <= 2.9 - Ubuntu 18.04 (bionic) - Ubuntu 16.04 (xenial) - Ubuntu 14.04 (trusty)
## Future Status / Questions for the Community ### What versions of `ubuntu` do we want to build for? #### "Tomorrow"? - ansible >= 2.10 - Ubuntu 21.04 (hirsute) - Ubuntu 20.10 (groovy) - Ubuntu 20.04 (focal) - Ubuntu 18.04 (bionic) - ansible <= 2.9 - Ubuntu 20.04 (focal) - Ubuntu 18.04 (bionic) - Ubuntu 16.04 (xenial) - Ubuntu 14.04 (trusty)
## Future Status / Questions for the Community ### What versions of `ubuntu` do we want to build for? #### Supported (according to Launchpad API) - Ubuntu 20.10 (groovy) = Current Stable Release - Ubuntu 20.04 (focal) = Supported - Ubuntu 18.04 (bionic) = Supported - Ubuntu 16.04 (xenial) = Supported - Ubuntu 14.04 (trusty) = Supported - ~~Ubuntu 12.04 (precise) = Supported~~ #### Other - Ubuntu 21.04 (hirsute) = Active Development
## Feedback from the Community ### Summary - Launchpad Configuration - Build Process - What versions of `ansible` do we want to build? - What versions of `ubuntu` do we want to build for? ### Questions / Comments?
## Interested in helping maintain the Ubuntu PPA? ### Join the [community IRC meeting](https://github.com/ansible/community/issues/539) - Wednesdays @ 19:00 UTC ### Message me directly on IRC - @dericcrago ## Thanks!


Yankees trade Nestor Cortes Jr. to Mariners for international slot money
by Peter BotteThe Yankees made a minor trade Monday, dealing left-handed pitcher Nestor Cortes Jr. to Seattle for international signing bonus pool money.
Cortes appeared in 33 games for the Yankees last season, all but one out of the bullpen. He posted a 5-1 record with a 5.67 ERA and 69 strikeouts over 66 2/3 innings.
Cortes, 24, was designated for assignment, along with first baseman Greg Bird, last Wednesday to create room for several prospects on the team’s 40-man roster, the same day the Yankees released Jacoby Ellsbury.


Projects of {{SubDeptName}} Sub Department
Add
{{project.ProjectName}}
No Projects under this Sub Department!
Opps!! Some Error Occured. Message : {{errorMessage}}
×
{{project.ProjectName}}


--- title: Media layout: component contributors: - name: Summer Shigetani github: seasons109 - name: Nick Soffa github: SoffaKing88 ---
"An audio or video media player"
Simple three button interface towards the bottom of the screen, previous file, Play/Pause, and next file. Top of the screen includes the file name, and any other details about the file if available. The middle of the screen will show the video itself or the album art in case of audio files. Other buttons include volume control through buttons or a slider, options to shuffle your list of songs or repeat a single song or playlist, and a drop down menu for media settings. In the case of a video, choices for the quality of the video are usually present when streaming it online. Lastly slider that corresponds to the video or song length and how far into the file you are is present at the bottom of the screen.
Songs are listed by alphabetical order, and depending on what tab you are in you can search for specific artists or albums as well. When play button is clicked/pressed, the file will begin playing. Default speakers in the device will be used unless there are user designated speakers available (e.x. headphones plugged in, blue tooth stereo system set up, etc.). If the previous file button is pressed once, the player will return to the beginning of the current file. If it is pressed twice in rapid succession it will start playing the file that came before the current one. The next file button only needs to be pressed once to skip the rest of the current file and start playing the next file in the list.
Hovering your mouse over the video or tapping the screen while the video is on will bring up the user interface. Clicking/pressing the Play/Pause button will trigger the file to start playing or pause at that time. If the previous file button is pressed once, the player will return to the beginning of the current file. If it is pressed twice in rapid succession it will start playing the file that came before the current one. The next file button only needs to be pressed once to skip the rest of the current file and start playing the next file in the list. Moving the slider for volume will increase or decrease the volume that the file is playing at.
In some media players there are two major states, when the control shown and control hidden states. In the control shown state this is when the user is able to control the video. Within this state there are multiple states:
For video media players there are also options to change states between having the video play full screen and the video playing at the specifed size.
For most users, media players are used to do one thing, to play the media that the user wants them to play. That being said, because it is more of a utilitarian component, there are some usability metrics that are not as importnat as others. Some of the important ones are learnability, efficiency, errors, and memorability.
Learnability: Media players have to be quickly learnable. For most users, the media player is only a gateway for them to see the actual content. The quicker it is to learn the software the better. Many media players should come intuitively. The different buttons and icons are very similar to other physical media players such as DVDs, Blu-Ray players and CD players. This similarity helps for users to quickly learn how to watch media on their devices.
Efficiency: Since it is not so much the media player that is important then the actual content being played, media players must also be very efficient. Many of the players today have many keyboard shortcuts. Arrows can be used to skip songs or to fastforward or rewind per frame. Spacebar is also commonly used to play and pause. Also there are many shortcuts for fullscreen or to adjust the volume.
Errors: Though errors are not fatal for media players, errors can annoy the user and take away from the content being shown. Errors such as play and pausing when the user wants to or wrong volume controls may not allow the user to play the video as intended. Since as said before, a media player is a gateway for the actual audio or video media. Therefore though the user may not be fatal, as long as the media does not get deleted, the errors for Media players should be very small.
Memorability: Media players should be very memorable. When a media player isn't used for a long time, the user should automatically be able to remember how it functions because for the user, their intent is to watch the audio/video content that the media player is going to play. The mental model of the media player as well as the user should not be very different. To help to make sure it is memorable, similar icons are used throughout media players for common tasks such as play, stop, or skip.
Satisfaction: Satisfaction is not a very important component for media players. As long as the media player is able to play the content that the user wants then it is doing its job. It is the job of the content itself to satisfy the users.
Above is a screen shot of what a media player looks like in OS X Yosemite.
Video Media Player
For Yosemite, after double-clicking on the icon, Quicktime Media player launches in a borderless window. The difference here is that there is no setting for quality. Instead it is all the same quality across the board.
Above is a screenshot of what previewing media looks like in OS X Yosemite.
This is a screenshot of what previewing media looks like in OSX Yosemite. If a file is selected, the user can hold down space bar and they can play it. Also they can press the play button on the lower right hand corner.
In reference to the OSX Human Interface Guideline, Apple also references that Feedback and Assistance is important. Also keyboard alternatives are also very important. They encourage to "provide keyboard-only alternatives". Other important principles that are important are:
Above are screenshots of what a media player looks like on the iPhone4s in the Photos app.
Above are screenshots of what a media player looks like on the iPhone4s in the Video app.
One of the major differences in appearance is that the timeline for iOS is located on the top of the screen separate from the buttons
Video Media Player
For iOS, different media players appear depending on which application you are currently in. The buttons though are very similar to the original.
Apple OSX Human Interaction Guidelines document https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/DesignPrinciples.html#//apple_ref/doc/uid/20000957-CH18-SW1


B.S. in Computer Information Systems
Minor in Business Administration
Hannibal-LaGrange University
A graduate of Tongue River High School in Dayton, WY, I began pursuing a career in computers my junior year of high school. By the time I graduated in 2013 I completed 4 semesters of Cisco Networking Academy and various programming courses preparing me in languages such as HTML, CSS, and ActionScript. While keeping a 3.8 GPA in my academics I excelled in athletics, participated in clubs including NHS, Skills USA, FCA, StuCO, and served regularly as a part of my church.
Following high school I was accepted to Hannibal-LaGrange University to pursue a degree in Computer Information Systems and minor in Business Administration while also competing in Track & Field. During my time at HLGU my willingness to serve, be involved, and lead where shown through my role as Vice President of the Student Activities Committee and my position as a Resident Advisor. In order to further prepare myself for a career after school I worked many jobs on and off campus. These positions (details in resume) improved communicational, technological, and problem solving skills. After completing a CIS degree in 3 years, while keeping a 3.8 GPA, I will begin working at Ptolemy Data Systems as an IT Support Technician.
Feel free to contact me by my phone number or email!
(307)461-3041


3D Printing¶
The 3D printing process is becoming very popular recently and used in many different fields. 3D printing, also called additive manufacturing, is a process of creating 3D dimensional physical objects from a digital file. There are different 3D printing technologies and materials you can go with in the industry now. However, mostly uses same principle, a digital file is turned into a solid physical three-dimensional object by adding material layer by layer.
ABS and PLA materials¶
STL file¶
Cura software¶
Cura is an open source 3D printing slicing application. It’s a preferred slicer software for Ultimaker 3D printers.


Traffiqa Documentation
Traffiqa is an optimization service that will help you make your service run much faster. In this documentation we will try our best to help you to get to know and use the Traffiqa service.
If you have any question, the best way to reach us is by using the online chat. Just click on the small rectangle on the right bottom corner. You can also reach us @traffiqa on twitter and also on<EMAIL_ADDRESS>Images
From Website Origin
To get a file from your account, call this end point:
GET http://s.traffiqa.com/{accountId}/origin/{filePath}
Make sure to replace
{accountId}
with your account ID and{filePath}
with your file path.
You don’t need to upload your files to Traffiqa in order to start using the service. you just need to tell Traffiqa where your current files are.
After you’ve setup your account origin, you can access any file from your origin
Origin Example
GET http://s.traffiqa.com/demo/origin/images/my-awsome-logo.png
Traffiqa will go yo your service origin, grab the file, optimize it, save it and sent it back to the browser
For example, let’s assume you have these settings:
Website Origin: http://www.my-awsome-service.com
File Path On Origin: http://www.my-awsome-service.com/images/my-awsome-logo.png
{accountId}: demo
{filePath}: /images/my-awsome-logo.png
Processes Summary
| Process | Default | Description |
|---|---|---|
| optimize | true | Optimize image with same file type. |
| format | auto | Change image file format to a different format. |
| width | – | No default. Change image width to a different one. Value are in pixels |
| height | – | No default. Change image height to a different one. Value are in pixels |
Processes
optimize
Use the optimize
process when you want to shrink down the current image and keeping it with the same file format.
- Type:
Boolean
- Default Value:
true
- Example values:
optimize=false
,o=true
- Alias
o
format
Use the format
process to enforce a certain file format, to keep original file format or specify auto
to change file format according to user browser type.
- Type:
String
- Default Value:
auto
- Example values:
format=auto
,f=auto
,f=png
,f=jpg
,f=webp
- Alias
f
width
Use the width
process to change the image width, if height
is not specified - the original height
will change with the same proportion.
Values are in pixels.
- Type:
Integer
- Example values:
width=500
,w=500
,w=250
- Alias
w
height
Use the height
process to change the image width, if width
is not specified - the original width
will change with the same proportion.
Values are in pixels.
- Type:
Integer
- Example values:
height=500
,h=500
,h=250
- Alias
h
Default Processes Values
GET http://s.traffiqa.com/demo/origin/images/my-awsome-logo.png
Is the same as:
GET http://s.traffiqa.com/demo/origin/images/my-awsome-logo.png?format=auto&optimize=true
To turn off optimization and auto file format, use:
GET http://s.traffiqa.com/demo/origin/images/my-awsome-logo.png?format=original&optimize=false
If you will try to fetch an image from your origin you will see that it will be optimized without you specifying anything.
Traffiqa is optimized by default and you need to explicitly say that you don’t want a file to be optimized
Javascript
Origin Example
GET http://s.traffiqa.com/demo/origin/js/main.js
Traffiqa will go yo your service origin, grab the Javascript file, minify it, remove unnecessary comments and sent it back to the browser
For example, let’s assume you have these settings:
Website Origin: http://www.my-awsome-service.com
{accountId}: demo
{filePath}: /js/main.js
Processes Summary
| Process | Default | Description |
|---|---|---|
| minify | true | Minify your Javascript file and remove unnecessary comments. |
Processes
minify
Use the minify
process when you want to minify the current Javascript.
- Type:
Boolean
- Default Value:
true
- Example values:
minify=false
,minify=true
Default Processes Values
GET http://s.traffiqa.com/demo/origin/js/main.js
Is the same as:
GET http://s.traffiqa.com/demo/origin/js/main.js?minify=true
To turn off minification and auto file format, use:
GET http://s.traffiqa.com/demo/origin/js/main.js?minify=false
If you will try to fetch a Javascript file from your origin you will see that it will be minified without you specifying anything.
Traffiqa is minifying by default and you need to explicitly say that you don’t want a file to be minified.
CSS
Origin Example
GET http://s.traffiqa.com/demo/origin/css/main.css
Traffiqa will go to your service origin, grab the CSS file, minify it, remove unnecessary comments and sent it back to the browser
For example, let’s assume you have these settings:
Website Origin: http://www.my-awsome-service.com
{accountId}: demo
{filePath}: /css/main.css
Processes Summary
| Process | Default | Description |
|---|---|---|
| minify | true | Minify your CSS file and remove unnecessary comments. |
Processes
minify
Use the minify
process when you want to minify the current CSS file.
- Type:
Boolean
- Default Value:
true
- Example values:
minify=false
,minify=true
Default Processes Values
GET http://s.traffiqa.com/demo/origin/css/main.css
Is the same as:
GET http://s.traffiqa.com/demo/origin/css/main.css?minify=true
To turn off minification and auto file format, use:
GET http://s.traffiqa.com/demo/origin/css/main.css?minify=false
If you will try to fetch a CSS file from your origin you will see that it will be minified without you specifying anything.
Traffiqa is minifying by default and you need to explicitly say that you don’t want a file to be minified.
HTML
Origin Example
GET http://s.traffiqa.com/demo/some.html
Traffiqa will go to your service origin, grab the HTML file, minify it, remove unnecessary comments and sent it back to the browser
For example, let’s assume you have these settings:
Website Origin: http://www.my-awsome-service.com
{accountId}: demo
{filePath}: /some.html
Processes Summary
| Process | Default | Description |
|---|---|---|
| minify | true | Minify your HTML file and remove unnecessary comments. |
Processes
minify
Use the minify
process when you want to minify the current HTML file.
- Type:
Boolean
- Default Value:
true
- Example values:
minify=false
,minify=true
Default Processes Values
GET http://s.traffiqa.com/demo/origin/some.html
Is the same as:
GET http://s.traffiqa.com/demo/origin/some.html?minify=true
To turn off minification and auto file format, use:
GET http://s.traffiqa.com/demo/origin/some.html?minify=false
If you will try to fetch a HTML file from your origin you will see that it will be minified without you specifying anything.
Traffiqa is minifying by default and you need to explicitly say that you don’t want a file to be minified.
Errors
The Kittn API uses the following error codes:
| Error Code | Meaning |
|---|---|
| 400 | Bad Request – Your request sucks |
| 401 | Unauthorized – Your account Id is wrong or blocked |
| 403 | Forbidden – The request is hidden for administrators only |
| 404 | Not Found – The specified request could not be found |
| 405 | Method Not Allowed – You tried to access a file with an invalid method |
| 406 | Not Acceptable – You requested a format that isn’t supported |
| 410 | Gone – The requested file has been removed from our servers |
| 418 | I’m a teapot |
| 429 | Too Many Requests – Slow down! |
| 500 | Internal Server Error – We had a problem with our server. Try again later. |
| 503 | Service Unavailable – We’re temporarily offline for maintenance. Please try again later. |


The goal of the R/Medicine conference is to promote the use of the R programming environment and the R ecosystem in medical research and clinical practice. R, the open source language for statistical computing and data visualization, has also become an effective tool for enabling reproducible research and the communication of scientific knowledge. In addition to showcasing novel tools, algorithms and methods for analyzing medical and clinical data. We hope the conference will provide a forum for collaboration within the community.
Conference talks will address the use of R in medical applications from Phase I clinical trial design through the analysis of the efficacy of medical therapies in public use. Topic areas for R/Medicine include: clinical trial design, the analysis of clinical trial data, personalized medicine, the analysis of patient records, the analysis of genetic data, the visualization of medical data, and reproducible research.
Note that topics related to drug discovery and PK/PD modeling will likely be the focus of the upcoming R/Pharma conference.


|
Rettangolo
|
|
As
(ABCD) = a·b
As
= BC__· AB__
|
|
Quadrato
|
|
As
(ABCD) = a2
As
= BC2__
|
|
Parallelogramma
|
|
As
(ABCD) = a·h
As
= BC__· AH__
|
|
Triangolo
|
|
|
As
(ABC) =
|
a·h
-------- 2 |
|
As
(ABC) =
|
BC__· AH__
-------------- 2 |
|
|
Rombo
|
|
|
As
(ABCD) =
|
d1·d1
-------- 2 |
|
As
(ABCD) =
|
BD__· AC__
-------------- 2 |
|
|
Trapezio
|
|
|
As
(ABCD) =
|
(b1+ b2) ·h
----------- 2 |
|
As
(ABCD) =
|
(BC__+ AD)__·
AH__
--------------------------- 2 |
|
Poligono circoscritto
|
|
|
As
(ABCDE) =
|
2p ·r
----------- 2 |
= p·r |
|
Poligono
qualunque
|
|
Dividere il poligono in triangoli,
calcolarne le aree e poi sommarle
|


Cordova Demo App
Menu
Menu
Close
Demo Input
Demo Output
Exit
Home
Settings
About
Exit
(C) 2017 IS4103 - Enterprise Systems Development Project. All rights reserved.
Cordova Demo App
Menu
Demo Input
Text input:
Password:
Textarea:
Checkboxes:
Checkbox One
Checkbox Two
Checkbox Three
Radio buttons:
Radio Button One
Radio Button Two
Radio Button Three
Select one menu:
Standard: 7 day
Rush: 3 days
Express: next day
Overnight
Select many menu:
Choose a few options:
Standard: 7 day
Rush: 3 days
Express: next day
Overnight
First Overnight
Express Saver
Ground
Date picker:
Slider:
Flip switch:
Off
On
Menu
Close
Demo Input
Demo Output
Exit
Home
Settings
About
Exit
(C) 2017 IS4103 - Enterprise Systems Development Project. All rights reserved.
Cordova Demo App
Menu
Demo Output
All Venues
Menu
Close
Demo Input
Demo Output
Exit
Home
Settings
About
Exit
(C) 2017 IS4103 - Enterprise Systems Development Project. All rights reserved.
Lecture 12 Mobile App
Menu
Demo Output
Events in Selected Venue
ID
Name
Start
End
Venue
Status
Back
Menu
Close
Demo Input
Demo Output
Exit
Home
Settings
About
Exit
(C) 2017 IS4103 - Enterprise Systems Development Project. All rights reserved.


Powered by Jekyll |using Scribble theme | Copyright 2014 - {{site.time | date:"%Y"}} by John Shaw {{site.time | date:"%Y-%m-%d %H:%M:%S %Z"}}


--- layout: berlin/camp-detail title: Offline Camp Schedule tab: schedule root_path: ../../ ---
First things first. When booking your travel, please be careful to allow sufficient travel time to our somewhat remote destination. Hop over to our FAQ for more info.
Offline Camp is a mix of formal discussion and informal networking and relaxation, and we sometimes make schedule adjustments on site to adapt to whatever awesomeness ensues. That said, here's a sneak peek at our plan for the weekend. (Don't worry, there are also breaks mixed in between these activities!)
15:00 - 17:00 - Arrive at Schloss Blankensee
19:00 - Dinner and welcome
Evening - Campfire & relaxation
8:00 - Breakfast
9:00 - Standup
10:00 - Voting for unconference sessions
10:45 - Unconference sessions & recaps (round 1)
13:00 - Lunch
14:00 - Passion Talks
15:00 - Unconference sessions & recaps (round 2)
17:00 - Unconference sessions & recaps (round 3)
19:00pm - Dinner
Evening - Campfire & relaxation
9:00 - Breakfast
10:00 - Standup
10:45 - Voting for unconference sessions
11:30 - Unconference sessions & recaps (round 4)
13:15 - Lunch
14:15 - Passion Talks
15:30 - Unconference sessions & recaps (round 5)
17:30 - Unconference sessions & recaps (round 6)
19:00 - Dinner
Evening - Campfire & relaxation
9:00 - Breakfast
10:00 - Standup
11:00 - Depart


Find a regex that matches the hidden word and no other words!
The server will modify a minimal number of letters in the hidden word to match the regex you give.
Modified letters will be marked orange and the original letters will be marked green.
If there are multiple ways to do so, the server will randomly choose one.


The Psychic Game
Guess what letter I'm thinking of
Wins: 0
Losses: 0
Guesses Left: 9
Your Guesses So Far:


Before Passed
Then The page title should be "Budgeting App - Educational React App" Passed
After Passed
User can add different catigories of incomes and outcomes
All the transactions are displayed in the balance and report
Scenario: Check Budget page title Passed
Before Passed
Then The page title should be "Budgeting App - Educational React App" Passed
After Passed
Scenario: Check Budget tab is active by default Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" tab is active Passed
After Passed
Scenario: Check Budget table is displayed Passed
Before Passed
When I click on tab "Budget" Passed
Then I should see Budget table Passed
After Passed
Scenario: Check records are present after page refresh Failed
Before Passed
When I add a record with "12345" Passed
And I check number of records is 9 Passed
And I refresh the page Passed
Then I check number of records is 9 Failed
Error: Number of records is not matching! expected to be 9 but actual number is 8 at CucumberAssert.callActualEqualAssert (/Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/cucumber-assert/index.js:43:12) at CucumberAssert.equal (/Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/cucumber-assert/index.js:90:7) at /Users/nsokh/modus/budgeting-sample-app-webpack2/e2e/feature/step_definitions/budget_context.js:79:14 at ManagedPromise.invokeCallback_ (/Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/selenium-webdriver/lib/promise.js:1376:14) at TaskQueue.execute_ (/Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/selenium-webdriver/lib/promise.js:3084:14) at TaskQueue.executeNext_ (/Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/selenium-webdriver/lib/promise.js:3067:27) at asyncRun (/Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/selenium-webdriver/lib/promise.js:2927:27) at /Users/nsokh/modus/budgeting-sample-app-webpack2/node_modules/selenium-webdriver/lib/promise.js:668:7 atAfter Passed
Scenario: : Check Budget table has correct columns Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have column Category Passed
After Passed
Scenario: : Check Budget table has correct columns Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have column Description Passed
After Passed
Scenario: : Check Budget table has correct columns Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have column Amount Passed
After Passed
Scenario: Check Budget table has preset records Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have record Groceries Passed
After Passed
Scenario: Check Budget table has preset records Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have record Travel Passed
After Passed
Scenario: Check Budget table has preset records Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have record Income Passed
After Passed
Scenario: Check Budget table has preset records Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have record Entertainment Passed
After Passed
Scenario: Check Budget table has preset records Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have record Misc Passed
After Passed
Scenario: Check Budget table has preset records Passed
Before Passed
When I click on tab "Budget" Passed
Then "Budget" table should have record Income Passed
After Passed
Scenario: Check ability to select a budget category Passed
Before Passed
When I click on tab "Budget" Passed
And I click on "Catrgory" dropdown Passed
Then I should see the list of categories Passed
After Passed
Scenario: Check the list of categories Passed
Before Passed
Before Passed
Scenario: Check ability to add a description of record Passed
Before Passed
Before Passed
Scenario: Check ability to ad a value Passed
Before Passed
Before Passed
Scenario: Check add button is disable when value is not set Passed
Before Passed
Before Passed
Scenario: Check value is enable when value is set Passed
Before Passed
Before Passed
Scenario: Set value then unset it(check add button inactive) Passed
Before Passed
Before Passed
Scenario: Set value +123 for consumption Passed
Before Passed
Before Passed
Scenario: Check record was added with description Passed
Before Passed
Before Passed
Scenario: Check record was added w\o description Passed
Before Passed
Before Passed
Scenario: Check only numbers for amount are availiable Passed
Before Passed
Before Passed
Scenario: Set value with decimals - see the alert Passed
Before Passed
Before Passed
Scenario: Set 16 digits number Passed
Before Passed
Before Passed
Scenario: Check the record was added to the table Passed
Before Passed
Before Passed
Scenario: check the record affected the balance records correct Passed
Before Passed
Before Passed
Scenario: Check negative balance should be with “-“ Passed
Before Passed
Before Passed
Scenario: check Star button is displayed and clickable Passed
Before Passed
Before Passed
Scenario: check Fork button is displayed and clickable Passed
Before Passed
Before Passed
Scenario: check logo is displayed Passed
Before Passed
Before Passed


Nyzo 625: relay cache invalidation
Nyzo version 625
(commit on GitHub) adds automatic invalidation of cached files on the relay server based on
file modification timestamps.
This version affects the relay server.
The fileTimestamp field was added to the
FileContentCache class.
In RelayEndpoint, the fileTimestamp is now
considered when checking the cache. A cached response is only used when its file timestamp exactly matches the
current timestamp of the file on the filesystem.


Download resume file
View repos
View Linkedin proflie
Coding and Hardware
Various Art work (pg under way)


HomeSavvy
All in one Suite to Manage your Home!
Save Money. Improve Value. Get Organized.
Easy to use smart applications, content and data to manage your home for insurance, home selling and moving purposes. It is time to manage your largest asset!


April 1, 2019
James Michael Nichols | Equality NC |<EMAIL_ADDRESS>|<PHONE_NUMBER>
Adam Polaski | Campaign for Southern Equality |<EMAIL_ADDRESS>|<PHONE_NUMBER>
RALEIGH – New polling data affirms that an overwhelming majority of North Carolinians from every political affiliation support preventing licensed medical professionals from conducting so-called “conversion therapy” on LGBTQ minors and disabled adults.
A February 2019 poll conducted by Public Policy Polling and commissioned by Equality NC and the Campaign for Southern Equality, found that a supermajority of Republicans (87%), Democrats (75%) and Independents (78%) support protecting North Carolina’s young people from conversion therapy.
Overall, 80% of all polled respondents immediately stated that they think “conversion therapy” purporting to change a person’s sexual orientation or gender identity should be illegal on children under 18. Of the remainder who initially disagreed or had no opinion, more than half changed their mind after better understanding what the practice of “conversion therapy” entails.
Conversion therapy has been rejected by every leading professional medical and mental health association in the country, who have declared it unnecessary, ineffective, and dangerous to an individual's health and well-being. Tactics of the practice can include inducing nausea, vomiting, or paralysis while showing the patient homoerotic images; providing electric shocks; and using shame to create aversion to same-sex attractions. The devastating and long-lasting harms often lead to severe depression and even suicide. An estimated 700,000 Americans have endured “conversion therapy” in their lifetime, with half of these receiving the treatment as minors.
This profound display of bipartisan support comes on the heels of legislators introducing The Mental Health Protection Act (HB516/SB426), which would protect LGBTQ minors and disabled adults from “conversion therapy.” The life-saving legislation, introduced March 28 in the North Carolina General Assembly, is supported by Born Perfect NC, a grassroots statewide campaign from Equality North Carolina and the Campaign for Southern Equality that is backed by a coalition of clergy, mental health organizations, faith groups, child welfare advocates and civil rights organizations.
“Republicans and Democrats agree, it is time to protect North Carolina’s children from so-called ‘conversion therapy’ practices,” said Equality NC Executive Director Kendra R. Johnson. “It’s rare that we find bipartisan support around an issue in North Carolina, but I think we can all agree that we want the safest and healthiest future for our children.”
“The overwhelming bipartisan support demonstrated in this poll reflects the reality that people across North Carolina understand that no one can change something as fundamental as their sexual orientation or gender identity,” said Allison Scott, Director of Policy and Programs for the Campaign for Southern Equality. “We know that support for the Mental Health Protection Act will keep growing because it protects our kids and just makes sense.”
The poll was conducted among 807 voters in North Carolina between February 6-7 by Public Policy Polling.
###
Equality NC is dedicated to securing equal rights and justice for lesbian, gay, bisexual, transgender, and queer (LGBTQ) North Carolinians. www.equalitync.org
Based in Asheville, NC, the Campaign for Southern Equality works for full LGBTQ equality across the South. Our work is rooted in commitments to equity in race, gender and class. www.southernequality.org
Born Perfect NC is the campaign to protect young people across North Carolina from "conversion therapy" and send the message that LGBTQ youth should feel safe, supported, and affirmed. www.bornperfectnc.org