text:
Tableau – VizAlerts Installation Guide

# Table of Contents
-  [What is VizAlerts?](#what-is-vizalerts)
-  [What does it do?](#what-does-it-do)
-  [How does it work?](#how-does-it-work)
-  [Upgrading from VizAlerts 2.1.1](#upgrading-from-vizalerts-2_1_1)
-  [Installation Prerequisites](#installation-prerequisites)
	- [Tableau Server](#tableau-server)
	- [Tableau Desktop](#tableau-desktop)
	- [Host Machine](#host-machine)
	- [SMTP (Mail) Server](#smtp-mail-server)
- [Installation](#installation)
	- [Configure Tableau Server](#configure-tableau-server)
		- [Trusted Tickets](#trusted-tickets)
		- [Repository Access](#repository-access)
		- [Restart](#restart)
		- [Custom Subscription Schedules](#custom-subscription-schedules)
	- [Open the VizAlertsConfig Workbook](#open-the-vizalertsconfig-workbook)
	- [Configure the VizAlertsScheduledTriggerView Viz](#configure-the-vizalerts-scheduledtriggerview-viz)
		- [Calculated Fields](#calculated-fields)
		- [Regex Notation](#regex-notation)
	- [Publish the VizAlertsConfig Workbook](#publish-the-scheduledtriggerviews-viz)
	- [Install Python & Required Modules](#install-python-required-modules)
	- [Configure VizAlerts](#configure-vizalerts)
	- [Testing](#testing)
		- [Can VizAlerts Connect? Test](#can-vizalerts-connect-test)
		- [Simple Alert Test](#simple-alert-test)
		- [Put VizAlerts Through Its Paces Test](#put-vizalerts-through-its-paces-test)
		- [Optional: Send Yourself Some SMS Messages Test](#optional-send-yourself-some-sms-messages-test)
	- [Final Steps](#final-steps)
		- [Set up a Scheduled Task](#set-up-a-scheduled-task)
		- [Starter Workbook](#starter-workbook)
- [FAQ](#faq)
- [Common Errors](#common-errors)
- [Getting VizAlerts Help](#getting-vizalerts-help)
- [Contributing to VizAlerts](#contributing-to-vizalerts)
- [Appendix A.](#appendix-a)
	- [Installing Python modules with no Internet access](#installing-python-modules-with-no-internet-access)

What is VizAlerts?
==================

VizAlerts is an automation platform intended to seamlessly integrate
with Tableau Server. The idea behind it is that **anyone** should be
able to easily build, share, and customize nearly **any** any email or
SMS **automation** based on their own Tableau Server viz data. In the
future, VizAlerts will be able to perform even more actions than these.

In its current form, VizAlerts exists simply as an application that is
set up by a system administrator to run at frequent and regular
intervals. All of the information it needs to enable data-driven email
and SMS alerting is derived from the Tableau Server PostgreSQL
repository, and the published views of the Tableau Server it is set to
run against.

What does it do?
================

VizAlerts has been designed to support many use cases:

-   Sending notifications to subscribers when a condition has been met
    (or not!) like extract refresh failures, meeting or missing target
    thresholds, etc.

-   Halting emails from being sent to the group unless the data is up to
    date (while the workbook owner does get an email that the data isn’t
    up to date).

-   Notify data owners when data is corrupt in some way (extraneous
    values, too many Null values, too large a change, etc.)

-   Sending a one line email notification that could be forwarded
    through an email-to-sms gateway such as<EMAIL_ADDRESS>    or a messaging provider such as Twilio.

-   Batch reporting to distribution lists of non-Tableau users, for
    example emailing a weekly operations report to front-line staff who
    aren’t on Tableau.

-   Combining images and text into an HTML email for a more customized,
    professional look.

-   Merge multiple views into a single consolidated PDF, for example
    sending a company overview and per-region detail.

-   Blend views from separate workbooks in the same email, for example a
    view from the operations dashboard and a view from the
    finance dashboard.

-   Bursting reports, for example sending to a manager a dashboard for
    each of her direct reports.

-   Send SMS messages to escalate an issue to your support staff.

-   Whatever combinations of the above you can imagine!

How does it work?
=================

While the details on how to *set up* alerts will be left in the User
Guide, it’s important for Administrators to know how things are working
behind the scenes.

The general flow of a single execution of VizAlerts goes like this:

1.  Connect to the PostgreSQL repository database of Tableau Server, and
    query it for a list of Views subscribed to on specially configured,
    disabled Schedules

2.  Compare Schedule information to last runtime information stored in a
    local text file—based on this, determine which Views are due for
    alert testing

3.  For each View found due for testing:

    1.  Generate a Trusted Ticket on behalf of the Subscriber of the
        View

    2.  Redeem the Trusted Ticket to export the CSV data for the View,
        impersonating the Subscriber

    3.  If one or more rows are found in the CSV:

        1.  For a “Simple Alert”, generate a new Trusted Ticket, export
            the PNG of the View, and email it to the Subscriber.

        2.  For an “Advanced Alert”, iterate through each row of the
            CSV, sending emails or performing other actions as
            instructed by the data itself.

Upgrading from VizAlerts 2.1.1
=====================================

**NOTE** There are two important changes in this release:

-   A fix to the VizAlertsConfig workbook for Tableau Server 2020.4.1

-   Switch from Python 2 to Python 3

If you are running VizAlerts with the binary EXE file, and are not using Tableau Server 2020.4 or higher, there is little reason to upgrade to 2.2.0.
If you are running it as a Python script, it is recommended that you upgrade, as Python 2 has been discontinued.
If you are upgrading to Tableau Server 2020.4 or higher, you can choose to upgrade VizAlerts, or [edit your VizAlertsConfig workbook](https://github.com/tableau/VizAlerts/issues/175) instead (the simpler solution).

Upgrading to VizAlerts 2.2.0 when running as a Python script will require installing Python 3. My own experience was that it is best that you first remove Python 2 from your system by uninstalling it, and removing all references to it from your environment variables. Then, you need to [install Python 3](#install-python-required-modules). Please be aware that uninstalling Python 2 will begin a VizAlerts outage, so please TEST on a separate server first, and plan your deployment accordingly.

1. Backup your current VizAlerts directory to a separate location.

2. Download version 2.2.0 from <https://github.com/tableau/VizAlerts/releases>, and unzip to a *new* folder alongside your existing VizAlerts folder. You should have three folders at this point: The live, current installation, the backup of the current installation, and a new folder you unzipped v2.2.0 into.

3. Merge VizAlertsConfig changes into new workbook
	- There is a new version of \config\VizAlertsConfig.twb that contains an edit to the _is_valid_schedule_ calc. It's easiest to simply drop this minor change into your existing VizAlertsConfig workbook. To do so, here are the steps:
		- Download your existing VizAlertsConfig workbook from Tableau Server and open it in Tableau Desktop
		- Edit the _is_valid_schedule_ calc in your VizAlertsConfig workbook so that the first line is **[subscription_id] < 0** rather than **ISNULL(schedule_id)**
		- Now re-publish the current VizAlertsConfig workbook to Tableau Server, **making sure** that you are embedding the password in the connection. This will _not_ break v2.1.1 of VizAlerts.

4. Copy other config files
	- Copy the \config\vizalerts.yaml file from your *current* VizAlerts folder *over* the same file in the *new* VizAlerts folder
		- No changes were made to this file, so it will work just fine the way it is
	- If you're using SSL to connect to Tableau Server, and have a certificate file you're storing in the VizAlerts folder, make sure it's copied to the new location
	- If you've referenced any other files for passwords or anything else, make sure they're copied as well.

5. In Task Scheduler, disable the existing VizAlerts scheduled task.

6. **VizAlerts outage begins**

7. Uninstall Python 2, and remove references to it from your environmental variables (again, this is optional, but should make things simpler--if you're a power user that knows Python inside and out, feel free to disregard)

8. Download and install Python 3 and [required modules](#install-python-required-modules)

9. If you didn't already publish the updated version of VizAlertsConfig, publish it now, ensuring that you embed the password when you publish it!

10. Rename folders
	- Rename the existing VizAlerts folder with something like "-old" at the end of it
	- Rename the new VizAlerts folder whatever the old one was called

11. Testing
	- Open a command prompt, navigate to the VizAlerts folder, and execute VizAlerts one time. Ensure it runs properly, and review the logs if there are any errors.
	- Test a single alert by adding a test\_alert comment to a viz, and then run it again in the command prompt, again ensuring that no errors are logged.

12. **Optional**: If you want to ensure that no alerts were skipped during the upgrade, copy the \ops\vizalerts.state file from the -old VizAlerts folder to the current one.

13. In Task Scheduler, enable the VizAlerts task

14. **VizAlerts outage ends**

15. Remove the -old VizAlerts folder and any backups you made, whenever you feel comfortable

Installation Prerequisites
=====================================

Tableau Server
--------------

The Tableau Server instance that you wish to run VizAlerts against must
fulfill the following requirements:

-   Must be v8.3 or higher.

-   The [readonly
    user](https://onlinehelp.tableau.com/current/server/en-us/perf_collect_server_repo.htm)
    must be granted access on the Tableau Server repository.

-   [Subscriptions](http://onlinehelp.tableau.com/current/server/en-us/subscribe.htm)
    must be enabled.

-   The host you plan to run VizAlerts from must have its IP address
    listed as a [Trusted
    Host](http://onlinehelp.tableau.com/current/server/en-us/trusted_auth_trustIP.htm)

-   If it wasn’t already obvious, you need to be a System Administrator
    on Tableau Server to set all this up.

-   A Project configured with appropriate (usually very limited)
    permissions for the VizAlerts schedule viz. The VizAlerts schedule
    viz pulls information from the Tableau Server repository (using the
    readonly user) and can be configured in a number of ways so in
    general you’ll want to limit access to the VizAlerts
    system administrator(s).

Tableau Desktop
---------------

To install VizAlerts you’ll need to use Tableau Desktop Professional
once to publish the VizAlerts scheduled trigger viz. Here are the
requirements:

-   A version of Tableau Desktop appropriate to the Tableau Server
    version you are installing to. See
    <http://kb.tableau.com/articles/knowledgebase/desktop-and-server-compatibility>.
    If you don’t have Tableau Desktop or access to someone’s computer
    where you could use it then you can download a trial vesion of
    Tableau Desktop Professional from <http://tableau.com>.

-   The machine that is running Tableau Desktop will need to have a
    PostgreSQL driver installed, if you need one you can download it
    from <http://www.tableau.com/support/drivers>.

-   You’ll also need to make sure you can access the Tableau Server from
    your Tableau Desktop machine, you may need to open one or more
    firewalls to enable connection to Tableau Server and/or the
    PostgreSQL repository.

-   The machine where Tableau Desktop is located will need access to the
    …\\VizAlerts\\config\\ScheduledTriggerView.twb in order to
    publish it.

Host Machine
------------

This is where VizAlerts will be run from, which means that this machine
must be continually up and running for VizAlerts to function. This can
be one of the Tableau Server hosts if desired, but it doesn’t have to
be. It must have the following properties:

-   Static IP address

-   Always running

-   Within same domain as Tableau Server

-   You must have administrative rights to it

-   Should **not** need to have much processing power as heavy work is
    offloaded to Tableau Server

VizAlerts has been built and tested on Windows, but it’s also been known
to run on Linux and Mac.

SMTP (Mail) Server
------------------

VizAlerts needs to point to a mail server to send email. This can simply
be the same server you used when you set up Tableau Server for
subscriptions. If your mail server is set up to support SSL encryption,
that is ideal, but it’s not required.

Installation
============

You’ve got everything you need, now let’s get this thing running!

Configure Tableau Server
------------------------

Making any of these configuration changes requires a restart of Tableau
Server, so if this is being done on a live / production server, make
sure to do this during a maintenance window.

### Trusted Tickets

VizAlerts uses [Trusted
Authentication](http://onlinehelp.tableau.com/current/server/en-us/trusted_auth.htm)
to impersonate users and obtain access to Tableau Server views in CSV
and PNG format. To grant it this access, run the following command at a
command prompt on the Primary host of Tableau Server:

    For versions 10.5 and higher:

    tsm configuration set -k wgserver.trusted\_hosts -v <HOSTNAME OF VIZALERTS HOST>

    For pre-10.5 versions:

    tabadmin set wgserver.trusted\_hosts <HOSTNAME OF VIZALERTS HOST>

### Repository Access

The Tableau Server repository database contains information VizAlerts
needs to function. Grant it access by enabling the [readonly
user](http://onlinehelp.tableau.com/current/server/en-us/adminview_postgres_access.htm):

    For versions 10.5 and higher:

    tsm data-access repository-access enable --repository-username readonly --repository-password <YOUR PASSWORD>

    For pre-10.5 versions:

    tabadmin dbpass --username readonly <YOUR PASSWORD>

### Restart

Once you have finished the above steps, you must save the configuration
and restart Tableau Server. When you’re ready to do this, run the
following commands in the command prompt:

    For versions 10.5 and higher:

    tsm pending-changes apply

    tsm restart

    For pre-10.5 versions:

    tabadmin configure

    tabadmin restart

### Custom Subscription Schedules

A key component that allows VizAlerts to work in the intuitive way that
it does is that users who wish to schedule an alert are able to
subscribe to them on *disabled* Subscriptions schedules. These are
schedules that you must create in Tableau Server, then manually disable
so that no subscriptions are ever delivered for them. Since the data for
who subscribed to what views *on* these specific schedules exists in the
PostgreSQL repository, VizAlerts can use this information to tell itself
when it is appropriate to test those views for an alert condition.

You can create as many schedules as you like, on whatever intervals you
like. The important bit behind the schedules is the **naming
convention** that you use, because this is how VizAlerts knows which
schedules to consider “alert” schedules that it needs to pay attention
to. I recommend naming them like this:

ѴizAlerts – \[frequency\]

**Copy and paste that** when you create your schedules—the first letter
is actually the Cyrillic letter Ѵ, which will cause your Alerts
schedules to be sorted at the bottom of the list when someone goes to
subscribe. This can help users avoid subscribing to them by mistake when
they only mean to set up a standard subscription:

Note that you must have at least one **enabled** Subscriptions schedule
for anyone to subscribe to a viz on Tableau Server, so if you have just
enabled Subscriptions for the first time, you’ll also need to create a
single non-VizAlert schedule that isn’t disabled.

Create your new schedules like so:

If you wish to allow your users to trigger their VizAlerts **when the workbook they are a part
of refreshes its data extract(s)**, then create two additional Subscription schedules using the
same method you did for the others, except that instead of:

ѴizAlerts – \[frequency\]

...they should be named:

- ѴizAlerts – **On Refresh Success**
- ѴizAlerts – **On Refresh Failure**

These will automatically be picked up by VizAlerts when someone subscribes to them, and their
alert will be executed when the corresponding refresh activity occurs on their workbook.

Open the VizAlertsConfig Workbook
---------------------------------

VizAlerts gets the list of alerts that users want to run, and when they
should run, from Tableau Server’s own PostgreSQL repository database.
The way it accesses that information is through a Tableau workbook that
you’ll publish to Tableau Server. For this step you’ll need the instance
of Tableau Desktop. To publish the viz, do the following:

1.  Open Tableau Desktop.

2.  Open the …\\VizAlerts\\config\\VizAlertsConfig.twb workbook.

3.  You’ll get a prompt about Custom SQL. You can review the SQL if you
    like, then press “Yes”.

4.  Depending on the Tableau Desktop version, you may get a prompt about
    the workbook being newer. Press OK to continue. You will get a login
    prompt that looks like this:

5.  Click Edit connection. The dialog will change to this dialog:

6.  Enter the following information:

    1.  Server: your Tableau Server domain name

    2.  Port: the port for the PostgreSQL repository, default is 8060

    3.  Database: leave as workgroup

    4.  Authentication: Change to Username and Password.

    5.  Username: leave as readonly

    6.  Password: enter the readonly password that you
        previously configured.

    7.  Require SSL: check this box if you are requiring SSL to connect
        to the Tableau repository.

7.  Click Sign In to sign in.

8.  The Tableau view that appears looks like this:

Configure the VizAlerts ScheduledTriggerView Viz
------------------------------------------------

The scheduled trigger view will initially show as empty because we
haven’t yet set up any VizAlerts. The main reason that a Tableau
workbook is used to tell VizAlerts what to do, is that it gives the
Admin a lot of flexibility in deciding which alerts should be processed
and *how* they should be processed. There are a number of parameters and
calculated fields that can be used to create a high degree of
customization, which we’ll talk about in a second, but to keep things
simple, there are only two settings that you **must** edit to get
started:

Substitute your own email domain name where you see “yourdomain” in both
fields. For example:

-   .\*tableau\\.com (only allows email to be sent to tableau.com
    addresses)
    and…

-<EMAIL_ADDRESS>(only allows “from” address to
    be<EMAIL_ADDRESS>
If you’re just trying to get things up and running, skip to [Publish the
VizAlertsConfig workbook](#_Publish_the_ScheduledTriggerViews)

Here’s a list of the major calculated fields and the (default)
parameters associated with them:

General Settings

Calculated Field

Parameter for default value

Description

data_retrieval_tries

default_data_retrieval_tries

The number of times VizAlerts will attempt to retrieve data for a particular viz before notifying of the failure.

notify_subscriber_on_failure

default_notify_subscriber_on_failure

When true (the default), the subscriber to the simple alert or the owner of the advanced alert is notified when there is a failure.

timeout_s

default_timeout_s

The number of seconds allowed to download a visualization before Tableau will notify of a failure. This prevents overloading Tableau Server with visualizations that are too slow to render

task_threads

default_task_threads

The number of threads used for to process Email and SMS notifications for a given VizAlert. For high-volume alerts sending hundreds of notifications,
a count of 5 or more could be necessary for timely processing. Discuss with your IT team so that you don't end up beating your SMTP server up
too much!

viz_data_maxrows

default_data_maxrows

The maximum number of rows that VizAlerts will attempt to process from any VizAlert, when the viz data is downloaded. This applies to both Simple and Advanced alerts.

viz_png_height

Sets the default height of downloaded images for Simple Alerts as well as the VIZ_IMAGE() content reference.

viz_png_width

Sets the default width of downloaded images for Simple Alerts as well as the VIZ_IMAGE() content reference

Email Action Settings

Calculated Field

Parameter for default value

Description

action_enabled_email

default_action_enabled_email

Denotes whether alerts can send emails. 1 (the default) if email actions are supported, otherwise 0

allowed_from_address

default_allowed_from_address

The email address you wish all email alerts to be sent from. Note that for Advanced Alerts, this is used only if the author did not specify their own “from” address in their viz. This uses Regex notation (see below for details).

allowed_recipient_addresses

default_allowed_recipient_addresses

The set of domains and addresses that email alerts can be sent to. This uses Regex notation (see below for details).

SMS Action Settings

Calculated Field

Parameter for default value

Description

action_enabled_sms

default_action_enabled_sms

1 if SMS actions are supported, 0 (the default) if not.

allowed_recipient_numbers

default_allowed_recipient_numbers

The set of allowed recipient phone numbers (or partial numbers). This uses Regex notation (see below for details).

from_number

default_from_number

The default number that SMS messages will originate from. This must be a number registered with Twilio that can do outbound SMS and be of the form +[country code][full phone number]

phone_country_code

default_phone_country_code

The default country code to use when recipient phone numbers do not have a country code.

Schedule Settings

Calculated Field

Parameter for default value

Description

is_valid_schedule

schedule_name_filter

Use to determine what Tableau Server subscription schedules will be checked for alerts.

### Calculated Fields

The calculated fields such as action\_enabled\_email allow us to create
formulas inside Tableau to give us more fine-grained control. For
example, we can allow a specific user to send email to any address,
rather than use the default setting like so:

Translated, this simply means that if the user called “mcoles-test”
wants to email anyone in the world with VizAlerts, they can, but
everyone else’s email recipients will still be restricted to the pattern
you set for the default\_allowed\_recipient\_addresses parameter (e.g.,
only your company’s email addresses).

If you want to define even *more* extensive policies, well, that’s why
it’s a Tableau viz! You can build out that calculation further using
other criteria, or even blend or join other data sources to the original
connection. It allows for almost unlimited flexibility.

### Regex Notation

VizAlerts uses Regex Notation in setting the
**allowed\_recipient\_addresses**, **allowed\_recipient\_numbers**, and
**allowed\_from\_address** values for maximum flexibility. Each
individual email address a VizAlerts is attempting to send mail to
**must** match the pattern the administrator has defined in the
configuration viz. So this feature will allow you to define a set of
rules like these:

-<EMAIL_ADDRESS>
-   mydomain.com

-   subdomain.someotherdomain.com

That would allow email to<EMAIL_ADDRESS><EMAIL_ADDRESS>and<EMAIL_ADDRESS>while denying email to addresses like<EMAIL_ADDRESS>and
<EMAIL_ADDRESS>
A full explanation of what you can do with regex notation is beyond the
scope of this document, for more information about regex we suggest you
use <http://www.regular-expressions.info>. Here are the key elements:

-   .\* is the wildcard pattern to accept all characters.

-   If any of the following characters are used, they must have a \\
    preceding them to be accepted: \\^$.|?\*+()\[{

    Example: If I want to accept all datablick.com addresses then the
    regex would be .\*datablick\\.com

-   Separate domains or email addresses are separated by the pipe |
    character.

    Example: To accept all datablick.com and tableau.com addresses then
    the regex would be .\*datablick\\.com|.\*tableau\\.com

Publish the VizAlertsConfig workbook
--------------------------------------------------------------------------------------------------------------------------------------------------------

Here’s how to publish the workbook:

1.  Go to Server->Publish Workbook… If you haven’t already signed in
    to Tableau Server and need to, you’ll be prompted to sign in. Once
    you’ve signed in the Publish Workbook dialog will appear:

2.  Change the Project and/or Name of the viz if you want, if you change
    the Name you’ll need to record this to use in the next section.

3.  Change the Permissions if need be. **Only Administrators should have
    rights to alter this workbook.**

4.  Under Data Sources click Edit. The Manage Data Sources dialog will
    appear:

5.  Set the Publish Type to Embedded in workbook.

6.  Set the Authentication to Embedded password.

7.  Click outside of the dialog to close it.

8.  Click Publish. Tableau will now publish the viz and open it in your
    default web browser:

9.  Click on the view to verify that it works as expected.

10. You can now close the browser window and Tableau Desktop.

Optional: Install Python & Required Modules
-----------------------------------

If you wish to run VizAlerts as a Python script rather than a binary executable, you will need to follow these steps. Otherwise, you can skip this section. Note that the rest of the documentation assumes that you are running the binary executable, so whenever you see instructions to run vizalerts.exe, know that you'll need to use *python .\vizalerts.py* instead. Additionally, please note that while these instructions are specific to Windows, VizAlerts can also be run on Linux.

1.  On the host you want to run VizAlerts from, download and install Python 3.7 or higher. This can be done in multiple ways, but we suggest the MSI installer from: <https://www.python.org/downloads/>. While it's possible to run two separate versions of Python, VizAlerts is only compatible with 3.7 and above, and it can be very confusing to sort out issues when both versions are installed on your machine.

2.  It's recommended that you ensure that Python is added to your environmental PATH variable, when given that option in the installer.

3.  Install the necessary Python modules by running the following commands:

        pip install pyyaml
        pip install requests
        pip install requests\_ntlm
        pip install pypdf2
        pip install twilio
        pip install phonenumberslite

        *  If your computer does not have access to the Internet, see
        [Appendix A](#_Appendix_A).

    **Note**: Despite the requirement to install the last two
    modules, deciding whether to *enable* the Twilio SMS integration
    feature is up to you—either at the environment level, or at more
    flexible sub-levels. Enabling the Twilio SMS integration
    requires a Twilio account (free accounts are available).

    Also, please also note that it’s possible to send SMS messages
    *without* Twilio, as short email messages to subscribers who’s
    mobile network providers have an email-to-SMS gateway available.
    For example<EMAIL_ADDRESS>works in the USA. See the
    SMS Actions section of the VizAlerts User Guide for
    more details.

Configure VizAlerts
-------------------

Now that Python is installed, we can configure VizAlerts. Unzip the
VizAlerts.zip file to a folder of your choosing. For the purposes of
this manual, we’ll assume the files were extracted to C:\\VizAlerts.

1.  The next task is to give VizAlerts all the information it needs to
    connect to our Tableau Server instance. Open the file
    C:\\VizAlerts\\config\\vizalerts.yaml in a text editor. Each of the
    configuration settings in that file are commented to explain what
    they do, but we’ll go over the most important ones here:

Email Settings

smtp.serv

This is the name of your SMTP server.

smtp.address.from

The email address you wish all email alerts to be sent from. Note that for Advanced Alerts, this is used only if the author did not specify their own “from” address in their viz.

smtp.address.to

When an alert fails to run, failure details will be sent to this address along with the Subscriber, so it makes the most sense to use your own address or Admin distribution list here.

smtp.ssl

When true, VizAlerts will attempt to use SSL for email encryption (which your SMTP server must support). If you do not wish to use encryption, leave it “false”.

smtp.user

Username for the account used to connect to your SMTP server. If no authentication is need, leave it “null”

smtp.password

Password for the account used to connect to your SMTP server. If no authentication is need, leave it “null”. The password must be enclosed in single quotes.

 If desired, this value can be a valid path to a .txt file containing the password, e.g. 'c:\users\mcoles\password.txt', rather than the password itself.

Tableau Server Settings

server

Name of the Tableau Server you wish to run this instance of VizAlerts against.

server.version

Major version of the Tableau Server you are running VizAlerts against (this must be 8, 9, or 10)

server.user

This is ANY user licensed in Tableau Server--it does not need to be an Admin, as it is only used in authenticating over HTTP.

· If you are using Active Directory authentication, prepend the domain name in front of the username, e.g. “tableau.com\mcoles”

· If you are using Local Authentication, simply supply the username, e.g., “mcoles”

server.user.domain

The Active Directory domain for the server.user account, leave as null if using local authentication.

server.ssl

When set to true, use SSL to connect to Tableau Server (recommended if you have enabled SSL).

vizalerts.source.viz

This identifies the VizAlerts scheduled alert viz. it must be of the form workbook/viewname. The publishing information for this viz will be used

vizalerts.source.site

Identifies the Tableau Server site for the vizalerts.source.viz.

Security Settings

server.ssl

When set to true, use SSL to connect to Tableau Server (recommended if you have enabled SSL).

server.certcheck

If using SSL then validate the certificate If set to true then you must also specify the server.certfile.

server.certfile

Full path to the set of trusted CA certificates in .pem format

SMS Action Settings

smsaction.enable

Set to True to enable SMS Advanced Alerts to be sent. If set to False then all other smsaction fields are ignored. (Default False)

smsaction.provider

The only supported provider at this time is twilio.

smsaction.account_id

The account ID at the SMS provider.

smsaction.auth_token

Authorization token provided by the SMS provider.

Testing
-------

Whew! All that was lots of fun, but let’s get to the good stuff and test
this thing to see if we did everything right. We’ve got a few tests to
run to validate that everything is working, starting out from simple to
more complicated:

### Can VizAlerts Connect? Test

Run the following from a command prompt on the Windows host you set
VizAlerts up on. By default, VizAlerts will expect you are running it
within the context of the directory you created it in, so change to that
directory first, then run the script:

cd C:\\VizAlerts

C:\\VizAlerts\\vizalerts.exe

It should have successfully generated a Trusted Ticket, queried the
PostgreSQL database in Tableau Server, then realized there was nothing
to do and quit without error. If it didn’t, please see the [Common
Errors](#common-errors) section.

### Simple Alert Test

Now for a more extensive test on a Simple Alert. Subscribe to any
Tableau Server View on a VizAlerts schedule that you set up (pick a view
that renders in less than 10 seconds or so). We recommend subscribing on
a VizAlerts schedule that runs every 15 minutes for this test, even if
you just remove it afterward. After you subscribe, run the command
again:

C:\\VizAlerts\\vizalerts.exe

Now, wait 15 minutes, then run the same command again. If data is
present in the viz, you should receive an email! If not, you shouldn’t.
Simple as that!

### Put VizAlerts Through Its Paces Test

For this test you are going to use the same Tableau workbook that the
VizAlerts contributors use to verify VizAlerts is working after we’ve
changed the code. Note that this workbook only works with Tableau
version 9.0 and up.

1.  In Tableau Desktop open \[VizAlerts
    Install Folder\]\\VizAlerts\\demo\\VizAlertsDemo.twb.

2.  Go to the Advanced Alerts view and set the VizAlerts From Email and
    VizAlerts To Email parameters to your test email address:

3.  Choose Server->Publish workbook… to start the publishing process.
    Use the default settings, which will include the External Files
    option:

    We suggest you publish the workbook in a place where other users who
    will be configuring Advanced Alerts (see the User Guide) can see
    the workbook.

4.  Click through the warning(s) about including external files and
    publish the workbook.

5.  If you’re on Tableau v10 or higher you can skip this step. When the
    confirmation window appears, click Open in browser window to open
    the VizAlertsDemo workbook on Tableau Server.

6.  Login to Tableau Server if you need to and navigate to the Advanced
    Alerts Demo worksheet.

7.  Scroll down in the worksheet and enter a comment with the
    text “test\_alert”.

8.  After the comment has been posted, go back to your Windows command
    prompt and enter:

    C:\\VizAlerts\\vizalerts.exe

    If the script runs and exits the first time without processing
    anything, run it again. (Tableau can take a moment to update the
    data with the “test\_alert” comment that acts as a trigger).
    VizAlerts will now generate 30+ emails with a variety of tests
    demonstrating the VizAlerts features. Read through the emails to
    understand what is expected of each. If you get any error messages
    then check the Common Errors section below as well as the FAQ in the
    User Guide.

### Optional: Send Yourself Some SMS Messages Test

If you have set up the integration with Twilio now’s the time to see if
it works, you’ll be using the same testing workbook from the prior demo.
that the VizAlerts contributors use. Note that this workbook only works
with Tableau version 9.0 and up.

1.  In Tableau Desktop open \[VizAlerts
    Install Folder\]\\VizAlerts\\demo\\VizAlertsDemo.twb.

2.  Go to the SMS Success Tests view and set the VizAlerts To SMS
    parameter to your test SMS phone number:

3.  Choose Server->Publish workbook… to start the publishing process.
    Use the default settings, which will include the External Files
    option:

4.  Click through the warning(s) about including external files and
    publish the workbook.

5.  If you’re on Tableau v10 you can skip this step. When the
    confirmation window appears, click Open in browser window to open
    the VizAlertsDemo workbook on Tableau Server.

6.  Login to Tableau Server if you need to and navigate to the SMS
    Success Tests worksheet.

7.  Scroll down in the worksheet and enter a comment with the
    text “test\_alert”.

8.  After the comment has been posted, go back to your Windows command
    prompt and enter:

    C:\\VizAlerts\\vizalerts.exe

    If the script runs and exits the first time without processing
    anything, run it again. (Tableau can take a moment to update the
    data with the “test\_alert” comment that acts as a trigger).
    VizAlerts will now generate 10 SMS message with a variety of tests
    demonstrating the VizAlerts features. Read through the messages to
    understand what is expected of each. If you get any error messages
    (which will be delivered by email) then check the Common Errors
    section below as well as the FAQ in the User Guide.

Final Steps
-----------

### Set up a Scheduled Task

The last step, now that everything is working as expected, is to
automate this so that VizAlerts can run regularly when it is supposed
to. To do this, we need to set up a Scheduled Task on the Windows host
that VizAlerts runs from, which will run this for us on a regular basis.

First, let’s create a new Task:

Fill in the name and description. Make sure it will run whether the user
is logged in or not. The task should be set up to run under a service
account rather than a personal one, if possible. This account must have
full control permissions on the VizAlerts files, and if you specified
text files instead of passwords in the vizalerts.yaml config file, the
account will need rights to read those files.

Set up the Trigger (when will it run?). We strongly recommend running
this every **1 minute**, as this will keep alerts executing on time, and
the vast majority of executions will be quick checks that don’t actually
do any work:

Set the Action on the Task (what will it do?)

And save the task! You can now test out the task by subscribing the
VizAlertsDemo/AdvancedAlertsDemo view to a subscription and look for an
email.

### Starter Workbook

Last, but not least, publish the \[VizAlerts install
folder\]\\demo\\VizAlertsStarter.tbwx workbook to Tableau Tableau Server,
and grant permissions to anyone you wish to have an easier way to create
Advanced Alerts. This workbook gives users a shortcut to creating them,
with all the necessary action fields and examples on how to use them.

###

FAQ
===

-   **How many alerts can be run at once?**

	Alerts are processed in parallel, according to the number of
    threads you set in the config\\vizalerts.yaml file. They are checked
    according to the Schedule they are associated with, in order of the
    “priority” field in the config workbook. Here’s an example: Alerts
    scheduled for 6:00AM will begin being checked at 6:00AM. If you’re
    running two threads and have three alerts to process then the two
    alerts with the lowest priority settings will be checked first. If
    those two alerts take five minutes each to process then the third
    alert wouldn’t be start to be processed until 6:05am. So two things
    to pay attention to are how long it takes alerts to process (which
    you can see in the VizAlerts logs), the timeout settings (since
    long-running alerts could be caused by a large volume of actions
    and/or views that are slow to render), and the number of alerts that
    are simultaneously scheduled.

	When an alert is triggered, it begins sending emails / SMS notifications.
	These tasks are *also* processed in parallel, according to the number
	defined in the "task_threads" field in the VizAlertsConfig workbook.

-   **Does VizAlerts use a database to log information about what it has
    done?**

	No, not in its current state, though this is the next logical
    progression for it. Currently it logs information into text
    files only.

Common Errors
=============================================================================================================

This section mostly focuses on errors found at installation time. Many
other common error situations are covered in the troubleshooting section
of the VizAlerts User Guide.

-   **Failed with unknown protocol**

    -   This likely means that you’ve enabled SSL in the vizalerts.yml,
        but haven’t set Tableau Server up for it. See [this
        portion](http://onlinehelp.tableau.com/current/server/en-us/ssl_config.htm)
        of the online help on how to do so.

-   **Parsing or yaml scanner errors**

    -   Generally this means that some bad character or formatting issue
        was introduced to the vizalerts.yml file (typically a tab
        character—replace them with spaces!). We recommend using this
        [online YAML validator](http://codebeautify.org/yaml-validator)
        to determine where the problem is (make sure to remove your
        passwords first!).

-   **Invalid regular expression found**

    -   If VizAlerts won’t start, and sends
    -   you an email with this
        message, it means one of two things:

        -   You live in an area where the default delimiter is another
            character besides commas, such as semicolon. To fix this,
            just open config\\vizalerts.yaml, and change the
            data.coldelimter to ‘;’ instead of ‘,’.

        -   One of the regular expressions in your VizAlertsConfig.twb
            fields is not correct. Test it out at <http://regexr.com/>
            to make sure it’s behaving.

-   **HTTP 406 error**

    -   You might see the following error: export\_view - HTTP error
        getting vizdata from url
        [http://\[your](http://[your) server\]/views/VizAlerts/AlertList?&:format=csv&:refresh=y.
        Code: 406 Reason: Not Acceptable

        This would be due to not embedding the password for the readonly
        user into the VizAlertsConfig workbook.

    -   If you see a 406 on a standard VizAlert, it generally means that
        Tableau Server could not export the view for some reason. This
        could be due to a variety of causes:

        -   The subscriber does not have access to the view

        -   The view could not connect to its data source for some
            reason

        -   A Tableau Server process crashed when it tried to load the
            view

        -   The view had an invalid calculation and couldn’t be loaded

-   **Trusted ticket failure**

    -   Check to ensure your trusted tickets were [configured
        properly](http://onlinehelp.tableau.com/current/server/en-us/trusted_auth_trustIP.htm).
        If things are still not working, try [this
        article](http://kb.tableau.com/articles/knowledgebase/testing-trusted-authentication)
        to test them further.

    -   A “-1” result could be due to several possible issues. Please
        see [this
        article](http://onlinehelp.tableau.com/current/server/en-us/trusted_auth_trouble_1return.htm)
        if you’re seeing this error.

-   **Unable to export … as CSV**

    -   This means that the attempt to export the view data for an alert
        to a CSV file failed, either because of internal errors, or
        because it took longer than the timeout you’ve set in the
        config file. If the view can be rendered successfully in your
        browser, it may simply be taking too long. Increasing the
        timeout settings may help with this, but a better solution is to
        try and optimize the viz to render more quickly. By default, the
        settings use stricter timeouts on more frequently-run alerts, as
        it’s assumed they’ll have more opportunities to be retried.

-   **Exporting Views - Unable to write to folder**

    -   The Tableau Server “run as” user must have read/write
        permissions on any folders used for exporting views.

Getting VizAlerts Help
======================

First of all, check with any local admins and any local documentation
that might exist. After that, the center for all things VizAlerts is the
VizAlerts Group on the Tableau Community
<https://community.tableau.com/vizalerts>

Contributing to VizAlerts
=======================================================================================================================

VizAlerts is an open source project distributed under the MIT License.
If you’d like to contribute ideas or code to VizAlerts, please visit the
VizAlerts GitHub site at <https://github.com/tableau/VizAlerts>.

Appendix A
======================================================================================================

Installing Python modules with no Internet access
-------------------------------------------------

Setting VizAlerts up on a secure machine that isn’t connected to the
Internet can be done by following these instructions. It essentially
requires that you download the files that you need from a machine that
is connected to the Internet, then copy them over to the secured machine
you’ll be running VizAlerts from.

1.  First, download the Python [install file](#_Install_Python_&).
    Install it on the Internet-connected machine you’re using to
    download files, then copy it to your VizAlerts host and install
    Python there too. On both machines, you may wish to follow Step 2 as
    well, and add the Python executables to your PATH
    environment variable.

2.  From your Internet-connected machine, run the following commands to
    download all of the required Python modules (feel free to adjust the
    path they download to). These function as basically offline package
    repositories:

    *pip install --download c:\\mypythonpackages pyyaml*

    *pip install --download c:\\mypythonpackages requests*

    *pip install --download c:\\mypythonpackages requests\_ntlm*

    *pip install --download c:\\mypythonpackages pypdf2*

    *pip install --download c:\\mypythonpackages phonenumberslite*

    *pip install --download c:\\mypythonpackages twilio*

3.  Copy the entire folder to your offline machine (I'm assuming here
    that it's copied to the same path).

4.  On your offline machine, install the package from the newly copied
    folder:

    *pip install --no-index --find-links file:c:\\mypythonpackages
    pyyaml*

    *pip install --no-index --find-links file:c:\\mypythonpackages
    requests*

    *pip install --no-index --find-links file:c:\\mypythonpackages
    requests\_ntlm*

    *pip install --no-index --find-links file:c:\\mypythonpackages
    pypdf2 *

    *pip install --no-index --find-links file:c:\\mypythonpackages
    phonenumberslite*

    *pip install --no-index --find-links file:c:\\mypythonpackages
    twilio

5.  Check for errors in the output. If there are none, you’ve
    successfully got Python and all the modules installed!

repository: tableau/VizAlerts

repo_name: tableau/VizAlerts


text:
## Current state

decor generally solves the problem it was intended to solve, e.g. 'normally' annotated functions are parsed properly.
The open issues generally revolve around special cases like having comments in the argument list, different ways of specifying constant references, and improved error messages when parsing fails for whatever reason.

I think work could be done to address these things, but it is somewhat low priority, as there are simple workarounds (just don't use these special formats).

license: MIT

repository: romainfrancois/decor

branch_name: refs/heads/main

extension: md

gha_license_id: NOASSERTION

license_type: permissive

repo_name: romainfrancois/decor


text:
---
id: 1
title: Software Engineer
---

### Silicon Valley Insight | May 2018 - Current

### Chat Application

I solely worked on the Web counterpart of a customer service oriented chat application.

Specifically:

- I worked on translating business requirements into UI
- Implemented an internal port of [react-native-gifted-chat](https://github.com/FaridSafi/react-native-gifted-chat) with Material UI in order to reuse chat logic the across the Mobile & Web application
- Ensured it was fast, mobile responsive, and supported browser notifications

_React, NextJS, GraphQL, MaterialUI, Cypress, Twilio_

### Cryptocurrency Data platform

Worked on a dataplatform that gathers ticker data from 5 cryptocurrency exchanges into an AWS data lake. This data is then exposed on a GraphQL endpoint through Elasticsearch.

Specifically:

#### Frontend

- Implemented dashboard screens with data visualizations on high-frequency cryptocurrency ticker data, similar to stock charts.

_React, NextJS, GraphQL, recharts_

#### Backend

- Implemented ETL functions that injest the data from API endpoints of these cryptocurrency exchanges. Most of them were through websockets and we had to parse these different shapes of data into a unified standard to be able to calculate a "blended" price.

- Created the Elasticsearch service through AWS Kibana to allow lightning fast queries into our AWS S3 data lake.

- Implemented the Node GraphQL server schema & resolver functions that connect to our elasticsearch service in order to provide unified data to the front-end client.

_AWS, Kibana Elasticsearch, GraphQL_

repository: KyruCabading/gatsby-resume

branch_name: refs/heads/master

gha_language: JavaScript

gha_license_id: MIT

repo_name: KyruCabading/gatsby-resume


text:
Ansible role to install the Consul.io Service discovery and clustering framework (http://consul.io). The role targets linux, and aims to be as generic as possible, avoiding package managers, installing to '/opt' and optionally using the supervisord process manager to control the service.

```bash
ansible-galaxy install -p <your_roles> sgargan.consul
```

The role can be used to install either the server or the agent. It installs the agent by default, and the server by setting the consul_server flag to true when calling role

```yaml
- hosts: consul_agents
  sudo: true

  role:
    - sgargan.consul
```

```yaml
- hosts: consul_servers
  sudo: true

  role:
    - {role: sgargan.consul, consul_server: true}
```

Bootstrapping
-------------

Note that by default when creating a server cluster you need to have the servers to elect a leader until all the servers are ready. This is called bootstrapping and can be read about in detail [here](https://consul.io/docs/guides/bootstrapping.html).

To bootstrap the servers you pass a group of servers to the role as it is being applied, usually this will be the group that the role is being run against e.g. consul_servers. This consul_join group is passed as follows.

```yaml
- hosts: consul_servers
  sudo: true

  role:
    - {role: sgargan.consul, consul_server: true, consul_join: '{{groups["consul_servers"]}}'}
```

Consul will expect the number of servers in the supplied group to join the cluster and will wait to beging the leader election until at least that many servers have joined.

Joining
-------

For the agent role this consul_join can be used to supply the list of servers to join when the agent starts e.g.

```yaml
- hosts: consul_agents
  sudo: true

  role:
    - {role: sgargan.consul, , consul_join: ['consul-1.dc1.example.io', 'consul-2.dc1.example.io', 'consul-2.dc1.example.io']}
```

Using Supervisor
----------------

I like to use Supervisor to manage the Consul process lifecycle, the consul role does not have a dependency on supervisor role, so you must apply it yourself. A complimentary Supervisor role can be downloaded from galaxy as follows

```bash
ansible-galaxy install -p <your_roles> sgargan.supervisor
```

To use this in a playbook and have the consul role generate a supervisor config you need to invoke the role and supply the consul_supervisor_enabled flag.

```yaml
- hosts: consul_servers
  sudo: true

  role:
    - {role: sgargan.supervisor}
    - {role: sgargan.consul, consul_server: true, consul_join: '{{groups["consul_servers"]}}', consul_supervisor_enabled: true}
```

For more information on using supervisor see

repository: tsaridas/consul

gha_language: Shell

repo_name: tsaridas/consul


text:
# React-Static - Dynamic Imports Example

This example of React Static includes:
- Babel
- CSS imports
- Image imports
- File imports
- Automatic Routing
- Runtime Code Splitting

To get started, run `react-static create` and use the `dynamic-imports` template.

repository: balena-io-modules/react-static

repo_name: balena-io-modules/react-static


text:
---
layout: post
title: 美国部分年份GDP数据
date: 2018-01-31 12:45:45 +0800
tag: [杂]
---

## 美国 GDP 各部分数据 （单位：十亿美元）

<!-- | 水果        | 价格    |  数量  |
| --------   | -----:   | :----: |
| hehe        | $1      |   5    |
| 苹果        | $1      |   6    |
| 草莓        | $1      |   7    | -->

||1950|1970|1990|2010|
|:-|-:|-:|-:|-:|
|真实GDP|2184.0|4722.0|8955.0|14783.8|
|消费|1360.5|2903.0|5672.6|10036.3|
|投资|293.7|585.2|1240.6|2120.4|
|政府购买|569.6|1457.7|2224.3|3091.4|
|净出口|-12.1|-66.6|-76.5|-458.8|
|国防购买|---|---|---|813.5|
|州和地方购买|---|---|---|1820.8|

## 美国 GDP 各部分所占百分比

||1950|1970|1990|2010|
|-|-:|-:|-:|-:|
|消费|62.3%|61.5%|63.3%|67.9%|
|投资|13.4%|12.4%|13.9%|14.3%|
|政府购买|26.1%|30.9%|24.8%|20.9%|
|净出口|-0.6%|-1.4%|-0.85%|-3.1%|
|国防购买|---|---|---|5.5%|
|州和地方购买|---|---|---|12.3%|

注：

1. 数据说明：Table 1.1.6. Real Gross Domestic Product, Chained Dollars [Billions of chained (2009) dollars] Last Revised on: January 26, 2018 - Next Release Date February 28, 2018. Note. Chained (2009) dollar series are calculated as the product of the chain-type quantity index and the 2009 current-dollar value of the corresponding series, divided by 100. Because the formula for the chain-type quantity indexes uses weights of more than one period, the corresponding chained-dollar estimates are usually not additive. The residual line is the difference between the first line and the sum of the most detailed lines.
2. 消费：Personal consumption expenditures，投资：Gross private domestic investment，净出口：Net exports of goods and services，政府购买：Government consumption expenditures and gross investment
3. 数据来源：U.S. Bureau of Economic Analysis, “Table 1.1.6. Real Gross Domestic Product, Chained Dollars” [https://www.bea.gov/iTable/iTableHtml.cfm?reqid=19&step=3&isuri=1&1910=x&0=-9&1921=survey&1903=6&1904=2015&1905=2017&1906=a&1911=0](https://www.bea.gov/iTable/iTableHtml.cfm?reqid=19&step=3&isuri=1&1910=x&0=-9&1921=survey&1903=6&1904=2015&1905=2017&1906=a&1911=0) (accessed January 31, 2018).

gha_language: CSS


text:
# Performance Notes
All these tests are done on OSX 10.9.1 on a Macbook Air 13 inch with a Haswell i7.

## Engine::Event
Tested using CoreEventTest on version `GIT_0eb0d5e`

```
C++ Event::On Performance Test x 2: 9.05991e-06s
C++ Event::Emit Performance Test x 2: 9.53674e-07s
C++ Event::Emit Performance Test x 200000: 0.0774059s
C++ Event::Emit No Target Performance Test x 200000: 0.0258801s
C++ -> JavaScript Event::Emit Performance Test x 2: 4.05312e-06s
C++ -> JavaScript Event::Emit Performance Test x 100000: 0.145679s
```

New test on version `GIT_79d8e8d`

```
C++ Event::On Performance Test x 2: 5.96046e-06s
C++ Event::Emit Performance Test x 2: 9.53674e-07s
C++ Event::Emit Performance Test x 200000: 0.031553s
C++ Event::Emit No Target Performance Test x 200000: 0.00313091s
C++ -> JavaScript Event::Emit Performance Test x 2: 9.53674e-07s
C++ -> JavaScript Event::Emit Performance Test x 200000: 0.0444219s
```


text:
# delayed-promise

[![Travis](https://img.shields.io/travis/mpt0/node-delayed-promise.svg)]()
[![npm](https://img.shields.io/npm/v/delayed-promise.svg)]()
[![npm](https://img.shields.io/npm/l/delayed-promise.svg)]()

Utility for delayed promise rejection handling

## Installation
```bash
npm install delayed-promise
```

## Usage
```js
const delay = require('delayed-promise');

async function example() {

	// Wrap a promise to retrieve it's state later:
	let delayedPromise = delay(getPromise());

	// ...Other async code...

	// Unwrap the promise & retrieve it's state:
	await delayedPromise();
}
```

## Running tests
In the package directory, type: `npm test`

repository: peterjuras/node-delayed-promise

repo_name: peterjuras/node-delayed-promise


text:
## Monitor (sync primitive)

A monitor consists of a **mutex** (lock) object and one or more **condition variables**. A condition variable is basically a container of threads that are waiting for a certain condition. There are two main operations on condition variables
- wait / await
- notify / signal
- notifyAll / signalAll / broadcast

Conditional variable methods should be called only ???when owned mutex.

### In java
#### Implicit monitor (synchronized / Object.wait()/.notify()/.notifyAll())
#### java.util.concurrenct.locks.{Lock, Condition}

#### ??? Every conditional variable must be associated with some mutex?

repository: golovach-ivan/Correct-by-Construction

repo_name: golovach-ivan/Correct-by-Construction


text:
Repo command

Opens the repository homepage

Supported for repositories hosted on [GitHub](https://github.com/),
[GitLab](https://gitlab.com/), [Gitea](https://gitea.com/), and
[Bitbucket](https://bitbucket.org/). Derives the Git provider from the `origin`
remote. You can override this detection with
`git config git-town.code-hosting-driver <DRIVER>` where DRIVER is "github",
"gitlab", "gitea", or "bitbucket".

When using SSH identities, run
`git config git-town.code-hosting-origin-hostname <HOSTNAME>` where HOSTNAME
matches what is in your ssh config file.

#### Usage

git town repo

repository: SpringTrainingProg/git-town

repo_name: SpringTrainingProg/git-town


text:
# IBM Watson
| Github Repo | C Header | C source  | JS source |
| ----------- | -------- | --------  | ----------------- |
| [mongoose-os-libs/watson](https://github.com/mongoose-os-libs/watson) | [mgos_watson.h](https://github.com/mongoose-os-libs/watson/tree/master/include/mgos_watson.h) |    | [api_watson.js](https://github.com/mongoose-os-libs/watson/tree/master/mjs_fs/api_watson.js)         |

This library provides [IBM Watson IoT Platform](https://internetofthings.ibmcloud.com/) support for Mongoose OS.

## QuickStart setup

The easiest way to setup Watson IoT Platform cloud connection is by using `mos watson-iot-setup`.
```
$ mos watson-iot-setup
```

This does not require any credentials and will set up the device for [QuickStart cloud dashboard](https://quickstart.internetofthings.ibmcloud.com/#/) connectivity.
With QuickStart dashboard, you will be able to send data from the device at a limited rate but device management (sending commands to the device) is not available.

## Own IBM Cloud Account setup

If you already have an IBM Cloud account and a cloud orgaization set up (you can register for a free trial [here](https://www.ibm.com/internet-of-things/spotlight/watson-iot-platform)) you can use `mos` to add a device to your org.

You will need to obtain app access credentials for `mos` to use:

 * In the left side pane og your Watson IoT Platform dashboard select *Apps*
 * Click the *Generate API Key* button in the upper right corner
 * For description, enter any meaningful text - e.g. "MOS CLI tool" and click *Next*
 * For *Role* select *Standard Application*
 * Copy the *API Key* and *Authentication Token* and use them on the `mos` command line:

```
$ mos watson-iot-setup --watson-api-key a-bcdefgh-qwertyio --watson-api-auth-token "tokengoeshere"
Using port /dev/ttyUSB0
Connecting to the device...
  esp8266 1AFE34A5930F running demo-c
Org ID: bcdefgh
Device ID: esp8266_A5930F
Checking device type "mos"...
Creating device "esp8266_A5930F"...

Updating config:
  device.id = esp8266_A5930F
  watson.client_id = d:bcdefgh:mos:esp8266_A5930F
  watson.enable = true
  watson.host_name = bcdefgh.messaging.internetofthings.ibmcloud.com
  watson.token = SECRET
Setting new configuration...
Saving and rebooting...
```
_Note: As with other flags, values can be specified as environment variables: `MOS_WATSON_API_KEY` and `MOS_WATSON_API_AUTH_TOKEN`._

Invoked with no additional flags, as above, `mos` will use device type `mos` (will be created if necessary) and device ID derived from platform and the device's unique ID (usually MAC address) and a random auth token. Additional flags can be provided to override these defaults:
 * `--watson-device-type` - specifies device type
 * `--watson-device-id` - specifies device id
 * `--watson-device-auth-token` - specifies device auth token instead of generating a random one
 * `--watson-api-host-name` - use this host name for API calls instead of `ORG_ID.internetofthings.ibmcloud.com`
 * `--watson-messaging-host-name` - use this host name for device connections instead of `ORG_ID.messaging.internetofthings.ibmcloud.com`

 -----
#### mgos_watson_send_event_jsonf

```c
bool mgos_watson_send_event_jsonf(const char *event_id, const char *json_fmt,
                                  ...);
bool mgos_watson_send_event_jsonp(const struct mg_str *event_id,
                                  const struct mg_str *body);
```
>
> Send an event, in JSON format.
> The message should be an object with a "d" key and properties, e.g.:
> `mgos_watson_send_eventf("{d: {foo: %d}}", foo);`
>

### JS API

 ---

repository: autonomycoop/mongoose-os-docs

repo_name: autonomycoop/mongoose-os-docs


text:
---
# An instance of the Experience widget.
# Documentation: https://sourcethemes.com/academic/docs/page-builder/
widget: experience

# Activate this widget? true/false
active: true

# This file represents a page section.
headless: true

# Order that this section appears on the page.
weight: 40

title: Experience
subtitle:

# Date format
#   Refer to https://sourcethemes.com/academic/docs/customization/#date-format
date_format: Jan 2006

# Experiences.
#   Add/remove as many `experience` blocks below as you like.
#   Required fields are `title`, `company`, and `date_start`.
#   Leave `date_end` empty if it's your current employer.
#   You can begin a multiline `description` using YAML's `|-`.
experience:
- company: Workday
  company_url: "https://workday.com"
  date_end: ""
  date_start: "2019-05-20"
  description: |-
    * Development and Operations

      * Implementing policy-based infrastructure management using OPA and Atlantis improving developer experience while providing them more control over their resources and helping them shift security best practices to the left.
      * Mentoring developers and junior engineers as they grow into their role.
      * Created an automated AWS deployment pipeline to deploy microservice application cross account and cross region;
      reducing operations toil by several hours.
      * Actively manage, improve, and monitor infrastructure resources in DC and on AWS including but not limited to
        EC2, ECS, Route53, S3, RDS, Lambda, ES etc. using tools like terraform, wavefront, ELK stack and slack.
      * Introduced team to using policies (OPA) for managing infrastructure giving developers more control over their cloud resources.
      * Writing ansible roles to help manage the hosts and perform application deployment.
      * Writing Jenkinsfiles and improving shared libraries for automated build and deployment of several applications and services using Jenkins.
      * Migrating application services to an in-house flavor of Kubernetes platform.
    * Knowledge Share

      * Spearheaded an initiative between Ops and multiple dev teams to empower the developers with the knowledge
    they would need to take ownership of their services.
    * Scrum Master

      * Helping team self organize and self manage by incorporating servant leadership principles.
  location: Victoria, BC, Canada
  title: |-
    * Senior Software Development Engineer, DevOps
    * Software Development Engineer III, DevOps
    * Software Development Engineer II, DevOps
- company: NYU CUSP
  company_url: "https://cusp.nyu.edu"
  date_end: "2019-05-14"
  date_start: "2014-06-01"
  description: |-
    * Developed a scalable and secure container scheduling and monitoring infrastructure (PAAS)
    * Architected the NYU/CUSP Urban Observatory’s multi-site physical infrastructure (Distributed Systems, Networking)
    * Developed a secure machine critical IoT platform and implemented a CI/CD framework for deploying and
      maintaining over 100 urban noise monitoring sensors in NYC (CI/CD, IoT)
  location: New York City, NY, USA
  title: |-
    * Associate Research Scientist
    * Assistant Research Scientist
---

gha_language: SCSS


text:
# readmeGenerator
# README Generator

## Description
User can use this application to generate README files for their Github Repository

Video: https://drive.google.com/file/d/12GRN7LysCzVo1AUy5wSS-BH8z6TMvKLL/view

## Table of Contents
* [Installation](#installation)
* [Usage](#usage)
* [License](#license)
* [Contributions](#contributions)
* [Tests](#tests)
* [Questions](#questions)

## Installation
User should have NPM installed before using this application

## Usage
Application will run using node in their Terminal

## License
MIT

## Contributions
Anyone can contribute by just forking this repository

## Tests
Applciation was tested using NPM

## Questions
Questions about this repository? Please contact me at [nmaksudov@yahoo.com](mailto:nmaksudov@yahoo.com). View more of my work in GitHub at [https://github.com/Nodirbek94](https://github.com/Nodirbek94)


text:
---
layout: feature
title: 'Voice'
shortdef: 'voice'
udver: '2'
---

  Values:
  Cau
  Mid
  Pass
  Rcp

Voice is typically a feature of [verbs](u-pos/VERB) and verbal affixes/clitics categorized as [auxiliaries](bej-pos/AUX).

### `Mid`: middle voice

Between active and passive.
The subject is both doer and undergoer in a sense:
he is acting upon himself.

#### Examples
- _a- gar jʔ -an =t i= gaw =i /_ "I went back, in my house."

#### Examples
- _uː= dhaj kass =aː i- ktiːn -n =i kaːm =u =it / ʔajaːj tak =uːn hoːj am- mar~ri -ja eːn eː= nda /_ "Because it was a camel that everybody knew; one of our relatives (told) to these men"

### `Pass`: passive or patient-focus voice

The subject of the verb is affected by the action (patient). The doer
(agent) is not unexpressed in Beja.

#### Examples
- _i= magʷal hoːg -aː =b =u =it ki= i- t- kattaːm /_

### `Cau`: causative voice

Causative expresses a subject that is the cause of the action done by a distinct agent and is described by the verbal affix categorized as [auxiliaries](bej-pos/AUX).

#### Examples
- _uː= tak ʔaraːw =i aka -jeː hoːj giːg -is -ta =ja_ "you made the man who is my friend leave for good!"

repository: UniversalDependencies/docs

branch_name: refs/heads/pages-source

gha_language: HTML

repo_name: UniversalDependencies/docs


text:
# StructEdit: Learning Structural Shape Variations

![Overview](https://github.com/daerduoCarey/structedit/blob/master/images/teaser.png)

**Figure 1.** Edit generation and transfer with StructEdit. We present StructEdit, a method that learns a distribution of shape differences between structured objects that can be used to generate a large variety of edits (first row); and accurately transfer edits between different objects and across different modalities (second row). Edits can be both geometric and topological.

## Introduction
We learn local shape edits (shape deltas) space that captures both discrete structural changes and continuous variations. Our approach is based on a conditional variational autoencoder (cVAE) for encoding and decoding shape deltas, conditioned on a source shape. The learned shape delta spaces support shape edit suggestions, shape analogy, and shape edit transfer, much better than StructureNet, on the PartNet dataset.

## About the paper

Our team:
[Kaichun Mo](https://cs.stanford.edu/~kaichun),
[Paul Guerrero](http://paulguerrero.net/),
[Li Yi](https://cs.stanford.edu/~ericyi/),
[Hao Su](http://cseweb.ucsd.edu/~haosu/),
[Peter Wonka](http://peterwonka.net/),
[Niloy Mitra](http://www0.cs.ucl.ac.uk/staff/n.mitra/),
and [Leonidas J. Guibas](https://geometry.stanford.edu/member/guibas/)
from
Stanford University, University College London (UCL), University of California San Diego (UCSD), King Abdullah University of Science and Technology (KAUST), Adobe Research, Google Research and Facebook AI Research.

Arxiv Version: https://arxiv.org/abs/1911.11098

Accepted by CVPR 2020. See you at Seattle in June, 2020!

Project Page: https://cs.stanford.edu/~kaichun/structedit/

## Citations

    @InProceedings{Mo19StructEdit,
        author = {Mo, Kaichun and Guerrero, Paul and Yi, Li and Su, Hao and Wonka, Peter and Mitra, Niloy and Guibas, Leonidas},
        title = {{StructEdit}: Learning Structural Shape Variations},
        booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
        month = {June},
        year = {2020}
    }

## About this repository

This repository provides data and code as follows.

```
    data/                   # contains data, models, results, logs
    code/                   # contains code and scripts
         # please follow `code/README.md` to run the code
    stats/                  # contains helper statistics
    gen_synshapes/          # contains code to generate SynShapes dataset
         # please follow `gen_synshapes/README.md` to run the code
```

This code has been tested on Ubuntu 16.04 with Cuda 9.0, GCC 5.4.0, Python 3.6.5, PyTorch 1.1.0, Jupyter IPython Notebook 5.7.8.

## Questions

Please post issues for questions and more helps on this Github repo page. We encourage using Github issues instead of sending us emails since your questions may benefit others.

## License

MIT License

## Updates

* [Dec 4, 2019] Data and Code released.

repository: jeonghyunkeem/structedit

repo_name: jeonghyunkeem/structedit


text:
# Bspwm / Mousebind

## Subject

* [Window Move](#window-move)
* [Window Resize](#window-resize)

## Link

* [docs-spec-mousebind](../../../docs/spec/Mousebind.md)
* [spec-keybind](spec-keybind.md)

## Window Move

| Key | Description |
| --- | --- |
| `Win + [Mouse Left Drag]` | Window Move On Floating |

## Window Resize

| Key | Description |
| --- | --- |
| `Win + [Mouse Right Drag]` | Window Resize |
| `Win + [Mouse Middle Drag]` | Window Resize |


text:
+++
title = "Deploying KEDA"
date = "2017-10-05"
fragment = "content"
weight = 100
+++

We provide a few approaches to deploy KEDA in your Kubernetes clusters:

- Operator framework
- Helm charts
- Azure Function Core Tools
- YAML declarations

Don't see what you need? Feel free to [create an issue](https://github.com/kedacore/keda) on our GitHub repo.

## Deploying with a Helm chart

Deploying KEDA with Helm is very simple:

1. Add Helm repo

```cli
helm repo add kedacore https://kedacore.azureedge.net/helm
```

2. Update Helm repo
```cli
helm repo update
```

3. Install `keda-edge` Helm chart

```cli
helm install kedacore/keda-edge --devel --set logLevel=debug --namespace keda --name keda
```

You can use our ARM image instead by adding `--set image.tag=arm` to your helm install command.

## Deploying with the Azure Functions Core Tools
KEDA supports autoscaling a variety of workloads, including Azure Functions.  KEDA is is included in the [Azure Functions Core Tools](https://github.com/Azure/azure-functions-core-tools).

Here is how you can easily install KEDA with the Azure Functions CLI:
```
func kubernetes install --namespace keda
```

## Deploying using the deploy yaml
If you want to try KEDA on minikube or a different Kubernetes deployment without using Helm you can still deploy with `kubectl`.

We provide sample YAML declarations which includes our CRD - You can find them in our `/deploy` directory on our [GitHub repo](https://github.com/kedacore/keda).

```
kubectl apply -f deploy/crds/keda.k8s.io_scaledobjects_crd.yaml
kubectl apply -f deploy/crds/keda.k8s.io_triggerauthentications_crd.yaml
kubectl apply -f deploy/
```

repository: smartfrog-oss/keda-docs

repo_name: smartfrog-oss/keda-docs


text:
---
layout: post
comments: true
title: Passed AZ100 Microsoft Azure Infrastructure and Deployment
excerpt: Passed AZ100 Microsoft Azure Infrastructure and Deployment
date: 2018-10-11 10:16:00 +0300
img: 24.1.png # Add image post (optional)
fig-caption: # Add figcaption (optional)
category: [certifications]
tags: [az-100, az-101, Azure, Azure Administrator, Cloud, Microsoft] # add tag
---

As you probably know, after last [Microsoft Ignite 2018 in Orlando](https://www.microsoft.com/en-us/ignite) and previously at [Microsoft Inspire 2018 in Las Vegas](https://partner.microsoft.com/en-ee/inspire/), Microsoft has recently changed Azure certifications.

Traditional Microsoft Azure certifications were too broad, covering a huge range of skills. Also, Azure capabilities are continuously expanding and diversifying, making it difficult to maintain under one only big exam.

To fix that end, Microsoft has moved to 3 role-based certifications:

* Microsoft Certified Azure Developer
* Microsoft Certified Azure Administrator
* Microsoft Certified Azure Architect

These new grouping of exams makes more sense than in the past, allowing to focus more on the skills and concepts needed for specific job roles, and avoiding unnecessary things.

(More info about new certifications: [https://www.microsoft.com/en-us/learning/browse-new-certification.aspx](https://www.microsoft.com/en-us/learning/browse-new-certification.aspx))

I passed one of these new beta exams: [Exam AZ-100: Microsoft Azure Infrastructure and Deployment](https://www.microsoft.com/en-us/learning/exam-az-100.aspx)

![Passed AZ-100 Azure Administrator]({{site.baseurl}}/assets/img/24.1.png)

extension: markdown


text:
**DEPRECATED**

**Please use https://github.com/bluet/docker-cronicle-docker instead.**

# docker-cronicle
[![Build status](https://img.shields.io/docker/build/intelliops/cronicle.svg)](https://hub.docker.com/r/intelliops/cronicle) [![Build status](https://img.shields.io/travis/belsander/docker-cronicle/master.svg)](https://travis-ci.org/belsander/docker-cronicle)

Docker container for a Cronicle single-server master node

# Supported tags

* `0.8.28`, `latest` [Dockerfile](https://raw.githubusercontent.com/belsander/docker-cronicle/master/Dockerfile)
* `0.8.28-letsencrypt`, `letsencrypt` [Dockerfile.letsencrypt](https://raw.githubusercontent.com/belsander/docker-cronicle/master/Dockerfile.letsencrypt)
* `0.8.28-s3`, `s3` [Dockerfile.s3](https://raw.githubusercontent.com/belsander/docker-cronicle/master/Dockerfile.s3)

## latest
Latest version of Cronicle server based upon nodejs Docker image.

## letsencrypt
Same as the `latest` Docker image, but with support for Let's Encrypt
certificates. Which means that the Cronicle server can be used with SSL and a
Let's Encrypt certificate. If this is not needed, just use the tag `latest`.

## s3
Same as the `latest` Docker image, but with support for Amazon S3 storage. If
there is no need for S3, again, just go for `latest`.

# Usage

## Install
```sh
docker pull intelliops/cronicle:latest
```

## Running
```sh
docker run --name cronicle --hostname localhost -p 3012:3012 intelliops/cronicle:latest
```

Alternatively with persistent data and logs:
```sh
docker run --name cronicle \
  -v /path-to-cronicle-storage/data:/opt/cronicle/data:rw \
  -v /path-to-cronicle-storage/logs:/opt/cronicle/logs:rw \
  --hostname localhost -p 3012:3012 intelliops/cronicle:latest
```

The web UI will be available at: http://localhost:3012

> NOTE: please replace the hostname `localhost`, this is only for testing
> purposes! If you rename the hostname also consider setting the environmental
> variable `CRONICLE_base_app_url`.
> e.g `docker run --name cronicle --hostname cronicle-host -p 3012:3012 -e CRONICLE_base_app_url='http://cronicle-host:3012' intelliops/cronicle:latest`

## Volumes
Cronicle process runs under the `cronicle` user with `ID 1001` and `GUID `1001`.  If you are using Docker bind mounts set permissions accordingly.

| Path | Description |
|--------|--------|
| /opt/cronicle/data | Volume for data |
| /opt/cronicle/logs | Volume for logs |
| /opt/cronicle/plugins | Volume for plugins |

## Configuration

### Environmental variables
Cronicle supports a special environment variable syntax, which can specify command-line options as well as override any configuration settings.  The variable name syntax is `CRONICLE_key` where `key` is one of several command-line options (see table below) or a JSON configuration property path.

For overriding configuration properties by environment variable, you can specify any top-level JSON key from `config.json`, or a *path* to a nested property using double-underscore (`__`) as a path separator.  For boolean properties, you can specify `1` for true and `0` for false.  Here is an example of some of the possibilities available:

| Environmental variable | Description | Default value |
|--------|--------|--------|
| CRONICLE_base_app_url | A fully-qualified URL to Cronicle on your server, including the port if non-standard. This is used for self-referencing URLs. | http://localhost:3012 |
| CRONICLE_WebServer__http_port | The HTTP port for the web UI of your Cronicle server. (Keep default value, unless you know what you are doing) | 3012 |
| CRONICLE_WebServer__https_port | The SSL port for the web UI of your Cronicle server. (Keep default value, unless you know what you are doing) | 443 |
| CRONICLE_web_socket_use_hostnames | Setting this parameter to `1` will force Cronicle's Web UI to connect to the back-end servers using their hostnames rather than IP addresses. This includes both AJAX API calls and Websocket streams. | 1 |
| CRONICLE_server_comm_use_hostnames | Setting this parameter to `1` will force the Cronicle servers to connect to each other using hostnames rather than LAN IP addresses. | 1 |
| CRONICLE_web_direct_connect | When this property is set to `0`, the Cronicle Web UI will connect to whatever hostname/port is on the URL. It is expected that this hostname/port will always resolve to your master server. This is useful for single server setups, situations when your users do not have direct access to your Cronicle servers via their IPs or hostnames, or if you are running behind some kind of reverse proxy. If you set this parameter to `1`, then the Cronicle web application will connect directly to your individual Cronicle servers. This is more for multi-server configurations, especially when running behind a load balancer with multiple backup servers. The Web UI must always connect to the master server, so if you have multiple backup servers, it needs a direct connection. | 0 |
| CRONICLE_socket_io_transports | This allows you to customize the socket.io transports used to connect to the server for real-time updates. If you are trying to run Cronicle in an environment where WebSockets are not allowed (perhaps an ancient firewall or proxy), you can change this array to contain the `polling` transport first. Otherwise set it to `["websocket"]` | ["polling", "websocket"]

### Custom configuration file
A custom configuration file can be provide in the following location:
```sh
/path-to-cronicle-storage/data/config.json.import
```
The file will get loaded the very first time Cronicle is started. If afterwards
a forced reload of the custom configuration is needed remove the following file
and restart the Docker container:
```sh
/path-to-cronicle-storage/data/.setup_done
```

## Web UI credentials
The default credentials for the web interface are: `admin` / `admin`

# Reference
https://github.com/jhuckaby/Cronicle

repository: bluet/docker-cronicle

repo_name: bluet/docker-cronicle


text:
# kube-state-metrics Helm Chart

Installs the [kube-state-metrics agent](https://github.com/kubernetes/kube-state-metrics).

## Get Repo Info

```console
helm repo add kube-state-metrics https://kubernetes.github.io/kube-state-metrics
helm repo update
```

_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._

## Install Chart

```console
# Helm 3
$ helm install [RELEASE_NAME] kube-state-metrics/kube-state-metrics [flags]

# Helm 2
$ helm install --name [RELEASE_NAME] kube-state-metrics/kube-state-metrics [flags]
```

_See [configuration](#configuration) below._

_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._

## Uninstall Chart

```console
# Helm 3
$ helm uninstall [RELEASE_NAME]

# Helm 2
# helm delete --purge [RELEASE_NAME]
```

This removes all the Kubernetes components associated with the chart and deletes the release.

_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._

## Upgrading Chart

```console
# Helm 3 or 2
$ helm upgrade [RELEASE_NAME] kube-state-metrics/kube-state-metrics [flags]
```

_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._

### From stable/kube-state-metrics

You can upgrade in-place:

1. [get repo info](#get-repo-info)
1. [upgrade](#upgrading-chart) your existing release name using the new chart repo

## Configuration

See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments:

```console
helm show values kube-state-metrics/kube-state-metrics
```

You may also `helm show values` on this chart's [dependencies](#dependencies) for additional options.

repository: ahmeddrawy/kube-state-metrics

repo_name: ahmeddrawy/kube-state-metrics


text:
---
title: The Web We Want Survey Results
description: Looking at what the web community prioritizes out of winning Web We Want submissions.
date: 2020-05-14
tags:
  - web platform
  - web we want
layout: layouts/post.njk
permalink: posts/2020/05/web-we-want-2019-survey-results/index.html
---

14 May 2020

At the end of July 2019, we kicked off our first live Web We Want session. At the start, we only had a handful of submissions and one person willing to record their lightning talk for the session we ran at An Event Apart D.C. We've come quite a ways since then with over 250 submissions to the website.

[Myself](https://twitter.com/seaotta) and [Aaron Gustafson](https://twitter.com/AaronGustafson) have run 5 sessions at conferences and successfully onboarded community members to run an additional 3 sessions at events themselves, resulting in 8 sessions between July 2019 and February 2020.

To start diving into the various Wants that have been submitted, the Web We Want team is initially focusing on the 12 winning Wants from the 6 events that were run last year to start to dig into which of them are the most important problems or areas we should focus on.

Since the Wants fall into different areas and teams, the surveys were divided into three categories: DevTools, HTML/CSS/Layout, and General Browser for more miscellaneous/broader requests.

Each survey asked the following questions for each want:

- On a scale of 1 to 10, 1 being "not useful at all", and 10 be "extremely useful", rate each want on how useful you think it is.
- Please rank each want from your favorite to least favorite.

A few things to note here:

I started to include a question about the types of roles people consider themselves to be in after the first survey. This can (maybe) help provide more insight into why certain things I was expecting to rank highly, didn't. So that information is missing from the first survey about developer tooling wants.

For the scale of “not useful at all” to “extremely useful”, this formula uses an NPS or Net Promoter Score, which is usually used to help gauge customer loyalty but in this context is more focused on customer attitudes.

## DevTools Survey Results

There were 60 respondents to the DevTools survey and these were the 4 Wants:

- [I want to be able to save/load debugger state](https://webwewant.fyi/wants/60/)
- [I want improved behavior of browser emulators to match interaction on mobile devices](https://webwewant.fyi/wants/79/)
- [I want accessibility tools front & center](https://webwewant.fyi/wants/12/)
- [I want a source order viewer for rearranged content](https://webwewant.fyi/wants/64/)

### Scoring how useful each submission would be

It would be useful if Browser DevTools put accessibility tooling in a more prominent and easily findable location.

![alt: NPS Score for prominent accessibility tooling: 12.](/img/survey-results/DevTools/more-prominent-a11y-tooling.png)

It would be useful if Browser DevTools were able to save the current debugger state to a file in order to load and restore the file back into the DevTools to start debugging from the same place.

![alt: NPS Score for saving the current debugger state: -38.](/img/survey-results/DevTools/save-current-debugger-state.png)

It would be useful if the Browser DevTools had a source order viewer built in to identify rearranged content that would cause accessibility problems for screen readers.

![alt: NPS Score: for saving a source order viewer: -18.](/img/survey-results/DevTools/source-order-viewer.png)

It would be useful if Browser emulators did a better job of emulating interaction on mobile devices.

![alt: NPS Score for better browser emulators for mobile devices: 35.](/img/survey-results/DevTools/browser-emulators.png)

### Please rank each of the items from favorite to least favorite.

These were the results, in order of ranking:

 1.	I want accessibility tools front & center
  1st choice: 48.3%
  2nd choice: 21.7%
  3rd choice: 20%
  4th choice: 10%

 2.	I want improved behavior of browser emulators to match interaction on mobile devices
  1st choice: 36.7%
  2nd choice: 35%
  3rd choice: 18.3%
  4th choice: 10%

 3.	I want a source order viewer for rearranged content
  1st choice: 1.6%
  2nd choice: 30%
  3rd choice: 36.7%
  4th choice: 31.7%

 4.	I want to be able to save/load debugger state
  1st choice: 13.3%
  2nd choice: 13.3%
  3rd choice: 25%
  4th choice: 48.4%

![alt: Visual representation of the ranked wants](/img/survey-results/DevTools/rank-devtools.png)

### Notable Verbatims

A few quotes from survey takers that I thought were worth calling out.

> It would be great if all emulation were in the same place. Device, css prefers color scheme query, high contrast, dual screen, responsive mode, etc.

> I’m all good, just so glad you’re interested in making the tools better

## General Browser Survey Results

There were 67 respondents to the General Browser survey and these were the 3 Wants:

- [I want a standard API for event throttling and debouncing](https://webwewant.fyi/wants/4/)
- [I want browsers to fix automatically fixable accessibility problems automatically ](https://webwewant.fyi/wants/10/)
- [I want browsers to localize data like dates and numbers](https://webwewant.fyi/wants/59/)

**49%** said they were full-stack developers
**39%** said they were front-end developers
**7%** said they were in other roles: accessibility consultant, architect, JavaScript developer, Head of Engineering, and "tired old user"
**4%** said they were designers

### Scoring how useful each submission would be

It would be useful is there was a standard API for event throttling and debouncing.
![alt: NPS Score for a throttling and debouncing API: 3](/img/survey-results/Misc-Browser/throttling-debouncing-api.png)

It would be useful if browsers could localize data like date formatting, currency, time and weight depending on a user's preferences.
![alt: NPS Score for localizing data like date formatting, currency, etc: 18](/img/survey-results/Misc-Browser/localize-data.png)

It would be useful if browsers could automatically fix fixable accessibility issues such as lack of focus indicators, lack of readability because of low contrast text, etc.

![alt: NPS Score for browsers automatically fixing fixable accessibility issues: 15](/img/survey-results/Misc-Browser/localize-data.png)

### Please rank each of the items from favorite to least favorite.

These were the results, in order of ranking:

 1.	I want browsers to localize data like dates and numbers
  1st choice: 29.8%;
  2nd choice: 47.8%;
  3rd choice: 22.4%;

 2.	I want browser to fix automatically fixable accessibility problems automatically
  1st choice: 37.3%;
  2nd choice: 26.9%;
  3rd choice: 35.8%;

 3.	I want a standard API for event throttling and debouncing
  1st choice: 32.8%;
  2nd choice: 25.4%;
  3rd choice: 41.8%;

![alt: Visual representation of the ranked wants](/img/survey-results/Misc-Browser/ranked-misc.png)

### Notable Verbatims

Accessibility was the hot topic in the survey comments.

>Accessibility isn't hard - I see no point in automatically fixing it. Please add support for focus-visible, the element() CSS function, subgrid, gap for flexbox, Web Share API level 2, constructable stylesheets, and CSS modules!

> The accessibility thing sounds nice in theory but I guess I'd need to see the implementation? I'd like to think my sites are pretty accessible to begin with, and if it ended up being something I had to test against as a developer to make sure it wasn't breaking anything in the design then I'm not sure how it's helping me.

> Please give more focus on accessibility - it would really help all the users while others are like functional/perf related.

> If we're going to have good built-in date formatting, we need better date WIDGETS with it. Everyone rolls their own datetime widgets now because of the lackluster browser implementations.

## HTML/CSS/Layout Survey Results

There were 104 respondents to the HTML/CSS/Layout and these were the 5 wants:

- [I want better justification (text align)](https://webwewant.fyi/wants/74/)
- [I want better HTML forms ](https://webwewant.fyi/wants/48/)
- [I want semantic HTML sidenotes](https://webwewant.fyi/wants/52/)
- [I want the ability to flow content dynamically from one container to another using CSS](https://webwewant.fyi/wants/80/)
- [I want SVG to be fully styled from CSS](https://webwewant.fyi/wants/25/)

48% said they were front-end developers
40% said they were full-stack developers
5% said they were designers
4% said they were in other roles such as Accessibility consultant, UI Engineer, and a Project Manager
3% said they were back-end developers

### Scoring how useful each submission would be

It would be useful if browsers had better native form control and functionality like a date picker, time picker, dropdowns with values fetched from a server, and better handling of large dropdowns with filters.

![alt: NPS Score for better native form controls: 56](/img/survey-results/HTML-CSS/better-form-controls.png)

It would be useful if I could flow content dynamically from one container to another depending on the available viewport by using CSS.

![alt: NPS Score for better native form controls: -21](/img/survey-results/HTML-CSS/flow-content-dynamically.png)

It would be useful if HTML had a semantic `<sidenote>` element for content such as clarification of words or notes to accompany an article that may keep away from the main story. A footnote tailor for the web and web layouts.

![alt: NPS Score for a semantic HTML sidenote element: -53](/img/survey-results/HTML-CSS/semantic-sidenotes.png)

It would be useful if the web had better text justification (text-align) for layouts, with better hyphenation and advanced line breaking.

![alt: NPS Score for better text justification: 2](/img/survey-results/HTML-CSS/text-justification.png)

It would be useful if I could style SVG completely with CSS and not have to rely on JavaScript for things like repositioning and resizing.

![alt: NPS Score for SVG to be fully styled from CSS: 2](/img/survey-results/HTML-CSS/svg-fully-styled.png)

### Please rank each of the items from favorite to least favorite.

These were the results, in order of ranking:

 1.	I want better HTML forms
  1st choice: 67.3%;
  2nd choice: 11.5%;
  3rd choice: 5.8%;
  4th choice: 7.7%;
  5th choice: 7.7%;

2. I want better justification (text-align)
  1st choice: 12.5%;
  2nd choice: 27.9%;
  3rd choice: 28.9%;
  4th choice: 16.3%;
  5th choice: 14.4%;

3. I want SVG to be fully styled from CSS
  1st choice: 9.6%;
  2nd choice: 27.9%;
  3rd choice: 33.7%;
  4th choice: 11.5%;
  5th choice: 17.3%

4. I want the ability to flow content dynamically from one container to another using CSS
  1st choice: 8.6%;
  2nd choice: 22.1%;
  3rd choice: 21.2%;
  4th choice: 33.7%;
  5th choice: 14.4%;

5. I want semantic HTML sidenotes
  1st choice: 1.9%;
  2nd choice: 10.6%;
  3rd choice: 10.6%;
  4th choice: 30.7%;
  5th choice: 46.2%;

![alt: Visual representation of the ranked wants](/img/survey-results/HTML-CSS/ranked-html-css.png)

### Notable verbatims:

Y'all want container queries. This is a really complex problem and there are a lot of posts out there about it already so I'm not going to dive into this problem here.

> It would be great if CSS could be applied to the native controls (such as a date picker, time picker, etc), similarly to how we can use appearance: none; on a button to style it in any way we’d like.

> Container queries is what we want 😊

> Container queries would be a 10.

> ELEMENT QUERIES ABOVE EVERYTHING

## So what's next?

To be totally honest, this isn’t a straightforward answer as it depends on the Want. Generally DevTools features can be easier to prototype and test and start getting feedback on, but when it comes to web platform features, things are going to take longer especially if standards groups have to be involved.

Recently, I’ve been involved in conversations with team members working on other browsers, as has my co-worker [Aaron](https://twitter.com/AaronGustafson), about the Web We Want and how we integrate the submissions with other signals from the web community. We're still smoothing out the process, so if you have feedback on how you'd like to see browsers work with the feedback, feel free to engage with us on [GitHub](https://github.com/WebWeWant/webwewant.fyi) or [Twitter](https://twitter.com/webwewantfyi).

The point I want to highlight here is we are working with other browser vendors to look over everything that has been submitted and are assessing whether it's something already being worked on by browsers, if it's something browsers could work on without standards groups, or if there are already proposals in standards groups that are in the works (here’s a great example of that in action over on the [Web We Want GitHub repository](https://github.com/WebWeWant/webwewant.fyi/issues/37).

A great example of something that's already being worked on is the HTML Controls submission (and there were actually a few other submissions on HTML Controls as well). There is a standards initiative called [Open UI](https://open-ui.org/) that's working toward making controls more customizable and extensible, starting with `<select>`. Even though this problem space is being worked on, the submissions here are still important as it provides additional evidence that browsers are working on fixing the right problems.

## The Web We Want In The Time Of COVID

For the moment, our in-person sessions are on hold, but we're looking into ways to keep the community engaged and active in this intiative so stay tuned for developments there.

We're still taking submissions to the Web We Want, so if you have a problem or feature gap in the web platform, let us know and submit issues on the [Web We Want website](https://webwewant.fyi/) or [upvote submissions](https://webwewant.fyi/wants/). Issues are now being tracked in GitHub in an attempt to allow more engagement and discussion from the community and browser and standards folks. There is no want too small or too big, so let us know and help to move the web platform forward!

repository: ststimac/stephaniestimac-blog

repo_name: ststimac/stephaniestimac-blog


text:
## Files

Files are syncronised with your remote environment via the `src` folder which can be found in this blueprint.
Files are synced to the remote folder `/go/src`.

## Settings

Settings for the Visual Studio Code environment are synced to the local folder `./config`.

## Extensions

Extensions for the Visual Studio Code environment are synced to the local folder `./extensions`.

## Versions

* VSCode - 1.43.2
* Go - 1.14.1

repository: shipyard-run/blueprints

repo_name: shipyard-run/blueprints


text:
# MinetestBot for Discord #
_MinetestBot and it's author(s) are in no way affiliated with the IRC MinetestBot._

Uses NodeJS and `discord.js`.

## Installation ##

```
git clone https://github.com/GreenXenith/minetestbot.git
cd minetestbot
npm install
```

MinetestBot demands a ~~sacrifice~~ `config.json`. See `config.json.example`.

## Usage ##

To use the bot, run `node .` in the bot directory.
I recommend you use a cron job or systemd service

### Todo (PRs welcome) ###
* Better CDB search
* ~~Vote starter~~
* Serverlist searcher/parser
* Metric/Imperial conversion command
* Word definition
* Forum search

Might be missing `;` everywhere, or have too many.

This used to be written in Lua, but Luvit is garbage.

repository: appgurueu/minetestbot

repo_name: appgurueu/minetestbot