1622124420

# Inclusion Identity & Innovation: Covering and The Connection Between Being Ourselves

Kenji Yoshino is the Chief Justice Earl Warren Professor of Constitutional Law at NYU School of Law and Director of the Center for Diversity, Inclusion and Belonging. He wrote Covering: The Hidden Assault on Our Civil Rights, about how we downplay parts of our known identities to blend into the mainstream. Lindsay-Rae McIntyre is a corporate vice president and Chief Diversity Officer at Microsoft. Learn about the ways we cover in the workplace and what individuals and companies can do about it.

Explore Deeper Content and Training – https://aka.ms/learnatbuild

Microsoft Build 2021

#microsoft #developer

1597222800

## PostgreSQL Connection Pooling: Part 4 – PgBouncer vs. Pgpool-II

In our previous posts in this series, we spoke at length about using PgBouncer  and Pgpool-II , the connection pool architecture and pros and cons of leveraging one for your PostgreSQL deployment. In our final post, we will put them head-to-head in a detailed feature comparison and compare the results of PgBouncer vs. Pgpool-II performance for your PostgreSQL hosting !

The bottom line – Pgpool-II is a great tool if you need load-balancing and high availability. Connection pooling is almost a bonus you get alongside. PgBouncer does only one thing, but does it really well. If the objective is to limit the number of connections and reduce resource consumption, PgBouncer wins hands down.

It is also perfectly fine to use both PgBouncer and Pgpool-II in a chain – you can have a PgBouncer to provide connection pooling, which talks to a Pgpool-II instance that provides high availability and load balancing. This gives you the best of both worlds!

PostgreSQL Connection Pooling: Part 4 – PgBouncer vs. Pgpool-II

CLICK TO TWEET

### Performance Testing

While PgBouncer may seem to be the better option in theory, theory can often be misleading. So, we pitted the two connection poolers head-to-head, using the standard pgbench tool, to see which one provides better transactions per second throughput through a benchmark test. For good measure, we ran the same tests without a connection pooler too.

#### Testing Conditions

All of the PostgreSQL benchmark tests were run under the following conditions:

1. Initialized pgbench using a scale factor of 100.
2. Disabled auto-vacuuming on the PostgreSQL instance to prevent interference.
3. No other workload was working at the time.
4. Used the default pgbench script to run the tests.
5. Used default settings for both PgBouncer and Pgpool-II, except max_children*. All PostgreSQL limits were also set to their defaults.
6. All tests ran as a single thread, on a single-CPU, 2-core machine, for a duration of 5 minutes.
7. Forced pgbench to create a new connection for each transaction using the -C option. This emulates modern web application workloads and is the whole reason to use a pooler!

We ran each iteration for 5 minutes to ensure any noise averaged out. Here is how the middleware was installed:

• For PgBouncer, we installed it on the same box as the PostgreSQL server(s). This is the configuration we use in our managed PostgreSQL clusters. Since PgBouncer is a very light-weight process, installing it on the box has no impact on overall performance.
• For Pgpool-II, we tested both when the Pgpool-II instance was installed on the same machine as PostgreSQL (on box column), and when it was installed on a different machine (off box column). As expected, the performance is much better when Pgpool-II is off the box as it doesn’t have to compete with the PostgreSQL server for resources.

#### Throughput Benchmark

Here are the transactions per second (TPS) results for each scenario across a range of number of clients:

#database #developer #performance #postgresql #connection control #connection pooler #connection pooler performance #connection queue #high availability #load balancing #number of connections #performance testing #pgbench #pgbouncer #pgbouncer and pgpool-ii #pgbouncer vs pgpool #pgpool-ii #pooling modes #postgresql connection pooling #postgresql limits #resource consumption #throughput benchmark #transactions per second #without pooling

1666196400

## nom-rule

A procedural macro for defining nom combinators in simple DSL. Requires nom v5.0+.

## Dependencies

[dependencies]
nom = "7"
nom-rule = "0.2"


## Syntax

The procedural macro rule! provided by this crate is designed for the ease of writing grammar spec as well as to improve maintainability, it follows these simple rules:

1. TOKEN: match the token by token kind. You should provide a parser to eat the next token if the token kind matched. it will get expanded into match_token(TOKEN).
2. ";": match the token by token text. You should provide a parser to eat the next token if the token text matched. it will get expanded into match_text(";") in this example.
3. #fn_name: an external nom parser function. In the example above, ident is a predefined parser for identifiers.
4. a ~ b ~ c: a sequence of parsers to take one by one. It'll get expanded into nom::sequence::tuple.
5. (...)+: one or more repeated patterns. It'll get expanded into nom::multi::many1.
6. (...)*: zero or more repeated patterns. It'll get expanded into nom::multi::many0.
7. (...)?: Optional parser. It'll get expanded into nom::combinator::opt.
8. a | b | c: Choices between a, b, and c. It'll get expanded into nom::branch::alt.
9. &a: Peek. It'll get expanded into nom::combinator::peek(a). Note that it doesn't consume the input.
10. !a: Negative predicate. It'll get expanded into nom::combinator::not. Note that it doesn't consume the input.
11. ^a: Cut parser. It'll get expanded into nom::combinator::cut.
12. ... : "description": Context description for error reporting. It'll get expanded into nom::error::context.

## Example

Define match_text parser and match_token parser for your custom token type. You can use nom::combinator::fail as match_token if your parser use &str or &[u8] as input because you won't match on token kinds.

#[derive(Clone, Debug, PartialEq)]
struct Token<'a> {
kind: TokenKind,
text: &'a str,
span: Span,
}

#[derive(Clone, Copy, Debug, PartialEq)]
enum TokenKind {
Whitespace,

// Keywords
CREATE,
TABLE,

// Symbols
LParen,
RParen,
Semicolon,
Comma,

Ident,
}

fn match_text<'a, Error: ParseError<Input<'a>>>(
text: &'a str,
) -> impl FnMut(Input<'a>) -> IResult<Input<'a>, &'a Token<'a>, Error> {
move |i| satisfy(|token: &Token<'a>| token.text == text)(i)
}

fn match_token<'a, Error: ParseError<Input<'a>>>(
kind: TokenKind,
) -> impl FnMut(Input<'a>) -> IResult<Input<'a>, &'a Token<'a>, Error> {
move |i| satisfy(|token: &Token<'a>| token.kind == kind)(i)
}


Then give the two parser to nom_rule::rule! by wrapping it into a custom macro:

macro_rules! rule {
($($tt:tt)*) => {
nom_rule::rule!($crate::match_text,$crate::match_token, $($tt)*)
}
}


To define a parser for the SQL of creating table:

let mut rule = rule!(
CREATE ~ TABLE ~ #ident ~ ^"(" ~ (#ident ~ #ident ~ ","?)* ~ ")" ~ ";" : "CREATE TABLE statement"
);


It will get expanded into:

let mut rule =
nom::error::context(
"CREATE TABLE statement",
nom::sequence::tuple((
(crate::match_token)(CREATE),
(crate::match_token)(TABLE),
ident,
(nom::combinator::cut(crate::match_text)("(")),
nom::multi::many0(nom::sequence::tuple((
ident,
ident,
nom::combinator::opt((crate::match_text)(",")),
))),
(crate::match_text)(")"),
(crate::match_text)(";"),
))
);


## Auto Sequence (nightly only)

nom-rule is able to automatically insert ~ in the rule when necessary so that you get the example above working the same as the following:

let mut rule = rule!(
CREATE TABLE #ident "(" (#ident #ident ","?)* ")" ";" : "CREATE TABLE statement"
);


To enable this feature, you need to use a nightly channel rust complier, and add this to the Cargo.toml:

nom-rule = { version = "0.2", features = ["auto-sequence"] }

Author: andylokandy
Source Code: https://github.com/andylokandy/nom-rule

1623250560

## An Introduction To Data Connectivity and Data Connectivity Solutions

### Introduction

In today’s world, data is the crux of major business decisions used by organizations all over the world. As such, it is imperative that the organizations have access to the right data and be able to analyze and make business decisions proactively. This article talks about data connectivity, the related concepts, its benefits, as well as a discussion on some data connectivity solutions.

#big data #data connectivity #data connectivity solutions #connectivity

1646431800

## Mkdocs-with-pdf: Generate A Single PDF File From MkDocs Repository

PDF Generate Plugin for MkDocs

This plugin will generate a single PDF file from your MkDocs repository. This plugin is inspired by MkDocs PDF Export Plugin.

## Features

• Shift down sub-page headings level.
• using WeasyPrint.

## Requirements

1. This package requires MkDocs version 1.0 or higher (0.17 works as well)
2. Python 3.6 or higher
3. WeasyPrint depends on cairo, Pango and GDK-PixBuf which need to be installed separately. Please follow the installation instructions for your platform carefully:

## How to use

### Installation

Install the package with pip:

pip install mkdocs-with-pdf

Enable the plugin in your mkdocs.yml:

plugins:
- with-pdf

#### Testing

When building your repository with mkdocs build, you should now see the following message at the end of your build output:

Converting 10 articles to PDF took 7.1s

### Configuration

You may customize the plugin by passing options in mkdocs.yml:

plugins:
- with-pdf:
#author: WHO
#
#cover: false
#back_cover: true
#cover_title: TITLE TEXT
#cover_subtitle: SUBTITLE TEXT
#custom_template_path: TEMPLATES PATH
#
#toc_title: TOC TITLE TEXT
#toc_level: 3
#ordered_chapter_level: 2
#excludes_children:
#    - 'release-notes/:changelog'
#
#exclude_pages:
#    - 'bugs/'
#    - 'appendix/contribute/'
#convert_iframe:
#    - src: IFRAME SRC
#      img: POSTER IMAGE URL
#      text: ALTERNATE TEXT
#    - src: ...
#two_columns_level: 3
#
#render_js: true
#
#output_path: any-place/document.pdf
#enabled_if_env: ENABLE_PDF_EXPORT
#
#debug_html: true
#show_anchors: true
#verbose: true

#### Options

for Properties

author

Set the author text.
default: use site_author in your project mkdocs.yml

copyright

Set the author text.
default: use copyright in your project mkdocs.yml

author and copyright values are drawn in Cover, and you can use '@page' content.

@page {  @bottom-left {    content: string(author) !important;  }  @bottom-right {    content: string(copyright) !important;  } }

for Cover

cover

Set the value to false if you don't need a cover page.
default: true

back_cover

Set the value to true if you need a back cover page.
default: false
since: v0.8.0

You would be better to install the qrcode package:

pip install qrcode

cover_title

Set the title text in cover page.
default: use site_name in your project mkdocs.yml

cover_subtitle

Set the subtitle text in cover page.
default: None

cover_logo

Set the logo image in cover page. This value is URL or simply specify the relative path to the docs directory.
default: None
since: v0.8.0

toc_title

Set the title text of Table of Content.
default: Table of Content
since: v0.4.0

heading_shift

Set this value to false, disable shift heading in child page.
default: true

In this flags enable, heading move down one level in child page.

toc_level

Set the level of Table of Content. This value is enabled in the range of from 1 to 3.
default: 3

ordered_chapter_level

Set the level of heading number addition. This value is enabled in the range of from 1 to 3.
default: 3

excludes_children

Set the page id of nav url. If the id matches in this list, it will be excluded from the heading number addition and table of contents.
default: []

for Page

exclude_pages

Set the page id of nav url. If the id matches in this list, it will be excluded page contents.
default: []
since: v0.3.0

convert_iframe

List of iframe to a conversions. Every iframe that matches a src in this list will be replace to a contains each img and/or text. it's using for such as embedded VIDEO.
default: []
since: v0.6.0

two_columns_level (Experimental)

Set the heading level of Two Column Layout. Currently only 0(disable) or 3 is valid for this value. So slow processing, but a little nice.

default: 0
since: v0.7.0

Renderer for JavaScript

render_js

Set the value to true if you're using 'MathJax', 'Twemoji' or any more.
Require "Chrome" which has "headless" mode.

default: false
since: v0.7.0

headless_chrome_path

Set the "Headless Chrome" program path.
If render_js is false, this value will be ignored.

default: chromium-browser

$<PROGRAM_PATH> --headless \ --disable-gpu \ --dump-dom \ <ANY_SITE_URL(eg. 'https://google.com')>  ... and more output_path This option allows you to use a different destination for the PDF file. default: pdf/document.pdf custom_template_path The path where your custom cover.html and/or styles.scss are located. default: templates since: v0.8.0 enabled_if_env Setting this option will enable the build only if there is an environment variable set to 1. This is useful to disable building the PDF files during development, since it can take a long time to export all files. default: None PDF generation can take significantly longer than HTML generation which can slow down mkdocs's built-in dev-server. Adding enabled_if_env: ENABLE_PDF_EXPORT under - with-pdf: disables PDF generation during development. Run the dev-server normally: $ mkdocs serve
INFO    -  Browser Connected: http://127.0.0.1:8000/
INFO    -  Running task: builder (delay: None)
INFO    -  Building documentation...
WARNING -  without generate PDF(set environment variable ENABLE_PDF_EXPORT to 1 to enable)
... 2 seconds later ...
INFO    -  Reload 1 waiters: /.../index.md

and to build files to deploy specify ENABLE_PDF_EXPORT=1 at the command line:

$ENABLE_PDF_EXPORT=1 mkdocs build ... INFO - Converting 10 articles to PDF took 7.1s INFO - Documentation built in 8.29 seconds debug_html Setting this to true will out HTML to stdout on build time. default: false You can try this: mkdocs build > for_pdf_print.html ...and browse output with Google Chrome. Chrome DevTools Into Print Preview Mode will you help. Note: WeasyPrint and Google Chrome are not fully compatible. show_anchors Setting this to true will list out of anchor points provided during the build as info message. default: false since: v0.7.4 verbose Setting this to true will show all WeasyPrint debug messages during the build. default: false ## Custom cover page and document style It is possible to create a custom cover page for the document. You can also add a custom style sheet to modify the whole document. To do so, add a templates folder at the root level of your mkdocs project and place a cover.html and/or a styles.scss inside. Alternatively, you can specify a different location with the custom_template_path option. ### Custom cover page Using jinja2 syntax, you can access all data from your mkdocs.yml. To make template creation easier, you can use plugin_some_plugin to access variables from plugins. E.g. use {{ author }} to get the author from your mkdocs.yml that looks like: plugins: - with-pdf: author: WHO You can use custom variables extra: in your mkdocs.yml And, you can check it in the log if run with verbose or debug_html options. ### Custom stylesheet Since your stylesheet is appended to the default ones, you can override every setting from them. Tip: setting the debug_html option to true to get the generated html that is passed to weasyprint can help you determine the html tags, classes or identifiers you want to modify in your stylesheet. ### Advanced Rendering Hooks (Experimental) You can hook the PDF rendering process by creating a pdf_event_hook.py(or pdf_event_hook/__init__.py) in your working directory (usually the same directory as mkdocs.yml). since: v0.8.2 #### Sample pdf_event_hook.py (or pdf_event_hook/__init__.py) import logging from bs4 import BeautifulSoup from mkdocs.structure.pages import Page def inject_link(html: str, href: str, page: Page, logger: logging) -> str: """Adding PDF View button on navigation bar(using material theme)""" def _pdf_icon(): _ICON = ''' <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z" fill="#E2E5E7"/> <path d="m384 128h96l-128-128v96c0 17.6 14.4 32 32 32z" fill="#B0B7BD"/> <polygon points="480 224 384 128 480 128" fill="#CAD1D8"/> <path d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16 V416z" fill="#F15642"/> <g fill="#fff"> <path d="m101.74 303.15c0-4.224 3.328-8.832 8.688-8.832h29.552c16.64 0 31.616 11.136 31.616 32.48 0 20.224-14.976 31.488-31.616 31.488h-21.36v16.896c0 5.632-3.584 8.816-8.192 8.816-4.224 0-8.688-3.184-8.688-8.816v-72.032zm16.88 7.28v31.872h21.36c8.576 0 15.36-7.568 15.36-15.504 0-8.944-6.784-16.368-15.36-16.368h-21.36z"/> <path d="m196.66 384c-4.224 0-8.832-2.304-8.832-7.92v-72.672c0-4.592 4.608-7.936 8.832-7.936h29.296c58.464 0 57.184 88.528 1.152 88.528h-30.448zm8.064-72.912v57.312h21.232c34.544 0 36.08-57.312 0-57.312h-21.232z"/> <path d="m303.87 312.11v20.336h32.624c4.608 0 9.216 4.608 9.216 9.072 0 4.224-4.608 7.68-9.216 7.68h-32.624v26.864c0 4.48-3.184 7.92-7.664 7.92-5.632 0-9.072-3.44-9.072-7.92v-72.672c0-4.592 3.456-7.936 9.072-7.936h44.912c5.632 0 8.96 3.344 8.96 7.936 0 4.096-3.328 8.704-8.96 8.704h-37.248v0.016z"/> </g> <path d="m400 432h-304v16h304c8.8 0 16-7.2 16-16v-16c0 8.8-7.2 16-16 16z" fill="#CAD1D8"/> </svg> ''' # noqa: E501 return BeautifulSoup(_ICON, 'html.parser') logger.info(f'(hook on inject_link: {page.title})') soup = BeautifulSoup(html, 'html.parser') nav = soup.find(class_='md-header-nav') if not nav: # after 7.x nav = soup.find('nav', class_='md-header__inner') if nav: a = soup.new_tag('a', href=href, title='PDF', **{'class': 'md-header__button md-header-nav__button md-icon'}) a.append(_pdf_icon()) nav.append(a) return str(soup) return html # def pre_js_render(soup: BeautifulSoup, logger: logging) -> BeautifulSoup: # logger.info('(hook on pre_js_render)') # return soup # def pre_pdf_render(soup: BeautifulSoup, logger: logging) -> BeautifulSoup: # logger.info('(hook on pre_pdf_render)') # tag = soup.find(lambda tag: tag.name == # 'body' and 'data-md-color-scheme' in tag.attrs) # if tag: # tag['data-md-color-scheme'] = 'print' # return soup ... and check log: $ mkdocs build
INFO    -  Found PDF rendering event hook module.
INFO    -  Cleaning site directory
INFO    -  Building documentation to directory: /tmp/sample/site
INFO    -  (hook on inject_link: Home)
...

## Contributing

From reporting a bug to submitting a pull request: every contribution is appreciated and welcome. Report bugs, ask questions and request features using Github issues. If you want to contribute to the code of this project, please read the Contribution Guidelines.

## Special thanks to

Author: Orzih
Source Code: https://github.com/orzih/mkdocs-with-pdf

1624668720

## 10 Most Innovative Chatbots that You Can Rely On

Chatbots are probably one of the most innovative and convenient ways that cater to customer support. People rely on them heavily when they have certain issues to be solved. Needless to say, chatbots have become extremely popular over these years mainly because of the advancement in machine learning (ML) and other technologies such as natural language processing (NLP). Today, the kind of chatbots we have interaction with are smarter and way more responsive. The coming years will see more of them, without a doubt. That said, here are the 10 most innovative chatbots that you can rely on.

Mondly

Casper

Heek

Hazel

#chatbots #latest news #10 most innovative chatbots that you can rely on #innovative chatbots #10 most innovative chatbots that #10 most innovative chatbots that you can rely on