In database jargon, PostgreSQL uses a client/server model. A PostgreSQL session consists of the following cooperating processes (programs):
postgres
.As is typical of client/server applications, the client and the server can be on different hosts. In that case they communicate over a TCP/IP network connection. You should keep this in mind, because the files that can be accessed on a client machine might not be accessible (or might only be accessible using a different file name) on the database server machine.
The PostgreSQL server can handle multiple concurrent connections from clients. To achieve this it starts (“forks”) a new process for each connection. From that point on, the client and the new server process communicate without intervention by the original postgres
process. Thus, the master server process is always running, waiting for client connections, whereas client and associated server processes come and go. (All of this is of course invisible to the user. We only mention it here for completeness.)
SQL is short for Structured Query Language. Originally, it used to be called SEQUEL (Structured English Query Language) and was used for storing and manipulating data in databases. Today SQL is used to perform all types of data operations in relational database management systems (RDBMS).
SQL is a powerful language where we can perform a wide range of operations:
The American National Standards Institute (ANSI) created a standard for SQL in 1986, and it was adopted by the International Organization for Standardization (ISO) in 1987. For each RDBMS to be compliant with the ANSI standard, they all have to support the major commands, like DML, in a similar manner as closely as possible. More information about the ANSI standard can be found on the SQL Wikipedia page.
SQL follows ANSI/ISO standards, but there are different versions of the SQL language used by different database systems. For example, in PostgreSQL we can perform an INSERT operation using RETURNING clauses, which not all other databases can do.
[centos@tushar-ldap-docker bin]$ ./psql postgres
psql.bin (11.9.17)
Type "help" for help.
postgres=# create table tyu(n int);
CREATE TABLE
postgres=# insert into tyu values(1),(2) returning *;
n
---
1
2
(2 rows)
INSERT 0 2
But to be compliant with the ANSI standard, all databases support commands (like DELETE, UPDATE, SELECT, INSERT) in the same way—that is, the syntax should work anywhere.
If we check the PostgreSQL documentation of the INSERT statement, its conformity to the SQL standard is discussed in the page’s Compatibility section:
Compatibility
INSERT conforms to the SQL standard, except that the RETURNING clause is a PostgreSQL extension, as is the ability to use WITH with INSERT, and the ability to specify an alternative action with ON CONFLICT. Also, the case in which a column name list is omitted, but not all the columns are filled from the VALUES clause or query, is disallowed by the standard.
The SQL standard specifies that OVERRIDING SYSTEM VALUE can only be specified if an identity column that is generated always exists. PostgreSQL allows the clause in any case and ignores it if it is not applicable.
The PostgreSQL documentation includes clear descriptions of any differences from the SQL standard for any command, including:
under each command’s Compatibility section.
Now let’s explore some examples of common and useful PostgreSQL queries that can be used in various situations.
CREATE TABLE is a keyword that will create a new, initially empty table in the database. The table will be owned by the user who has issued this command.
postgres=# create table dummy_table(name varchar(20),address text,age int);
CREATE TABLE
The INSERT command is used to insert data into a table:
postgres=# insert into dummy_table values('XYZ','location-A',25);
INSERT 0 1
postgres=# insert into dummy_table values('ABC','location-B',35);
INSERT 0 1
postgres=# insert into dummy_table values('DEF','location-C',40);
INSERT 0 1
postgres=# insert into dummy_table values('PQR','location-D',54);
INSERT 0 1
The SELECT command (when used without the optional WHERE condition) is used to fetch all data from a database table:
postgres=# select * from dummy_table;
name | address | age
---------+--------------+ -----
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
PQR | location-D | 54
(4 rows)
UPDATE is used to make updates to the data or row(s) of a database table. In the example below we use UPDATE to change the age of a person whose name is ‘PQR’:
postgres=# update dummy_table set age=50 where name='PQR';
UPDATE 1
postgres=# select * from dummy_table;
name | address | age
--------+--------------+-------
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
PQR | location-D | 50
(4 rows)
Next, we’ll use the UPDATE command to change the name and age of a person whose address is ‘location-D’:
postgres=# update dummy_table set name='GHI',age=54 where address='location-D';
UPDATE 1
postgres=# select * from dummy_table;
name | address | age
------+------------+-----
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
GHI | location-D | 54
(4 rows)
postgres=#
If we want to modify all the values in the address and age columns in dummy_table, then we do not need to use the WHERE clause. The UPDATE query would look like this:
postgres=# update dummy_table set age=54,address='location-X';
UPDATE 4
postgres=# select * from dummy_table ;
name | address | age
------+------------+--------
XYZ | location-X | 54
ABC | location-X | 54
DEF | location-X | 54
GHI | location-X | 54
(4 rows)
postgres=#
A RETURNING clause returns the updated rows. This is optional in UPDATE:
postgres=# update dummy_table set age=30 where name='XYZ' returning age as age_no;
age_no
---------
30
(1 row)
UPDATE 1
It is always recommended to perform such operations under transaction blocks (i.e., BEGIN…COMMIT/ROLLBACK;), so we have the option to roll back the operation.
The DELETE command is used to delete row(s). It can be used with or without the optional WHERE condition, but take note: if the WHERE condition is missing, the command will delete all rows, leaving you with an empty table.
In this example, we are deleting one row whose age column has the value 65:
postgres=# delete from dummy_table where age=65;
DELETE 1
postgres=#
In PostgreSQL, with the help of comparison operators we can find results where the value in a column is not equal to the specified condition or value.
postgres=# select * from dummy_table where age <=50;
name | address | age
------+------------+-----
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
PQR | location-D | 50
(4 rows)
postgres=# select * from dummy_table where age>=50;
name | address | age
------+------------+-----
PQR | location-D | 50
(1 row)
postgres=# select * from dummy_table where age<>50;
name | address | age
------+------------+-----
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
(3 rows)
postgres=# select * from dummy_table where age=50;
name | address | age
------+------------+-----
PQR | location-D | 50
(1 row)
The SELECT DISTINCT statement is used to return only distinct values from the table. It removes any duplicate values.
postgres=# select age from dummy_table order by 1;
age
-----
1
1
2
2
3
(5 rows)
postgres=# select distinct age from dummy_table order by 1;
age
-----
1
2
3
(3 rows)
The TRUNCATE command is used to empty a table:
postgres=# truncate table dummy_table;
TRUNCATE TABLE
This DROP TABLE command is used to drop a table from the database:
postgresql=# drop table if exists dummy;
NOTICE: table "dummy" does not exist, skipping
DROP TABLE
This command has removed the full table, including any associated data, indexes, rules, triggers, and constraints for that table.
The CREATE VIEW command is used to generate views. Views are pseudo-tables, which are used to present a full table, subset, or select columns from the underlying table:
postgres=# create or replace view vi as select * from dummy_table where age is NULL;
CREATE VIEW
Using the syntax in the example below, we can create a table using a SELECT statement:
postgres=# select 'My name is X' as col1 , 10 as col2, 'Address is -XYZ location' as col3 into new_table;
SELECT 1
postgres=# select * from new_table ;
col1 | col2 | col3
---------------+------+--------------------------
My name is X | 10 | Address is -XYZ location
(1 row)
We can command a query to timeout after a certain period with the help of GUC parameters (short for grand unified configuration) like statement_timeout, which aborts any statement that takes more than the specified number of milliseconds:
postgresql=# set statement_timeout=10;
SET
postgresql=# select pg_sleep(20);
ERROR: canceling statement due to statement timeout
The CREATE SEQUENCE command is a sequential number generator. Once the sequence is created, we can use the sequence’s nextval and currval functions to insert values into a table:
postgres=# create sequence seq;
CREATE SEQUENCE
postgres=# create table tab(n int);
CREATE TABLE
postgres=# insert into tab values (nextval('seq'));
INSERT 0 1
postgres=# insert into tab values (currval('seq'));
INSERT 0 1
postgres=# insert into tab values (nextval('seq'));
INSERT 0 1
postgres=# select * from tab;
n
---
1
1
2
(3 rows)
PostgreSQL doesn’t directly support BLOBs (binary large objects), but we can work with them using the following methods:
Let’s assume you have an image (in png format) downloaded in the /home/edb/ folder:
[edb@localhost]$ ls /home/edb/mypic.png
/home/edb/mypic.png
We want to store this image in the PostgreSQL database.
Go to the bin folder of your PostgreSQL installation and connect to the psql terminal:
postgres=# Create table testing(n int,n1 oid);
CREATE TABLE
postgres=# insert into testing values (1,lo_import('/home/edb/mypic.png'));
INSERT 0 1
The lo_import() function loads the named file into pg_largeobject and returns an OID (object identifier) value that will refer to the large object. Selecting the testing table will show just the OID and not the bits that have made up this photo.
The ILIKE operator is a matching function similar to the LIKE operator, but with the advantage that it matches valus case-insensitively.
postgres=# select * from ted;
n
-----
TAR
TaR
Tar
tar
(4 rows)
postgres=# select * from ted where n ilike 'TAR%';
n
-----
TAR
TaR
Tar
tar
(4 rows)
Hierarchical queries are ones where the results have a structured or parent-child relationship and are displayed in a tree structure. To see how hierarchical queries work, create a dummy table:
create table test_table(
emp_no int,
ename char(5),
job char(9),
manager_no int
);
Insert data into ‘test_table’:
insert into test_table values(10,'A1','CEO',null);
insert into test_table values(11, 'B1', 'VP', 10);
insert into test_table values(12, 'B2', 'VP', 10);
insert into test_table values(13, 'B3', 'VP', 10);
insert into test_table values(14, 'C1', 'DIRECTOR', 13);
insert into test_table values(15, ‘C2’, ‘DIRECTOR’, 13);
insert into test_table values(16, 'D1', 'MANAGER', 15);
insert into test_table values(17 ,'E1', 'ENGINEER', 11);
insert into test_table values(18, 'E2', 'ENGINEER', 11);
We can perform hierarchical queries on this table using the methods below.
The length function returns the number of characters or number of bytes in a specified string variable.
postgres=# select name,age from dummy_table;
name | age
------+-----
XYZ | 25
ABC | 35
DEF | 40
PQR | 54
PQR |
(5 rows)
postgres=# select length(name),length(age) from dummy_table;
length | length
--------+--------
3 | 2
3 | 2
3 | 2
3 | 2
3 |
(5 rows)
Say that while selecting a given function, we receive the error message below:
postgresql=# create or replace function f(n int)
returns int
as
$$
begin
select now();
return 1;
end;
$$ language 'plpgsql';
CREATE FUNCTION
postgres=# select f(9);
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
To avoid such errors, we can either use PERFORM or declare a variable and use it in a SELECT INTO statement:
postgres=# create or replace function f(n int)
returns int
as
$$
begin
perform
now();
return 1;
end;
$$ language 'plpgsql';
CREATE FUNCTION
postgresql=# select f(9);
f
---
1
(1 row)
postgres=# create or replace function f(n int)
returns int
as
$$
declare
a date;
begin
select now() into a;
raise notice ‘%s’,a;
return 1;
end;
$$ language 'plpgsql';
CREATE FUNCTION
postgresql=# select f(9);
NOTICE: 24-SEP-20 13:15:46.23388s
f
---
1
(1 row)
With the help of the COPY command, we can export data from a table to an outside text file as well as import data from a text file into a table.
postgres=# copy dummy_table to '/tmp/abc.txt';
COPY 5
postgres=# \! cat /tmp/abc.txt
XYZ location-A 25
ABC location-B 35
DEF location-C 40
PQR location-D 50
CXC 1 50
postgres=# copy dummy_table from '/tmp/abc.txt';
COPY 5
postgres=#WITH RECURSIVE cte AS ( SELECT emp_no, ename, manager_no, 1 AS level FROM test_table where manager_no is null UNION ALL SELECT e.emp_no, e.ename, e.manager_no, c.level + 1 FROM cte c JOIN test_table e ON e.manager_no = c.emp_no ) SELECT * FROM cte; emp_no | ename | manager_no | level -----------+----------+------------------+------- 10 | A1 | | 1 11 | B1 | 10 | 2 12 | B2 | 10 | 2 13 | B3 | 10 | 2 14 | C1 | 13 | 3 17 | E1 | 11 | 3 18 | E2 | 11 | 3 15 | C2 | 13 | 3 16 | D1 | 15 | 4 (9 rows) postgres=#
postgres=# CREATE EXTENSION tablefunc; CREATE EXTENSION postgres=#
postgres=# SELECT * FROM connectby('dummy_table', 'emp_no', 'manager_no', '10', 0, '->') AS t(emp_no int, manager_no int, level int, ord text) order by emp_no; emp_no | manager_no | level | ord --------+------------+-------+---------------- 10 | | 0 | 10 11 | 10 | 1 | 10->11 12 | 10 | 1 | 10->12 13 | 10 | 1 | 10->13 14 | 13 | 2 | 10->13->14 15 | 13 | 2 | 10->13->15 16 | 15 | 3 | 10->13->15->16 17 | 11 | 2 | 10->11->17 18 | 11 | 2 | 10->11->18 (9 rows) postgres=#
The following query can be used to show all the databases created:
postgres=# select oid,datname from pg_database;
oid | datname
-----------+-----------
13743 | postgres
1 | template1
13742 | template0
(3 rows)
We can also list out all the database names using the \l command at the psql prompt.
We can check the time needed for a query to execute by enabling \timing at the psql prompt:
postgres=# \timing
Timing is on.
The SELECT query will now show the execution time:
postgres=# select * from dummy_table;
name | address | age
------+------------+--------
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
PQR | location-D | 50
CXC | 1 | 50
(5 rows)
Time: 0.440 ms
postgres=#
Dynamic SQL is used to reduce repetitive tasks when it comes to querying.
Dynamic SQL queries are not cached in memory.
postgres=# do
postgres-# $$
postgres$# begin
postgres$# execute 'select * from dummy_table';
postgres$# end;
postgres$# $$;
DO
The COUNT query returns the number of rows in a table. If we use (*) this will include null values; otherwise null values will be excluded.
postgres=# select count(*) from dummy_table;
count
-------
5
(1 row)
postgres=# select count(avg) from dummy_table;
count
-------
4
(1 row)
The LIMIT clause is used to limit the data amount returned by the SELECT statement. The query below will display only 1 row:
postgres=# select * from dummy_table limit 1;
name | address | age
------+------------+-----
XYZ | location-A | 25
(1 row)
OFFSET is used when we want to skip a particular number of rows:
postgres=# select * from dummy_table offset 4;
name | address | age
------+---------+-----
cxc | 1 | 50
(1 row)
We can use conditional statements like IF … ELSE in an anonymous block. The example below checks if the values of variables abc and xyz are matching and prints the result— i.e., 150:
postgres=# Do
$$
Declare
abc int;
xyz int;
begin
abc:=100;
xyz:=abc;
if abc=xyz then
xyz=150;
raise notice '%',xyz;
else
end if;
end;
$$
;
NOTICE: 150
DO
We can use UPDATE with a JOIN and WHERE clause when we want to update the values from one table (table X) based on values from another table (table Y):
postgres=# create table X(n int, n1 char(10));
CREATE TABLE
postgres=# insert into X values (1,'abc');
INSERT 0 1
postgres=# insert into X values (2,'xyz');
INSERT 0 1
postgres=# insert into X values (3,'pqr');
INSERT 0 1
postgres=# create table Y(n int, n1 char(10));
CREATE TABLE
postgres=# insert into Y values (1,'');
INSERT 0 1
postgres=# insert into Y values (2,'');
INSERT 0 1
postgres=# insert into Y values (5,'axyz');
INSERT 0 1
postgres=# update Y set n1=X.n1 from X where X.n=Y.n;
UPDATE 2
postgres=# select * from Y;
n | n1
---+------------
5 | axyz
1 | abc
2 | xyz
(3 rows)
postgres=#
The INNER JOIN command will find rows from two (or more) tables where the specified columns data in the tables match:
postgres=# select * from x inner join y on x.n1 = y.n1;
n | n1 | n | n1
---+------------+---+------------
1 | abc | 1 | abc
2 | xyz | 2 | xyz
(2 rows)
postgres=#
The CASE expression is a generic conditional expression, similar to the IF … ELSE statement.
postgres=# SELECT age,
CASE age WHEN 25 THEN 'one'
WHEN 50 THEN 'two'
ELSE 'other'
END
FROM dummy_table;
age | case
-----+-------
25 | one
35 | other
40 | other
50 | two
50 | two
(5 rows)
Recursive queries are used to deal with hierarchical queries or tree-structured data. The structure of a WITH RECURSIVE query is always: a) Non-recursive term
b) UNION (or UNION ALL), then a recursive term
where the recursive term includes a reference to the query’s output.
CREATE TABLE emp_test (
id int,
ename varchar(255),
emanager int
);
INSERT INTO emp_test VALUES (1, 'abc', null);
INSERT INTO emp_test VALUES (2, 'xyz', 1);
INSERT INTO emp_test VALUES (3, 'def', 2);
INSERT INTO emp_test VALUES (4, 'cde', 1);
INSERT INTO emp_test VALUES (5, 'qrs', 2);
INSERT INTO emp_test VALUES (9, 'iop', 3);
INSERT INTO emp_test VALUES (10, 'klm', 4);
The recursive query below will give all the reports in a certain order:
postgres=#WITH RECURSIVE emp_testnew AS (
SELECT id, ename, emanager
FROM emp_test
WHERE id = 2
UNION ALL
SELECT e.id, e.ename, e.emanager
FROM emp_test e
INNER JOIN emp_testnew e1 ON e1.id = e.emanager
)
SELECT *
FROM emp_testnew;
id | ename | emanager
----+-------+----------
2 | xyz | 1
3 | def | 2
5 | qrs | 2
9 | iop | 3
(4 rows)
postgres=#
Using the pg_stat_statements module, we can track execution statistics for all SQL statements. To do this, we need to create an extension and add in shared_preload_libraries inside the postgresql.conf file:
postgres=# create extension pg_stat_statements;
CREATE EXTENSION
postgres=# show shared_preload_libraries ;
shared_preload_libraries
-------------------------------------------------
$libdir/pg_stat_statements
(1 row)
postgres=# select query from pg_stat_statements where query like 'create table%';
-[ RECORD 1 ]-------------------
query | create table test(n int)
We can also configure PostgreSQL to generate log output by enabling these parameters in the postgresql.conf file:
logging_collector = on
log_directory = 'log'
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log'
log_destination = ‘stderr’
Log file will be created under the pg_log directory which resides under the data folder.
[centos@tushar-ldap-docker bin]$ ls data/log
postgresql-2020-09-17_150932.log postgresql-2020-09-19_000000.log
[centos@tushar-ldap-docker bin]$
Queries will be recorded in these files.
We can declare a variable in PostgreSQL at the psql prompt:
postgres=# \set cond 50
postgres=# select * from dummy_table where age=:cond;
name | address | age
------+------------+-----
PQR | location-D | 50
(1 row)
OR
postgres=# \set cond 50
postgres=# select :cond+100 ;
?column?
----------
150
(1 row)
PostgreSQL offers functions for date and time that can be used in queries.
postgres=# select now();
now
----------------------------------
22-SEP-20 03:08:42.636385 +05:30
(1 row)
postgres=# select current_date;
current_date
--------------
22-SEP-20
(1 row)
postgres=# select current_time;
current_time
-----------------------
03:08:53.648466+05:30
(1 row)
We can also perform a date range query to find rows with values between two time stamps:
postgres=# create table datetable(n int,n1 date);
CREATE TABLE
postgres=# insert into datetable values (1,'12-01-1980');
INSERT 0 1
postgres=# insert into datetable values (2,'12-01-2020');
INSERT 0 1
postgres=# insert into datetable values (3,'12-01-2000');
INSERT 0 1
postgres=# select * from datetable where n1 between '12-01-1980' and '12-01-2000';
n | n1
---+--------------------
1 | 12-JAN-80 00:00:00
3 | 12-JAN-00 00:00:00
(2 rows)
When a PL/pgSQL function is declared to return a SETOF some data type, the return is specified by a RETURN QUERY command:
postgres=# CREATE FUNCTION get(int) RETURNS SETOF integer AS
$BODY$
BEGIN
RETURN QUERY SELECT age
FROM dummy_table
WHERE age >= $1 ;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
postgres=# select * from get(9);
get
-----
25
35
40
50
(4 rows)
Parallel queries in PostgreSQL allow you to finish queries faster by utilizing many CPUs. These GUCs parameters are set in postgresql.conf file:
#max_parallel_maintenance_workers = 2 # taken from max_parallel_workers
#max_parallel_workers_per_gather = 2 # taken from max_parallel_workers
#parallel_leader_participation = on
#max_parallel_workers = 8 # maximum number of max_worker_processes that
# can be used in parallel operations
postgres=# create table ty(n int);
CREATE TABLE
postgres=# insert into ty values (generate_series(1,300000));
INSERT 0 300000
postgres=# analyze ty;
ANALYZE
postgres=# explain select * from ty where n<=1;
QUERY PLAN
---------------------------------------------------------------------
Gather (cost=1000.00..4536.88 rows=30 width=4)
Workers Planned: 1
-> Parallel Seq Scan on ty (cost=0.00..3533.88 rows=18 width=4)
Filter: (n <= 1)
(4 rows)
postgres=#
There are three basic logical operators available in PostgreSQL: AND, OR, and NOT.
These operators are used to match conditions in SQL statements—e.g., in WHERE and HAVING clauses.
AND = when both boolean expressions are true then it will return TRUE
OR = when any boolean expression is true then it will return TRUE
NOT = reverses the value of Boolean operator
If both expressions are true, then the result is TRUE. postgresql=# select 1=1/1 and 200=2+198 as result_and_operator; result_and_operator --------------------- t (1 row) postgresql=#
If one expression is true and another expression is NULL, then the result is NULL. postgresql=# select 4=4 and null; ?column? ---------- (1 row)
If one expression is true and another expression is false, then the result is TRUE. postgres=# select 1=100 OR 2=2; ?column? ---------- t (1 row)
In the following SQL query, there are two records with the value 50:
postgres=# select age from dummy_table;
age
-----
25
35
40
50
50
(5 rows)
We can use the following SELECT … HAVING query to find the duplicate rows:
postgres=# select age, count(age) from dummy_table group by age having count(age)>1;
age | count
-----+-------
50 | 2
(1 row)
Enumerated (enum) types are data types that comprise a static, ordered set of values.
postgres=# CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TYPE
postgres=# create table testi(n int, n1 mood);
CREATE TABLE
postgres=# insert into testi values (1,'happy');
INSERT 0 1
postgres=# insert into testi values (1,'sad');
INSERT 0 1
postgres=# insert into testi values (1,'ok');
INSERT 0 1
If the enum has not been specified, it will give an error:
postgres=# insert into testi values (1,'happyo');
ERROR: invalid input value for enum mood: "happyo"
A pivot table is a useful way to analyze large quantities of data by organizing it into a more manageable format.
CREATE TABLE newtb(id SERIAL, rowid varchar(10), attri varchar(10), val varchar(10));
INSERT INTO newtb(rowid, attri, val) values('t1','a1','v1');
INSERT INTO newtb(rowid, attri, val) values('t1','a2','v2');
INSERT INTO newtb(rowid, attri, val) values('t1','a3','v3');
INSERT INTO newtb(rowid, attri, val) values('t1','a4','v4');
INSERT INTO newtb(rowid, attri, val) values('t2','a1','v5');
INSERT INTO newtb(rowid, attri, val) values('t2','a2','v6');
INSERT INTO newtb(rowid, attri, val) values('t2','a3','v7');
INSERT INTO newtb(rowid, attri, val) values('t2','a4','v8');
To create a pivot table you need to install the tablefunc extension:
postgres=# create extension tablefunc;
CREATE EXTENSION
Select *
FROM crosstab(
'select rowid, attri, val
from newtb
where attri = ''a2'' or attri = ''a3''
order by 1,2')
AS newtb(row_name varchar(10), category_1 varchar(10), category_2 varchar(10), category_3 varchar(10));
row_name | category_1 | category_2 | category_3
----------+------------+------------+--------------------------
t1 | v2 | v3 |
t2 | v6 | v7 |
(2 rows)
When we join a table against itself, this is called a SELF JOIN. This can be done using INNER JOIN or LEFT JOIN. SELF JOINs are useful when comparing the columns of rows within the same table:
postgres=# create table emp1(emp_id int, firstname char(10), lastname char(10) , manager_id int);
CREATE TABLE
postgres=#
postgres=#
postgres=# insert into emp1 values(1,'ABC','XYZ',NULL);
INSERT 0 1
postgres=# insert into emp1 values(2,'TYU','BGV',1);
INSERT 0 1
postgres=# insert into emp1 values(3,'TEU','ZZV',1);
INSERT 0 1
postgres=# insert into emp1 values(4,'REU','AZV',2);
INSERT 0 1
postgres=# insert into emp1 values(5,'QREU','WZV',2);
INSERT 0 1
postgres=# insert into emp1 values(6,'DREU','QZV',3);
INSERT 0 1
postgres=# select a.firstname,b.lastname from emp1 a inner join emp1 b on a.emp_id=b.manager_id order by 1 ;
firstname | lastname
------------+------------
ABC | ZZV
ABC | BGV
TEU | QZV
TYU | WZV
TYU | AZV
(5 rows)
postgres=#
With the help of common table expressions (CTE) we can perform parent-child recursive queries:
postgres=# CREATE TABLE recu_pc (
id SERIAL PRIMARY KEY,
name varchar(10) NOT NULL,
parent_id integer );
CREATE TABLE
postgres=# insert into recu_pc values (1, 'Grandmother', NULL);
INSERT 0 1
postgres=# insert into recu_pc values (2, 'mother', 1);
INSERT 0 1
postgres=# insert into recu_pc values (3, 'daughter', 2);
INSERT 0 1
postgres=# WITH RECURSIVE rec_q (id) as
(
SELECT recu_pc.id, recu_pc.name from recu_pc where name='mother'
UNION ALL
SELECT recu_pc.id, recu_pc.name from rec_q, recu_pc where recu_pc.parent_id = rec_q.id
)
SELECT *
FROM rec_q;
id | name
----+----------
2 | mother
3 | daughter
(2 rows)
Using an anonymous block, we can define a variable that can be passed to in a query:
postgres=# do
$$
declare
a int;
begin
select age into a from dummy_table
where name ='XYZ';
raise notice '%',a;
end;
$$;
NOTICE: 25
DO
A prepared statement is used to optimize performance. When the PREPARE statement is executed, it is not only parsed but analyzed too, and when we fire the EXECUTE command the prepared statement is planned and executed.
Prepared statements can accept parameters.
postgres=# prepare test(int) as
select * from dummy_table where age=$1;
PREPARE
postgres=# execute test(50);
name | address | age
------+------------+---------
PQR | location-D | 50
CXC | 1 | 50
(2 rows)
To Identify or select rows that have NULL values, the IS NULL condition can be used in the WHERE clause.
postgres=# select * from dummy_table;
name | address | age
------+------------+-----
XYZ | location-A | 25
ABC | location-B | 35
DEF | location-C | 40
PQR | location-D | 54
PQR | location-D |
(5 rows)
Identifying null values in ‘age’ column:
postgres=# select name from dummy_table where age is null;
name
------
PQR
(1 row)
Exported from Medium on July 13, 2021.


RPC.STATD
Section: Maintenance Commands (8)Updated: 1 November 2009
Index Return to Main Contents
NAME
rpc.statd - NSM service daemonSYNOPSIS
rpc.statd [-dh?FLNvVw] [-H prog] [-n my-name] [-o outgoing-port] [-p listener-port] [-P path ]DESCRIPTION
File locks are not part of persistent file system state. Lock state is thus lost when a host reboots.Network file systems must also detect when lock state is lost because a remote host has rebooted. After an NFS client reboots, an NFS server must release all file locks held by applications that were running on that client. After a server reboots, a client must remind the server of file locks held by applications running on that client.
For NFS version 2 [RFC1094] and NFS version 3 [RFC1813], the Network Status Monitor protocol (or NSM for short) is used to notify NFS peers of reboots. On Linux, two separate user-space components constitute the NSM service:
- rpc.statd
- A daemon that listens for reboot notifications from other hosts, and manages the list of hosts to be notified when the local system reboots
- sm-notify
- A helper program that notifies NFS peers after the local system reboots
The local NFS lock manager alerts its local rpc.statd of each remote peer that should be monitored. When the local system reboots, the sm-notify command notifies the NSM service on monitored peers of the reboot. When a remote reboots, that peer notifies the local rpc.statd, which in turn passes the reboot notification back to the local NFS lock manager.
NSM OPERATION IN DETAIL
The first file locking interaction between an NFS client and server causes the NFS lock managers on both peers to contact their local NSM service to store information about the opposite peer. On Linux, the local lock manager contacts rpc.statd.rpc.statd records information about each monitored NFS peer on persistent storage. This information describes how to contact a remote peer in case the local system reboots, how to recognize which monitored peer is reporting a reboot, and how to notify the local lock manager when a monitored peer indicates it has rebooted.
An NFS client sends a hostname, known as the client's caller_name, in each file lock request. An NFS server can use this hostname to send asynchronous GRANT calls to a client, or to notify the client it has rebooted.
The Linux NFS server can provide the client's caller_name or the client's network address to rpc.statd. For the purposes of the NSM protocol, this name or address is known as the monitored peer's mon_name. In addition, the local lock manager tells rpc.statd what it thinks its own hostname is. For the purposes of the NSM protocol, this hostname is known as my_name.
There is no equivalent interaction between an NFS server and a client to inform the client of the server's caller_name. Therefore NFS clients do not actually know what mon_name an NFS server might use in an SM_NOTIFY request. The Linux NFS client uses the server hostname from the mount command to identify rebooting NFS servers.
Reboot notification
When the local system reboots, the sm-notify command reads the list of monitored peers from persistent storage and sends an SM_NOTIFY request to the NSM service on each listed remote peer. It uses the mon_name string as the destination. To identify which host has rebooted, the sm-notify command sends the my_name string recorded when that remote was monitored. The remote rpc.statd matches incoming SM_NOTIFY requests using this string, or the caller's network address, to one or more peers on its own monitor list.If rpc.statd does not find a peer on its monitor list that matches an incoming SM_NOTIFY request, the notification is not forwarded to the local lock manager. In addition, each peer has its own NSM state number, a 32-bit integer that is bumped after each reboot by the sm-notify command. rpc.statd uses this number to distinguish between actual reboots and replayed notifications.
Part of NFS lock recovery is rediscovering which peers need to be monitored again. The sm-notify command clears the monitor list on persistent storage after each reboot.
OPTIONS
- -d, --no-syslog
- Causes rpc.statd to write log messages on stderr instead of to the system log, if the -F option was also specified.
- -F, --foreground
- Keeps rpc.statd attached to its controlling terminal so that NSM operation can be monitored directly or run under a debugger. If this option is not specified, rpc.statd backgrounds itself soon after it starts.
- -h, -?, --help
- Causes rpc.statd to display usage information on stderr and then exit.
- -H, --ha-callout prog
- Specifies a high availability callout program. If this option is not specified, no callouts are performed. See the High-availability callouts section below for details.
- -L, --no-notify
- Prevents rpc.statd from running the sm-notify command when it starts up, preserving the existing NSM state number and monitor list.
- Note: the sm-notify command contains a check to ensure it runs only once after each system reboot. This prevents spurious reboot notification if rpc.statd restarts without the -L option.
- -n, --name ipaddr | hostname
- Specifies the bind address used for RPC listener sockets. The ipaddr form can be expressed as either an IPv4 or an IPv6 presentation address. If this option is not specified, rpc.statd uses a wildcard address as the transport bind address.
- This string is also passed to the sm-notify command to be used as the source address from which to send reboot notification requests. See sm-notify(8) for details.
- -N
- Causes rpc.statd to run the sm-notify command, and then exit. Since the sm-notify command can also be run directly, this option is deprecated.
- -o, --outgoing-port port
- Specifies the source port number the sm-notify command should use when sending reboot notifications. See sm-notify(8) for details.
- -p, --port port
- Specifies the port number used for RPC listener sockets. If this option is not specified, rpc.statd chooses a random ephemeral port for each listener socket.
- This option can be used to fix the port value of its listeners when SM_NOTIFY requests must traverse a firewall between clients and servers.
- -P, --state-directory-path pathname
- Specifies the pathname of the parent directory where NSM state information resides. If this option is not specified, rpc.statd uses /var/lib/nfs/statd by default.
- After starting, rpc.statd attempts to set its effective UID and GID to the owner and group of this directory.
- -v, -V, --version
- Causes rpc.statd to display version information on stderr and then exit.
SECURITY
The rpc.statd daemon must be started as root to acquire privileges needed to create sockets with privileged source ports, and to access the state information database. Because rpc.statd maintains a long-running network service, however, it drops root privileges as soon as it starts up to reduce the risk of a privilege escalation attack.During normal operation, the effective user ID it chooses is the owner of the state directory. This allows it to continue to access files in that directory after it has dropped its root privileges. To control which user ID rpc.statd chooses, simply use chown(1) to set the owner of the state directory.
You can also protect your rpc.statd listeners using the tcp_wrapper library or iptables(8). To use the tcp_wrapper library, add the hostnames of peers that should be allowed access to /etc/hosts.allow. Use the daemon name statd even if the rpc.statd binary has a different filename. For further information see the tcpd(8) and hosts_access(5) man pages.
ADDITIONAL NOTES
Lock recovery after a reboot is critical to maintaining data integrity and preventing unnecessary application hangs. To help rpc.statd match SM_NOTIFY requests to NLM requests, a number of best practices should be observed, including:- The UTS nodename of your systems should match the DNS names that NFS peers use to contact them
- The UTS nodenames of your systems should always be fully qualified domain names
- The forward and reverse DNS mapping of the UTS nodenames should be consistent
- The hostname the client uses to mount the server should match the server's mon_name in SM_NOTIFY requests it sends
Unmounting an NFS file system does not necessarily stop either the NFS client or server from monitoring each other. Both may continue monitoring each other for a time in case subsequent NFS traffic between the two results in fresh mounts and additional file locking.
On Linux, if the lockd kernel module is unloaded during normal operation, all remote NFS peers are unmonitored. This can happen on an NFS client, for example, if an automounter removes all NFS mount points due to inactivity.
High-availability callouts
rpc.statd can exec a special callout program during processing of successful SM_MON, SM_UNMON, and SM_UNMON_ALL requests. Such a program may be used in High Availability NFS (HA-NFS) environments to track lock state that may need to be migrated after a system reboot.The name of the callout program is specified with the -H option. The program is run with 3 arguments: The first is either add-client or del-client depending on the reason for the callout. The second is the mon_name of the monitored peer. The third is the caller_name of the requesting lock manager.
IPv6 and TI-RPC support
TI-RPC is a pre-requisite for supporting NFS on IPv6. If TI-RPC support is built into rpc.statd, it attempts to start listeners on network transports marked /etc/netconfig. As long as at least one network transport listener starts successfully, rpc.statd will operate.FILES
- /var/lib/nfs/statd/sm
- directory containing monitor list
- /var/lib/nfs/statd/sm.bak
- directory containing notify list
- /var/lib/nfs/statd/state
- NSM state number for this host
- /var/run/run.statd.pid
- pid file
- /etc/netconfig
- network transport capability database
SEE ALSO
sm-notify(8), nfs(5), rpc.nfsd(8), rpcbind(8), tcpd(8), hosts_access(5), iptables(8), netconfig(5)
RFC 1094 - "NFS: Network File System Protocol Specification"
RFC 1813 - "NFS Version 3 Protocol Specification"
OpenGroup Protocols for Interworking: XNFS, Version 3W - Chapter 11
AUTHORS
Jeff Uphoff<EMAIL_ADDRESS>Kirch<EMAIL_ADDRESS>H.J. Lu<EMAIL_ADDRESS>Lon Hohberger<EMAIL_ADDRESS>Paul Clements<EMAIL_ADDRESS>Chuck Lever<EMAIL_ADDRESS>Index
- NAME
- SYNOPSIS
- DESCRIPTION
- NSM OPERATION IN DETAIL
- OPTIONS
- SECURITY
- ADDITIONAL NOTES
- FILES
- SEE ALSO
- AUTHORS
This document was created by man2html, using the manual pages.
Time: 05:34:30 GMT, December 24, 2015


Welcome to myRetail Store
Please login
English
Chinese (Simplified)
Remember me
Login
Invalid credentials !!. Please try again.


PhD. Nicolás Bortolotti
Currently Nicholas Bortolotti works as Developer Relations Program Manager at Google. (South Region). Nicolas has developed academic and research communities in several Latin American countries on the development platform of Google, Web and Mobile. Nicolas has played academically as professor of the National Technological University of Argentina (U.T.N.), to the chairs Software Engineering Object Oriented and Mobile Architectures. He has a passion for software development, and programs to grow and support developer communities.
Ing. Antonio Neto Marin
Neto is a Developer Advocate at Google, based in Sao Paulo/Brazil, with almost 10 years of experience in the industry and 6 specific with mobile and social networks development. His focus areas are Android, Cloud and OpenSocial. Working with software development since 2001, and with mobile applications since 2006, I have expertise on Java platform (Java ME and Java EE), Nokia WRT Widgets, and recently, I'm presenting some sessions and acting as an architect on applications to Google Android and iOS. Also I have experience on managing development teams, acting as technical leader.


Darts results: Gerwyn Price thrashes Gary Anderson at Grand Slam of Darts to set up semi with MVG
by Chris HammerGerwyn Price thrashed Gary Anderson in a rematch of last year's Boylesports Grand Slam of Darts final to set up a last four showdown with Michael van Gerwen.
- Follow @ChrisHammer180 on Twitter
- Click here for Sunday's semi-final predictions
Iceman too hot for Anderson to handle
Gerwyn Price muted the crowd as he ruthlessly ended Gary Anderson's bid to win a maiden Boylesports Grand Slam of Darts title in Wolverhampton.
The only similarities between this eagerly-anticipated showdown and last year's controversial final was that it was between the same players on this very stage and the same winner.
Apart from that there was none of the histrionics, confrontations and booing that made their showdown 12 months ago one of the most talked about in recent times while in terms of the actual result, it wasn't even close as the defending champion cruised to a one-sided 16-9 triumph.
Whereas last year Price had to dig deep with a pumped up performance - to put it mildly - to produce stunning comebacks from 7-4 and 11-8 down, Anderson's attempts to stage a similar response from deficits of 5-0, 8-2 and 13-7 were thwarted as soon as they began.
The Welshman, who was favourite heading into the contest due to a vastly superior season in which he'd won four individual titles compared to Anderson's zero, didn't even need to be at his very best either as he averaged a fairly mediocre 95.64 by his standards compared to his opponent's 91.37.
The damage was done in the opening five legs, as a rusty Flying Scotsman allowed Price to whitewash him in the mini session despite not managing better than a 14-darter - and that stat hadn't even changed by the time the 34-year-old moved 10-6 ahead with a 19-darter.
Eventually Price found a higher gear with 13 and 11-dart legs in the next three while a 109 checkout gave him a 15-9 lead that was soon turned into a one-sided victory.
The defending champion, who also defeated Anderson in their other meeting this year at the US Darts Masters, hit three more 180s with seven and converted 15 of his 37 attempts at doubles as Anderson spurned 21 of his 30.
Next up for Price in the semi-finals is a man he's never beaten in 19 previous attempts - a certain Michael van Gerwen.
Van Gerwen hits the Jackpot
Adrian Lewis' resurgence was stopped firmly in its tracks by yet another formidable display from Michael van Gerwen.
Jackpot was appearing in his first televised quarter-final since 2017 thanks to a morale-boosting run at the Aldersley Leisure Village but his worst performance of the week was severely punished as he slipped to a heavy 16-6 defeat before offering apologetic gestures to the crowd.
Lewis averaged just 86.26 in a match which was billed as a potential blast from the past - and even one which might signal a further stride in the right direction from the two-time world champion - while the current Ally Pally king recorded a mark of 103.05 that would have been much higher had he not missed 29 darts at doubles.
Percentage-wise, the Stoke thrower's finishing was even worse as he spurned 19 of his 25 attempts while he hit four fewer 180s with seven and his highest checkout of 57 was small fry compared to MVG's 132 on the bullseye that completed a 12-darter for a 6-1 lead.
The Dutchman, who is chasing his 14th title of the season and sixth major having also scooped the Masters, Premier League, World Grand Prix, Champions League and World Series of Darts Finals, moved 8-2 ahead with an 11-darter as he threatened an average in excess of 110 only for a mid-game slump - relatively speaking - to bring his numbers down.
The dip was never enough to motivate Lewis into a comeback charge and 10-4 was the closest he'd get before MVG sped away into the last four.
Van Gerwen will start as hot favourite to extend his unbeaten run over Price to a 20th match on Sunday afternoon before taking on either Peter Wright or Glen Durrant in the final.
Click here for Sunday's semi-final predictions
Saturday results & Sunday schedule
Saturday November 16 (7pm)
TV Coverage: Sky Sports
Quarter-finals (Best of 31 legs)
- Gerwyn Price 16-9 Gary Anderson
- Michael van Gerwen 16-6 Adrian Lewis
Sunday November 17
Afternoon Session (1pm)
TV Coverage: Sky Sports
Semi-finals (Best of 31 legs)
- Glen Durrant v Peter Wright
- Michael van Gerwen v Gerwyn Price
Click here for Sunday's semi-final predictions
Evening Session (7pm)
TV Coverage: Sky Sports
Final (Best of 31 legs)
- Winner SF 1 v Winner SF 2


Guidance for determining which modules to use in your application.
Intergrating your Node.js project with Docker is easy.
Deploy easily to a cluster for highly-scalable applications.
Lifecycle reporting and auto-restart for your Node.js application.
Track requests across your distributed micro-services.
Power your metrics and alerting with a leading open-source solution.


cdemi's
30 April 2019 |
.NET |
Redesigning the New Project Dialog (devblogs.microsoft.com) |
| Read about how and why we decided to make one of the most visible interface changes in Visual Studio 2019 – the New Project Dialog.... Read more |
Introducing .NET for Apache® Spark™ Preview (devblogs.microsoft.com) |
| Today at Spark + AI summit we are excited to announce .NET for Apache Spark. Spark is a popular open source distributed processing engine for analytics over large data sets. Spark can be used for processing batches of data, real-time streams,... Read more |
Front End |
JavaScript Detect Async Function (davidwalsh.name) |
| JavaScript async/await has changed the landscape of how we code. We’re no longer stuck in callback or then hell, and our code can feel more “top down” again. Async functions require the following syntax: async function myFunction() { } To use await with a function, the function needs to be declared with async. That got …... Read more |
DevOps |
Airship 1.0 marries Kubernetes and OpenStack for 5G's good (zdnet.com) |
| The open-source Airship project's ultimate goal is to use the best of Kubernetes container orchestration and OpenStack IaaS cloud to enable 5G networking -- and it's just made it first major step forward.... Read more |
Cloud |
Say hi to pay-as-you-go on-prem IT: Dell, VMware tout private cloud-as-a-service, or rentable tech as everyone would call it (theregister.co.uk) |
| If you're getting HPE deja vu, so are we... Read more |
Run your VMware natively on Azure with Azure VMware Solutions (thomasmaurer.ch) |
| Today the Microsoft Azure team announced the Azure VMware Solutions, which allow you to run VMware natively on Azure.  This solution includes vSphere, vCenter, vSAN, NSX-T, and corresponding tools. VMware environment runs natively on Azure... Read more |
Why Kubernetes? Google Cloud Event Follow-up (cloudmark.github.io) |
| This April Google organised the first Google Cloud Event here in Malta. During that event I presented our reasons, as a company, for moving to Kubernetes. Many have reached out after the presentation to discuss further and some suggested publishing our motivations online for reference. So here I am typing away!... Read more |
Security |
Docker Hub Hacked – 190k accounts, GitHub tokens revoked, builds disabled (news.ycombinator.com) |
| "On Thursday, April 25th, 2019, we discovered unauthorized access to a single Hub database storing a subset of non-financial user data. Upon discovery, we acted quickly to intervene and secure the site. We want to update you on what we've learned from our ongoing investigation, including w... Read more |
Password1, Password2, Password3 no more: Microsoft drops password expiration rec (arstechnica.com) |
| For years, Microsoft's baseline security policy has expired passwords after 60 days.... Read more |
eSports |
Blizzard Entertainment Announces Return of Overwatch World Cup (esportsobserver.com) |
| Blizzard Entertainment will host the fourth edition of the Overwatch World Cup this year. The entire tournament will take place in Anaheim, California the week of BlizzCon. In previous years the Group Stage was held in several host countries, with the final stage taking place at BlizzCon. The Overwatch World Cup will return for its...... Read more |
iGaming |
Global Gaming CEO sacked amid Sweden struggles (egr.global) |
| Joacim Möller relieved of leadership duties by board of directors after Swedish operator misses revenue targets... Read more |
NetEnt partners with DraftKings in New Jersey (gamblinginsider.com) |
| NetEnt has signed an online casino supplier agreement with DraftKings in New Jersey, having been awarded a permanent license for the state in February. Operator DraftKings has enjoyed a successful start to...... Read more |
Medical |
Open Source Artificial Pancreases will become the new standard of care for Diabetes in 2019 (hanselman.com) |
| It's 2019 and things are really looking up. The open source DIY diabetes community is thriving. There are SEVERAL open pancreas systems to choose from and there's constant innovation happening with OpenAPS and Loop/LoopKit.... Read more |
|
This newsletter is made with 💖 by cdemi and sponsored by moo Research. You can find this MIT Licensed open-source project on GitHub cdemi/NewsletterCurator. You can also find an archive of all sent newsletters on GitHub at https://newsletters.cdemi.io/. If you want to unsubscribe from this newsletter, please click here. If you're new and you want to subscribe to this newsletter, please click here. |


You cannot enter a team name before you've selected which club it belongs to
This is because we try to match it with the teams the club allready has configured in the Club section
The buttons below will allow you to upload media for your teams performance in that discipline
You will not see any upload button until you have specified a team name, divisions and disciplines.


[t]Inschrijving[/t]
[t]Vul in de onderstaande velden uw persoonlijke contactgegevens en dergelijke in.[/t]
[Question]
[Error]
[Question]
[Error]
[Question]
[DateSelects]
[Error]
[Question]
[Error]
[Question]
[AnswerValue]
[Error]
[Question]
---
[Answer]
[Error]
[Question]
[Answer]
[Error]
[Question]
[Answer]
[Error]
[Question]
[Error]
[Question]
[Error]
[Question]
[DateSelects]
[Error]
[Question]
[Error]
[Question]
[AnswerValue]
[Error]
[Question]
---
[Answer]
[Error]
[Question]
[Answer]
[Error]
[Question]
[Answer]
[Error]


--- layout: trainup title: Data training image: trainup.jpg short: Data-driven storytelling training for people working in the public and private sectors who need to communicate information in an effective and easy-to-understand way ---
Data-driven storytelling training for people working in the public and private sectors who need to communicate information in an effective and easy-to-understand way
{% include social_sharing.html %}Our courses
Why should you enroll?
At TrainUp, we are the only provider in South Africa of two-day data storytelling short courses that are open to the public.
Face to face training with small class sizes
Mindful integration of skills into daily workflows
Theoretical and practical application
Local relevance of practice datasets and data sources
Two main metropoles: Johannesburg and Cape Town
Free online learning support materials
The curriculum is developed from the pool of multidisciplinary knowledge of the OpenUp team, a team of post-corporate lecturers, data wranglers, developers, journalists, information architects and online media specialists, who work and innovate in this field on a daily basis. And data stories using these methodologies by the OpenUp team and alumni have appeared in the following South African publications:
Get in touch
Join our mailing list stay up to date with our upcoming training events, publications and more.
Open learning
Besides our courses, we are proud to also offer open content that teaches you basic data literacy. We've carefully put together this content for those who want to become more comfortable obtaining, using, analysing, and presenting data. You are entirely free to use, share, and adapt it however you like, it's licensed under a Creative Commons Attribution 4.0 International License.
The basic data literacy content is a work in progress which we'll add to as we finish new modules. Let us know if you want to be notified when a new module is available.
Latest news
{{ article.short }}
We're published
A small selection of stories from the Data Journalism Academy and the OpenUp newsroom. We'll be updating this regularly with new and past publications.
FAQ
They are aimed at anyone who uses data to communicate insights to stakeholders. We have trained journalists, civil society organisations, and governments. If you're not sure if / how you can benefit from our courses don't hesitate to ask.
Our courses are R2,300 per person per day. A 50% deposit is required on registration, the balance being due before training commences. Registered non-profit organisations get a 10% discount. For large organisations interested in tailor-made courses, please get in touch.
Our upcoming courses will be added to our event calendar, announced via our OpenUp social media accounts (Twitter, Facebook), on our TrainUp page as well as via email. If you would like to be notified via email, sign-up to join our mailing list.
Training venues for Open Intakes will be sourced in various major cities where greater interest is expressed. These venues will be communicated in advance via social, traditional media as well as on our web page.
Our courses run for between one and two days, depending on the required modules. If you want a course specifically tailored to your needs get in touch with us.
Participants need access to their own laptop, an activated Google account, and access to the Google Chrome browser. More specific requirements can be found on the individual course pages.
A 10% discount is available for NPOs on all courses. Travel subsidies are unfortunately not available.
Yes. More specifically, our courses are shaped around data processing for storytelling, which we believe to be the most effective way at conveying data-rich information.
Our courses run for a minimum of 8 and a maximum of 15 learners. We require a minimum number of participants to be cost effective and a maximum to ensure we can dedicate enough time and attention to each participant.
We compile modules for internal training for organisations based on a consultative process to ensure that we cover content suitable for the organisation's needs. We also provide the option to shape curriculum for internal training around an organisation's own data, to ensure the relevant skills transfer.
TrainUp consists of two main endeavours:
Firstly, through our Codebridge grant we fund data literacy training for identified segments of the population i.e. youth, school children, or those who are unable to afford commercial training opportunities.
We are publishing tutorials and content on basic data literacy knowledge and skills, as well as open software usage, for free. Additionally, our material is shared with the School of Data, with whom we collaborate on curriculum development.
Secondly, TrainUp courses are facilitated at commercial rates as a profit stream that contributes to the sustainability of our organisation and in support of our other projects. Our TrainUp curriculum will equip learners with the skills our team has acquired through the practise and teaching of this material, as it relates to the Data Processing Pipeline.
An understanding of data and its potential is needed to make effective use of it. TrainUp aims to create storytellers who know how to use data effectively and empower society so they understand this data in order to drive social change.
Data by itself is dry, impersonal, and distant. Our experience with civil society organisations, governments, and news organisations has taught us the power of storytelling, and we believe it to be the best way to impart information. Our courses are designed to help you find and create compelling stories from data so you can most effectively communicate with your stakeholders.
Get in touch
Join our mailing list stay up to date with our upcoming training events, publications and more.


--- title: Hello World! author: Kishimoto Mariko date: '2019-09-07' slug: hello-world categories: [] tags: [] subtitle: '' summary: 'Welcome to my new website!' authors: [] lastmod: '2019-09-07T00:46:34+09:00' featured: no image: caption: '' focal_point: '' preview_only: no projects: [] draft: no ---
Hello Everyone,
This is Mariko from Japan, and welcome You to my very new website which I created with Blogdown.
I will post how I learn statistics and genomics using R and other tools. I will also post my participations in TidyTuesday!
iris %>%
ggplot(aes(Sepal.Length, Sepal.Width, color = Species)) +
geom_point() +
theme_minimal() +
scale_colour_ghibli_d("LaputaMedium", direction = -1)


This a test page for find-in-page with two embedded PDFs. This page should contain 13 matches total for "result".
result
result


Noel Gallagher wants to play guitar in the The Smiths if they ever reunite
by Rob LaingNoel Gallagher wants to play guitar in the The Smiths if they ever reunite
It's safe to say fellow mancunians / indie royalty Noel Gallagher and Johnny Marr and good friends – the latter even gave the former a couple of his Smiths-era guitars in the past, but Noel dreams of taking the bromance further if that band ever reunite.
“I would love to be in a band and just be a guitarist for a while,” Noel admitted to Zane Lowe on his Beats 1 show while promoting new single Wandering Star from forthcoming third EP Blue Moon Rising.
“Not that band [Oasis]," Noel added, "but sometimes when I sit in with [Paul] Weller I just think ‘thank god for that’.”
When asked by Lowe which band he would join in an ideal world, Noel revealed that a reunited Smiths would be his dream scenario.
“I would love, and it’s never gonna happen, it’s a thing in a parallel universe, if The Smiths got back together.
The likelihood of a Smith reunion is at an all-time low of late as principal songwriter Marr and Morrissey move ever further away ideologically. Marr revealed in his 2016 autobiography Set The Boy Free that it had only ever been a "very real prospect" briefly back in 2008.
While working on remastering the Smiths’ catalog that year, he met up with Morrissey for the first time in 10 years at a Manchester pub where they reminisced for hours and “suddenly we were talking about the possibility of the band re-forming,” Marr wrote. “And that moment it seemed that with the right intention it could actually be done and might even be great.”
"For four days it was a very real prospect. We would have to get someone new on drums, but if the Smiths wanted to reform it would make a hell of a lot of people very happy, and with all our experience we might even be better than before."
But it wasn't to be.
“Morrissey and I continued our dialogue and planned to meet up again,” Marr continued in the book. “I went to Mexico with the Cribs, and then suddenly there was radio silence. Our communication ended, and things went back to how they were and how I expect they always will be.”
Noel Gallagher's High Flying Birds' Blue Moon EP will be released on March 6 2020


Class Router
Simple Router to create routes
Methods summary
public
|
|
public
|
#
route( string $route, string $method, callable $routeFunction )
Routes a request to specific endpoint and extracts variables
Routes a request to specific endpoint and extracts variables
A route must begin with '/'.
The order of the parameters of the route and the parameters of the routeFunction
should be the same.
The order of routes must be in a order like:
- /recipe/ - /recipe/create (e.g. default data and id as response) - /recipe/create/<name> (specific name for creation and id as response) - /recipe/<id> - /recipe/<id>/export - /recipe/<id>/<someVar>
Parameters
- $route
- $method
- $routeFunction
Throws
InvalidArgumentException if $routeFunction is not a callable
|
public
|
#
run( )
Do possible last steps in the script related to the Router
Do possible last steps in the script related to the Router
Throw
\RuntimeException if no API endpoint was called
|


--- layout: post title: "My new color theme (Zenburn based) for Emacs exu-theme.el" description: "" comments: true category: editor tags: [emacs, color, theme] --- {% include JB/setup %}
{% include JB/setup %}
In my office i have very big windows and after 1PM brightness is killing my ability to see letters in my previous emacs setup with Zenburn colortheme.
It's good to see shiny day but my low contrast Zenburn Theme is too bright and I often don't see elements with lower contrast.
You can grab it from my emacs github repository (if You are using Emacs 24 simply put it into `~/.emacs.d/themes` directory and add lines below into your `~/.emacs.d/init.el` file to load this theme
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
(load-theme 'exu t)


Perry
This page contains an index of all the individuals in the database with the surname of Perry. Selecting the person’s name will take you to that person’s individual page.
| Given Name | Birth | Death | Partner | Parents |
|---|---|---|---|---|
| Carrie Couch “Rae” | 1898 | 1989-08-17 | Perry, John William Perry, Louisa Michell nee Rowe | |
| Elvina G. | 1893 | 1894 | Perry, John William Perry, Louisa Michell nee Rowe | |
| Frank L. | 1889 | 1889 | Perry, John William Perry, Louisa Michell nee Rowe | |
| Hope Hopetoun | 1901 | 1971-12-07 | King, Leonard Charles | Perry, John William Perry, Louisa Michell nee Rowe |
| Jack Lionel | 1902 | 1996-11-11 | Cooper, Joyce May | Perry, John William Perry, Louisa Michell nee Rowe |
| John & Emily | 1833/1835 | |||
| John William | 1864 | 1910-04-20 | Perry, Louisa Michell nee Rowe | Perry, John & Emily |
| John William D. | 1888 | 1889 | Perry, John William Perry, Louisa Michell nee Rowe | |
| Louisa Michell, nee Rowe | 1862, 2nd Qtr | 1934-06-15 | Perry, John William, Bongers, Hendrick John (Compositor) | Rowe, William (Mechanical Engineer) Michell, Carrie Couch |
| Peter Whitney | c1926 | 1992-08-01 | Henderson, Marie Patricia | |
| Rebecca | Irish, John | |||
| Reginald William | c 1925 | 2004-07-18 | Watts, [Living] | |
| Stanley Llewellyn | 1890 | 1979-05-02 | Evans, Mary Elizabeth | Perry, John William Perry, Louisa Michell nee Rowe |
| Susanna | 1788 | 1865-07-00 | Irish, John | |
| Susanna | 1789 | 1865 | Irish, John | |
| Theophilus William | 1895 | 1918-04-05 | Perry, John William Perry, Louisa Michell nee Rowe | |
| Victor George | Warbrick, Cecelia F. | |||
| [Living] | Mercer, [Living] | |||
| [Living] | Wiltshire, [Living] | |||
| [Living] | Perry, [Living] Wiltshire, [Living] | |||
| [Living] | Perry, [Living] Wiltshire, [Living] | |||
| [Living] | Perry, [Living] Wiltshire, [Living] | |||
| [Living] | Dixon, [Living] | |||
| [Living] | Padovan, [Living] | Perry, [Living] Dixon, [Living] | ||
| [Living] | Perry, [Living] Dixon, [Living] | |||
| [Living] | Perry, Stanley Llewellyn Evans, Mary Elizabeth | |||
| [Living] | Perry, Peter Whitney Henderson, Marie Patricia | |||
| [Living] | Perry, Peter Whitney Henderson, Marie Patricia | |||
| [Living] | Perry, Peter Whitney Henderson, Marie Patricia | |||
| [Living] | Perry, Peter Whitney Henderson, Marie Patricia | |||
| [Living] | Perry, Reginald William Watts, [Living] | |||
| [Living] | Perry, Reginald William Watts, [Living] | |||
| [Living] | Perry, Reginald William Watts, [Living] | |||
| [Living] | Perry, Reginald William Watts, [Living] | |||
| [Living] | Perry, Reginald William Watts, [Living] |


GPlus Tweet Options
Your configuration has been successfully saved!
However, some of your changes require the extension to be restarted. Would you like to do it now?

Remaining Twitter API Hits:
Rate Limit Reset:
API Hits stats (for nerds)


To run these tests go to project root and type: node TestRunner.js
if that doesn't work, open this file in Chrome, press F12, and look at the network page.


Roll-ups are a way to improve query performance by aggregating or rolling up data into a larger time range such as averaging millisecond data over a minute. Roll-ups perform queries on existing data, aggregate the data, and write the results to another metric. The original data is left intact.  Roll-ups are scheduled by creating a roll-up task. A task contains one or more roll-ups and an execution interval (how often the task is executed). A roll-up is a query (see QueryMetrics) and the name of a new metric where it will be saved (save_as).
A roll-up task is executed on a schedule to create one or more roll-ups.
POST
{
"name": "MyRollup",
"execution_interval": {
"value": 1,
"unit": "hours"
},
"rollups": [{
"save_as": "kairosdb.http.query_time_rollup",
"query": {
"cache_time": 0,
"start_relative": {
"value": "1",
"unit": "hours"
},
"metrics": [{
"name": "kairosdb.http.query_time",
"limit": 10000,
"tags": {
"host": ["foo", "bar"],
"customer": ["foobar"]
},
"aggregators": [{
"name": "sum",
"sampling": {
"value": 1,
"unit": "minutes"
}
}, {
"name": "avg",
"sampling": {
"value": 10,
"unit": "minutes"
}
}]
}]
}
}]
}
name The name of the roll-up task.
execution_interval When the roll-up task is exected specified as value and unit. Possible unit values are “milliseconds”, “seconds”, “minutes”, “hours”, “days”, “weeks”, “months”, and “years”.
rollups An array of roll-ups. A roll-up consists of
Success
The response contains either the metric resource created. Returns 200 when successful.
{ "id": "7b2893fc-7654-4764-851a-a311e854ee75", "name": "MyRollupTaskName", "attributes": { "url": "/api/v1/rollups/7b2893fc-7654-4764-851a-a311e854ee75" } }
Failure
The response will be 400 Bad Request if the request is invalid.
The response will be 500 Internal Server Error if an error occurs retrieving data.
{ "errors": [ "metrics[0].aggregate must be one of MIN,SUM,MAX,AVG,DEV", "metrics[0].sampling.unit must be one of SECONDS,MINUTES,HOURS,DAYS,WEEKS,YEARS" ] }
Lists all defined roll-up tasks.
GET
None
Success
The response contains a list of roll-up tasks. Returns 200 for success.
[{ "id": "ce55e623-0610-4451-a725-3daee896afd9", "name": "MyRollup", "execution_interval": { "value": 1, "unit": "hours" }, "rollups": [{ "save_as": "kairosdb.http.query_time_rollup", "query": { "cache_time": 0, "start_relative": { "value": "1", "unit": "hours" }, "metrics": [{ "name": "kairosdb.http.query_time", "limit": 10000, "tags": { "host": ["foo", "bar"], "customer": ["foobar"] }, "aggregators": [{ "name": "sum", "sampling": { "value": 1, "unit": "minutes" } }, { "name": "avg", "sampling": { "value": 10, "unit": "minutes" } }] }] } }] }]
Failure
The response will be 500 Internal Server Error if an error occurs retrieving data.
Returns the roll-up task by Id.
GET
None
Success
The response contains the roll-up for the given id. Returns 200 for success.
{ "id": "ce55e623-0610-4451-a725-3daee896afd9", "name": "MyRollup", "execution_interval": { "value": 1, "unit": "hours" }, "rollups": [{ "save_as": "kairosdb.http.query_time_rollup", "query": { "cache_time": 0, "start_relative": { "value": "1", "unit": "hours" }, "metrics": [{ "name": "kairosdb.http.query_time", "limit": 10000, "tags": { "host": ["foo", "bar"], "customer": ["foobar"] }, "aggregators": [{ "name": "sum", "sampling": { "value": 1, "unit": "minutes" } }, { "name": "avg", "sampling": { "value": 10, "unit": "minutes" } }] }] } }] }
Failure
The response will be 404 if the roll-up resource specified does not exist.
The response will be 500 Internal Server Error if an error occurs retrieving data.
Deletes the roll-up task specified for the given Id.
DELETE
None
Success
No data is returned. Returns 204 if the task was successfully deleted.
Failure
The response will be 404 if the roll-up resource specified does not exist.
The response will be 500 Internal Server Error if an error occurs retrieving data.
Updates the roll-up task specified by the Id.
PUT
{ "name": "MyRollup", "execution_interval": { "value": 1, "unit": "hours" }, "rollups": [{ "save_as": "kairosdb.http.query_time_rollup", "query": { "cache_time": 0, "start_relative": { "value": "1", "unit": "hours" }, "metrics": [{ "name": "kairosdb.http.query_time", "limit": 10000, "tags": { "host": ["foo", "bar"], "customer": ["foobar"] }, "aggregators": [{ "name": "sum", "sampling": { "value": 1, "unit": "minutes" } }, { "name": "avg", "sampling": { "value": 10, "unit": "minutes" } }] }] } }] }
Success
The response contains the roll-up for the given id. Returns 200 for success.
{ "id": "ce55e623-0610-4451-a725-3daee896afd9", "name": "MyRollup", "execution_interval": { "value": 1, "unit": "hours" }, "rollups": [{ "save_as": "kairosdb.http.query_time_rollup", "query": { "cache_time": 0, "start_relative": { "value": "1", "unit": "hours" }, "metrics": [{ "name": "kairosdb.http.query_time", "limit": 10000, "tags": { "host": ["foo", "bar"], "customer": ["foobar"] }, "aggregators": [{ "name": "sum", "sampling": { "value": 1, "unit": "minutes" } }, { "name": "avg", "sampling": { "value": 10, "unit": "minutes" } }] }] } }] }
Failure
The response will be 400 Bad Request if the request is invalid.
The response will be 404 if the roll-up resource specified does not exist.
The response will be 500 Internal Server Error if an error occurs retrieving data.


Ferrari To Launch Fewer Cars Next Year After A Busy 2019
Five new Ferrari models in one year is a win.
by Anthony AlanizFor Ferrari fans, 2019 has been a great year. Not only has the Italian supercar maker debuted five new models, but it has also pranced out a handful of one-offs, too. However, while Ferrari’s plant to launch 15 new models in five years is well underway, 2020 will be a quieter year for the automaker. In an interview with Autocar, Ferrari commercial chief Enrico Galliera said the company would focus on selling its newest models in 2020.
Here Are The New Models Ferrari Introduced This Year:
Galliera said that some of Ferrari’s new models are in new segments, and the company will work to inform its clients and its network about how those new offerings fall within Ferrari’s lineup. Ferrari will be “focused on creating the success of the models we’ve introduced in 2019.” That doesn’t mean we won’t see any new Ferraris next year; however, 2020 won’t see the same number of reveals.
Ferrari kicked off 2019 with the F8 Tributo in March. It came with Ferrari’s most powerful V8 engine ever at the time – the twin-turbo 3.9-liter V8 making 720 horsepower (536 kilowatts) and 568 pound-feet (770 Newton-meters) of torque. In May, Ferrari introduced the SF90 Stradale, a 986-hp (707-kW) hybrid. The Stradale’s also introduced Ferrari’s most powerful V8 engine, the turbocharged 4.0-liter making 769 hp (573 kW).
Gallery: Ferrari Roma
September saw Ferrari introduce two convertibles – the F8 Spider and 812 GTS. Ferrari closed the year earlier this week with the Roma, a unique Ferrari with a minimalistic design that harkens back to models such as the Ferrari 250 GT Berlinetta Lusso and Ferrari 250 GT 2+2.
That’s a jammed-pack year of new cars, but Ferrari has 10 more models to introduce, including its first SUV, called Purosangue, by the end of 2022. It’s unlikely we’ll see five new Ferrari models introduced within the same year, but with 10 more debuts coming, maybe we’ll get lucky.
Source: Autocar


We are gathering the data to provide insights! Coming soon ...
0 && apiLinkAccess?.courseAnalytics" class="mt-4">
Unique Users
{{uniqueUsers}}
0 && apiLinkAccess?.courseAnalyticsClient" class="mt-4">
0">
How many unique users visited the contents of this page on each day?
0"
(clickEvent)="onClick($event)" [title]="'Views'" [category3]="'Device-wise'" [category1]="'Job Profile-wise'"
[category2]="'Country-wise'" [uniqueUsers]="hits" [description]="hitsDescription"
[analyticsDataClient]="analyticsDataClient">
0">
How many views were recorded for the contents of this page on each day? A
view is recorded every time a user accesses a content
0" class="flex flex-around m-3 flex-wrapped" id="departments">
Users by
Job Profiles
This chart displays # of unique users by job profiles
Views by
Job Profiles
This chart displays # of views by job profiles
0" class="flex flex-around m-3 flex-wrapped" id="countries">
Users by
Countries
This chart displays # of unique users by countries
Views by
Countries
This chart displays # of views by countries
0" class="flex flex-around m-3 flex-wrapped" id="devices">
Users by
Devices
This chart displays # of unique users from device type
Views by
Devices
This chart displays # of views by device type


About Deep Blue Consultants
We specialise in helping our clients achieve the seemingly impossible.
About Us
Deep Blue Consultants is an independant consulting firm. We provide services to a diverse clientele in the transportation, consumer products, construction, materials, financial services, Internet services, manufacturing, petrochemical and waste management industries, as well as government and other public sectors.
Our chosen field of services includes the most difficult issues that challenge society today. These challenges require solutions that will stand the test of time. Our solutions must recognize the social, economic and environmental implications and balance among these. Recognizing these challenges, we are committed to deliver services and solutions that are the product of the best collaboration of all appropriate resources and expertise of the firm.
Level of expertise
At Deep Blue Consultants we are committed to providing our customers with a reliable, consistent, cost effective and environmentally friendly waste management service. Our motto "bins collected on time, every time" is at the heart of our business. We pride ourselves on our reliable collection service and we are committed to this level of service.
Read more about RECYCLING.First-class customer service
We aim to offer a first class service to our customers and best value for money. We are committed to promoting sustainability by reducing the volume of waste going to landfill, and our goal is to dispose zero waste to landfill.
Our focus is centred around recycling and composting and by placing this at the heart of our business, we are leading the way to reduce the carbon footprint of both our company and customers.
Location
Our head office is located in Mayor Street, IFSC, Dublin and boasts a 9 acre facility, 7.5 acres of which is under roof. The site is designed to manage the ever increasing volumes of recyclable and compostable material being produced in Ireland. Our EPA licensed facility is currently the largest waste transfer station in Ireland and handles waste from all over the country.
If you have any questions please contact us - our experts will be happy to schedule an appointment with you.
Situational Assessments
We investigate particular sets of circumstances existing within a specific environment i.e. a bottling factory. It is our task to find out how at how they can be improved in terms of energy efficiency, waste and water resource management. We then identify what can be done to conserve resources, cut waste and pollution and increase efficiency. Solutions can then be put in place by making use of appropriate technologies including Artificial Intelligence (AI) and staff training.
Technology Solutions
We pay great attention to utilising the latest available technologies, including AI. These are utilised in every event where it is clear that costs and overheads can be reduced and production intensified. Over the past eight years, we have brought together global expertise in order to provide unique solutions to even the most challenging of projects.
Training and Capacity building
All staff, including management, are assessed and a specific training plan put in place. This is engineered to increase capacity, improve production and generally ensure that resources are used to the best of their ability. By making use of capacity training, we are able to run workshops to deal with specific technical and operational topics such as agriculture, aquaculture, sustainable energy, water and waste management. This can be done both on location and online.


About the solution for Justin:
I came real close to Justin's example by recreating a working solution using a "blind" effect animation. The two images I am using contain multiple thumbnail images as tiles and placed on a grid. I am required to use the IMG tag for the images and not use the CSS background-image style property. The incoming (new) image is reveal from right to left by creating a "viewport" (e.g. CSS sprite) container and then increasing the width with style set to "right:0". But, there is a problem when using HTML, the image still have a "slide" effect. The nature of HTML and the IMG tag, it is resolved by using another container called "inner" to be wrapped around between the image and "viewport" container. All the containers need to have the style set to "position:absolute".
The next animation is what I called a "fade wave" effect. From your example I remember, there is a white flash before the new image is reveal from right to left. To replicate that effect as close as possible, I created another set of containers called "overlay" using with same first (old) image. Then, I use the "blind" effect animation in a different direction, from left to right, by decreasing the width.
The last set of animations are using "opacity" style property on the first (old) image and the incoming (new) image containers while synchronizing before and after the motion of the "fade wave" effect.


Modern Web Design at an Affordable Price
WebsiteAll the basics to get your website up and running... |
Web AppFor those who want to go above and beyond... |
|
|---|---|---|
| Price | $69/month | $99/month |
| Initial Build | A completely hand-made website created just to your liking. |
A completely hand-made web app created just to your liking. |
| Changes | Unlimited website changes done at any time. Just let me know what you want changed! |
Unlimited website changes done at any time. Just let me know what you want changed! |
| Hosting | ~50,000 Page Views/month* | ~250,000 Page Views/month* |
| Domain ? | 1 Included | Up to 3 Included |
| Email At Your Domain ? | Included | Included |
| File Storage ? | Unlimited | Unlimited |
| SSL (Green "Secure" Lock) ? | Included | Included |
| Real-Time Analytics | Included | Included |
| Forms | Included | Included |
| Blog | Included | Included |
| Newsletter ? | Included (MailChimp Watermark) | Included |
| Site Memeberships ? | Not Included | Included |
| Dynamic Content Generation ? | Not Included | Included |
| Full Backend Server Control ? | Not Included | Included |
| Get Started | Get Started |
Have some questions? Check out the FAQ.
Already have a website? I can redesign or make modifications for $30/hour. Contact Me to get started.
Hi. My name is Joshua Franklin, and I am currently studying Computer Science at the University of Colorado at Boulder. In my free time, I design websites and create other music, videos, and software I think are worth sharing.
These beautiful, responsive, and interactive websites I make come at a very low cost. Having lots of experience in web development, I can make anything from a static web page, to online forms, blogs, stores, and more.
My interest in computers has lasted throughout all my life. I have been coding computers for many years, and recently I have been putting these skills into web development.
I have lots of experience with WordPress, Firebase, GoDaddy's Website Editor, Wix Website Editor, HTML, CSS, JavaScript, jQuery, Flask, and Socket-IO, allowing me to make advanced and interactive websites.


Enter your rtsp link to the stream, for example: "rtsp://<IP_ADDRESS>:554/h264"
Change buffer duration
Have any suggestions to improve our player?
Feel free to leave comments or ideas email<EMAIL_ADDRESS>View HTML5 RTSP video player log
With an empty license file, you can only watch the stream on your computer locally (intranet).
If you would like to stream into the global network please take a key to activate the license.
You have personal 1 month validity key in the personal cabinet.
To activate key, please, use the activation application that is placed:
Windows: C:\Program Files\Streamedian\WS RTSP Proxy Server\activation_app
Mac OS: /Library/Application Support/Streamedian/WS RTSP Proxy Server/activation_app
Linux (Ubunty, Debian, Centos, Fedora ): /usr/bin/wsp/activation_app
For more information go to documentation


IHeartPy!
♥The lovable Python Instructor♥
{{ quotation }} -
{{ quotation_author }}
[^]
This is to certify that
'{{awardee}}'
is now officially a Python
{{award}}!
+
f
t
h


Links targeting the entire page
My message title
My message content
Edit this message
Edit in Full Screen
One comment
Two comments


R/parts_of_speech.R
parts_of_speech.Rd
Parts of speech for English words from the Moby Project by Grady Ward. Words with non-ASCII characters and items with a space have been removed.
parts_of_speech
A data frame with 205,985 rows and 2 variables:
An English word
The part of speech of the word. One of 13 options, such as "Noun", "Adverb", "Adjective"
https://archive.org/details/mobypartofspeech03203gut
Another dataset of English parts of speech, available only for non-commercial use, is available as part of SUBTLEXus at https://www.ugent.be/pp/experimentele-psychologie/en/research/documents/subtlexus/.
#> # A tibble: 208,259 x 2 #> word pos #> <chr> <chr> #> 1 3-d Adjective #> 2 3-d Noun #> 3 4-f Noun #> 4 4-h'er Noun #> 5 4-h Adjective #> 6 a' Adjective #> 7 a-1 Noun #> 8 a-axis Noun #> 9 a-bomb Noun #> 10 a-frame Noun #> # … with 208,249 more rows#> # A tibble: 14 x 2 #> pos n #> <chr> <int> #> 1 Noun 104542 #> 2 Adjective 47719 #> 3 Verb (transitive) 15723 #> 4 Adverb 13234 #> 5 Verb (usu participle) 11402 #> 6 Plural 7764 #> 7 Verb (intransitive) 4626 #> 8 NA 2274 #> 9 Interjection 395 #> 10 Preposition 159 #> 11 Noun Phrase 115 #> 12 Pronoun 113 #> 13 Definite Article 103 #> 14 Conjunction 90


| Map | Games Played | Insurgent Win | Security Win | Average Time | Rating System Performance | ||
|---|---|---|---|---|---|---|---|
| {{ m.mapName }} | {{ m.totalGames }} | {{ '%0.2f' | format(m.insurgentWinPercent) }}% | {{ '%0.2f' | format(m.securityWinPercent) }}% | {{ m.averageTime }} | {% if m.ratingSystemDeviation == 0 or m.predictionCorrectPercentage == 0%}N/A | {% elif m.ratingSystemDeviation >= 0 %}+{{ '%0.2f' | format(m.ratingSystemDeviation) }}% ({{ m.predictionCorrectPercentage }}% Correct) | {% else %}{{ '%0.2f' | format(m.ratingSystemDeviation) }}% ({{ m.predictionCorrectPercentage }}% Correct) | {% endif %}
*Map Tracking was only implemented recently, that is why there are many rounds without a recorded mapname.


public member function
<locale>
result unshift (state_type& state,
extern_type* to, extern_type* to_limit, extern_type*& to_next) const;
Unshift translation state
Writes into to the sequence of character needed to unshift the state of state.
During a character encoding translation (such as the one initiated by codecvt::out), the state may have been shifted to some state other than the state by default, notably when the destination range could not absorb all the characters produced by the translation. By calling this function with additional storage, the remainder of the sequence needed to return the shift state to its default state is written to to (taking up to to_limit).
When the function returns, to_next points to one beyond the last element successfully written.
During its operation, this function simply calls the virtual protected member codecvt::do_unshift, which is the member function in charge of performing the actions described above.
Internally, this function simply calls the virtual protected member do_unshift, which behaves as described above by default.
Parameters
- state
- A state object, as required by the facet instantiation.
Typically, this is an object of type mbstate_t with its state shifted to some value other than its default value (by a call to codecvt::out).
Member type state_type is the facet's state type (defined as an alias of codecvt's third template parameter, stateT).
- to, to_limit
- Pointer to the initial and final characters of the destination sequence. The range used is, at most,
[to,to_limit)
, which contains all the characters between to and to_limit, including the character pointed by to but not the character pointed by to_limit.
An unshift operation does not necessarily need to fill up the range to its limit, and may also exhaust it before finishing.
Member type extern_type is the facet's external character type (defined as an alias of codecvt's second template parameter, externT).
- to_next
- Pointer able to point to an element in the above range. Once the function returns, this object points to the element in the destination range beyond the last one written.
Return value
A value of type codecvt_base::result, with the following possible values:
| member constant | int value | result |
| ok | 0 | Conversion successful: all characters needed to unshift the state were successfully wirtten. |
| partial | 1 | Partial conversion: the destination sequence [to,to_limit) is not long enough.
The range [to,to_limit) has been filled with the partial result. The function may be called again with additional storage to obtain more unshift characters. |
| error | 2 | Conversion error: Some unspecified error occurred, such as state in an invalid state. |
| noconv | 3 | No conversion: The current state of state does not need to be unshifted. |
Data races
The facet object is accessed.
The arguments state and to_next, along with up to all the characters in the range [to,to_limit)
are modified.
Exception safety
If an exception is thrown, there are no changes in the facet object, although characters in the destination range and to_next may have been affected.
See also
- codecvt::out
- Translate out characters (public member function
)
- codecvt::do_unshift
- Unshift translation state [virtual] (protected virtual member function
)


Over at The New Psalmanazar, Ian Woolcott remarks: “If my cat were to write a book I think it would read something like Mein Kampf.”Â He describes his cat as a wicked, embittered creature, which is almost certainly true of all cats, whose saving grace is their unfathomable stupidity. It is this combination of characteristics which makes them so engaging, unlike dogs. As we have seen, dogs are boring.
We can adduce further evidence of cats' fundamental malevolence from Nerea De Clifford. In her study What British Cats Think About Television, she wrote: “Most cats show an interest of some kind, though it is often of hostility… a significant reaction is the display of excitement when any picture, especially of birds, moves quickly across the screen.” (Previously quoted in the Archives, March 2004.)
Here is a photograph of Nerea De Clifford, described by the Cats Protection League as “a popular and gracious lady”.


Connecting remarkable humans to extraordinary organizations with one goal in mind, to help those beyond ourselves. Beyond Us brings forth real world issues that require your help today.
Our Mission
Climate change,
Women's rights, poverty, animals rights, and more. These issues we
face are affecting people around the world and future generations
to come if we don't start to make a change. Our platform provides
access to hundreds of non-profits and volunteer organizations in
defense of the greater good. Together we can make waves that can
impact lives and change the world.
How to Help
Donate. Volunteer.
Spread awareness. Be informed. There are many ways to help whether
it is big or small. You're making a difference in the world and
someone's life.
Sign up and join everyday heroes around the world to keep up with
what is happening on our planet and how we can help combat and
protect the future. You will gain access to our feed filled with
trending topics that need your help today. Access non-profits and
see where you can make a difference.
Today is a good day to start making a postive impact on
lives that needs a helping hand and a world that needs us to save.
Together we can.
Fill out the form below:


Page 1 of 1
LARGE storage bug
Posted:
Thu May 14, 2009 9:59 am
by Forlorn
TOday I made a noob mage and I had no idea that storage was shared on accounts lol ... so i transfered him a bunch of gear to use, and at level 11 i went on my main and gave my mage a boars mace to see any new spells next lvl... I thought hmm nothin i better keep this in my mages storage for next lvl and then I went to stor and realized that it was shared... what I also realized was that the 10 or more items above the mace in storage had vanished since i pulled it out...
unfortuneantly for me most of these items were of considerable use to both of my characters... I am pretty frustrated.
Re: LARGE storage bug
Posted:
Thu May 14, 2009 3:31 pm
by Karl G.
1: have you logged in & out and confirmed items are gone? Is your scroll bar all the way at the top?
2: Did this happen when the server crashed?
3: Give exact steps for what happened. I.e. Log on "Character Name". Open storage. Has 20 or so items in it. Remove first 10 items in storage. Drop on ground. Log off "Character Name". Log on.... etc.
This will help me look for the bug.
Re: LARGE storage bug
Posted:
Fri May 15, 2009 6:16 pm
by Forlorn
Karl I literally took an item out of storage (it was halfway down my item list of mayb 25 items) and then i logged on my alt and checked storage and EVERYTHING above that item went poof! It has not happend again, but it makes me apprehensive about how i store items.
Re: LARGE storage bug
Posted:
Sat May 16, 2009 10:29 am
by Karl G.
Yeah I understand. It's on my to-do list to write some unit tests for the storage to make sure everything's ok.


Welcome to the First Marist Progressive Web App
this is a template for starting a progressive web application


The virtual machine is Ubuntu with the following packages, and all of their dependencies, installed. Updates to the VM will be made available via a bash script.


GRAPHIGNIS
About
Services
Contact
Portfolio
Blog
Other Pages
Facebook
Twitter
Instagram
Packages
Packages
Home
Pricing
Logo design
Starting at $15.00
*Unlimited revisions for all packages
BASIC PACKAGE:
1 Logo | Standard Quality | JPG | Delivery time: 2 days.
STANDARD PACKAGE:
1 Logo | High Quality | JPG, PNG | 1 presentation card + 1 letterhead | Delivery time: 3 days.
PREMIUM PACKAGE:
3 Logo Variations | JPG, PNG, EPS, AI | 1 letterhead + 1 presentation card + 2 facebook covers | Delivery time: 6 days.
Logo Design
BASIC PACKAGE $15.00 USD
STANDARD PACKAGE $50.00 USD
PREMIUM PACKAGE $150.00 USD
Social Media Kit
Starting at $30.00
*Unlimited Revisions for all packages
BASIC PACKAGE:
Design of post template on Photoshop | Creation of 2 Facebook posts | JPG | Standard resolution | Delivery time: 2 days.
STANDARD PACKAGE:
Design of post template on Photoshop | Creation of 5 Facebook posts | JPG + PNG | High Resolution | Delivery time: 4 days.
PREMIUM PACKAGE:
Design of post template on Photoshop | Creation of 10 Facebook posts + 1 Facebook Cover | JPG + PNG + Source File | Delivery time: 7 days.
Social Media Kit
BASIC PACKAGE $30.00 USD
STANDARD PACKAGE $60.00 USD
PREMIUM PACKAGE $130.00 USD
Photo Editing
Starting at $5.00
*Unlimited revisions for all packages
BASIC PACKAGE:
Edit, crop, rotate and resize 1 simple photo | JPG | Low resolution | Delivery time: 2 days.
STANDARD PACKAGE:
Edit, crop, retouch and resize two 2 photos | JPG, PNG | Standard resolution | Delivery time: 3 days.
PREMIUM PACKAGE:
Edit, crop, retouch, resize and add effects on 3 photos | JPG, PNG | High resolution | Delivery time: 4 days.
Photo Editing
BASIC PACKAGE $5.00 USD
STANDARD PACKAGE $15.00 USD
PREMIUM PACKAGE $30.00 USD
«
Previous
1
2
3
»
Next


Source code organization
Projects
- MonkeyWrench
- MonkeyWrench.Builder
- MonkeyWrench.Database
- MonkeyWrench.Database.Manager
- MonkeyWrench.DataClasses
- MonkeyWrench.Scheduler
- MonkeyWrench.Web.UI
- MonkeyWrench.Web.WebService
MonkeyWrench
This is a common project for source code relevant all other projects.
MonkeyWrench.Builder
The program executed on the buildbot.
MonkeyWrench.Database
Common source code for all projects/executables accessing the database directly (the scheduler and the web service).
MonkeyWrench.Database.Manager
This is a database management utility, used to:
- Execute retention directives regularily
- Can move files between file system storage and database storage
- Database GC
MonkeyWrench.DataClasses
Common source code for database logic.
MonkeyWrench.Scheduler
The program executed on the database server to update the database when new revisions are committed.
MonkeyWrench.Web.UI
The web ui
MonkeyWrench.Web.WebService
The web service
Files
- Download.aspx
- Download.aspx.cs: auxiliary page to provide http download of files (using a web service to download big files is very inefficient)
- WebServices.asmx:
- WebServices.asmx.cs: the web service itself
- WebServices.wsdl: used to generate WebServices.cs
- WebServices.cs: the file to include in other projects
- WsdlGenerator.*: Helper files for generating the WebServices.wsdl file
Generating WebServices.cs to include in other projects
This process has to be done on Windows (I use custom serialization to not generate proxy classes for our dataclasses, since they're be defined in a referenced library, and I haven't found out how to do this in Mono).
- run web.sh in ../scripts (which will start up xsp2 on 8123)
- run 'make WebServices.wsdl' (this will fetch the wsdl from xsp2 you just started)
- Run WsdlGenerator.cmd on Windows, this will produce the WebServices.cs which the other projects include.


Consultation outcome
Ref: Ofqual/16/5869 PDF , 129KB , 2 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
We proposed that all reformed AS and A level qualifications in philosophy should comply with the subject content requirements published by the Department for Education, and with our assessment objectives.
Respondents generally supported this proposal and, having reviewed our proposed Condition following consultation, we are satisfied that it is fit for purpose and consistent with our overall approach to reformed AS and A level qualifications. We have therefore decided to adopt the Condition unchanged.
We proposed to introduce guidance on the interpretation of our assessment objectives.
One respondent (an organisation) expressed concern that the wording of our proposed guidance could lead to narrowing of the subject content. The respondent suggested ways we could improve the wording to ensure the guidance aligns fully with the subject content.
In response to these comments, we have decided to make changes to the drafting of the guidance on assessment objectives to make sure there is full coverage of the subject content (and consistency with other AS and A level subjects), but have not changed the substance of our proposals.
One respondent to our consultation made comments relating to the subject content requirements published by the Department for Education. The subject content was subject to an earlier consultation by the Department for Education, and the issues raised were outside the scope of this consultation.
One respondent to our consultation made comments relating to the length of assessments in AS and A level philosophy, particularly the impact that long assessments may have on students with certain disabilities. We have not proposed to set any requirements relating to the length of AS and A level philosophy assessments. In the absence of such a requirement, it is for the exam boards to determine the appropriate length of assessments in this subject. This is consistent with the approach we have taken in other subjects, and we remain of the view that we should not set any requirements relating to the length of assessments in AS and A level philosophy.
Published: PDF , 89.9KB , 11 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
There were six responses to the consultation – four from individuals and two from organisations.
One individual commented only on the subject content for AS and A level philosophy, which was out of scope for this consultation.
One of the organisations did not comment directly on our proposals, but instead provided general comments on the process for reform of GCSEs, AS and A levels.
Respondents broadly supported our approach, and our proposed conditions and guidance. One respondent (an organisation) suggested changes to our proposed guidance on assessment objectives, to ensure the guidance did not narrow the coverage of subject content.
This consultation ran from
to
A consultation on rules and guidance for new AS and A levels in philosophy.
Ref: Ofqual/15/5817 PDF , 530KB , 30 pages
If you use assistive technology (such as a screen reader) and need a version of this document in a more accessible format, please email<EMAIL_ADDRESS>. Please tell us what format you need. It will help us if you say what assistive technology you use.
This consultation is about the rules and guidance we plan to put in place for new AS and A levels in philosophy. These rules will apply to the new philosophy AS and A levels that will be taught in schools in England from September 2017.
This consultation takes forward decisions made following our earlier consultation ‘ Development of new GCSEs and A levels for teaching from 2017 ’, and is part of Ofqual’s work supporting the government’s changes to GCSEs, AS and A levels .
Published: 17 December 2015
Updated: 15 March 2016
From: Ofqual