text:
# sish

An open source serveo/ngrok alternative.

## Deploy

Builds are made automatically for each commit to the repo and are pushed to Dockerhub. Builds are
tagged using a commit sha, branch name, tag, latest if released on master.
You can find a list [here](https://hub.docker.com/r/antoniomika/sish/tags).
Each release builds separate `sish` binaries that can be downloaded from
[here](https://github.com/antoniomika/sish/releases) for various OS/archs.
Feel free to either use the automated binaries or to build your own. If you submit a PR, images are
not built by default and will require a retag from a maintainer to be built.

1. Pull the Docker image
    - `docker pull antoniomika/sish:latest`
2.  SSH to your host to communicate with sish
    - `ssh -p 2222 -R 80:localhost:8080 ssi.sh`

## Docker Compose

You can also use Docker Compose to setup your sish instance. This includes taking
care of SSL via Let's Encrypt for you. This uses the
[adferrand/dnsrobocert](https://github.com/adferrand/dnsrobocert) container to handle issuing wildcard
certifications over DNS. For more information on how to use this, head to that link above. Generally, you
can deploy your service like so:

```bash
docker-compose -f deploy/docker-compose.yml up -d
```

The domain and DNS auth info in `deploy/docker-compose.yml` and `deploy/le-config.yml` should be updated
to reflect your needs. You will also need to create a symlink in the `./ssl` directory that points to the
Let's Encrypt certificates like:

```bash
ln -s /etc/letsencrypt/live/ssi.sh/fullchain.pem deploy/ssl/ssi.sh.crt
ln -s /etc/letsencrypt/live/ssi.sh/privkey.pem deploy/ssl/ssi.sh.key
```

I use these files in my deployment of `ssi.sh` and have included them here for consistency.

## How it works

SSH can normally forward local and remote ports. This service implements
an SSH server that only handles forwarding and nothing else. The service supports
multiplexing connections over HTTP/HTTPS with WebSocket support. Just assign a
remote port as port `80` to proxy HTTP traffic and `443` to proxy HTTPS traffic.
If you use any other remote port, the server will listen to the port for TCP connections,
but only if that port is available.

You can choose your own subdomain instead of relying on a randomly assigned one
by setting the `--bind-random-subdomains` option to `false` and then selecting a
subdomain by prepending it to the remote port specifier:

`ssh -p 2222 -R foo:80:localhost:8080 ssi.sh`

If the selected subdomain is not taken, it will be assigned to your connection.

## Supported forwarding types

### HTTP forwarding

sish can forward any number of HTTP connections through SSH. It also provides logging the connections
to the connected client that has forwarded the connection and a web interface to see full request and
responses made to each forwarded connection. Each webinterface can be unique to the forwarded connection or
use a unified access token. To make use of HTTP forwarding, ports `[80, 443]` are used to tell sish that a
HTTP connection is being forwarded and that HTTP virtualhosting should be defined for the service. For
example, let's say I'm
developing a HTTP webservice on my laptop at port `8080` that uses websockets and I want to show one of my
coworkers who is not near me. I can forward the connection like so:

```bash
ssh -R hereiam:80:localhost:8080 ssi.sh
```

And then share the link `https://hereiam.ssi.sh` with my coworker. They should be able to access the service
seamlessly over HTTPS, with full websocket support working fine. Let's say `hereiam.ssi.sh` isn't available,
then sish will generate a random subdomain and give that to me.

### TCP forwarding

Any TCP based service can be used with sish for TCP and alias forwarding. TCP forwarding
will establish a remote port on the server that you deploy sish to and will forward all connections
to that port through the SSH connection and to your local device. For example, if I was to run
a SSH server on my laptop with port `22` and want to be able to access it from anywhere at `ssi.sh:2222`,
I can use an SSH command on my laptop like so to forward the connection:

```bash
ssh -R 2222:localhost:22 ssi.sh
```

I can use the forwarded connection to then access my laptop from anywhere:

```bash
ssh -p 2222 ssi.sh
```

### TCP alias forwarding

Let's say instead I don't want the service to be accessible by the rest of the world, you can then use a TCP
alias. A TCP alias is a type of forwarded TCP connection that only exists inside of sish. You can gain access
to the alias by using SSH with the `-W` flag, which will forwarding the SSH process' stdin/stdout to the
fowarded TCP connection. In combination with authentication, this will guarantee your remote service is safe
from the rest of the world because you need to login to sish before you can access it. Changing the example
above for this would mean running the following command on my laptop:

```bash
ssh -R mylaptop:22:localhost:22 ssi.sh
```

sish won't publish port 22 or 2222 to the rest of the world anymore, instead it'll retain a pointer saying
that TCP connections made from within SSH after a user has authenticated to `mylaptop:22` should be
forwarded to the forwarded TCP tunnel. Then I can use the forwarded connection access my laptop from
anywhere using:

```bash
ssh -o ProxyCommand="ssh -W %h:%p ssi.sh" mylaptop
```

Shorthand for which is this with newer SSH versions:

```bash
ssh -J ssi.sh mylaptop
```

## Authentication

If you want to use this service privately, it supports both public key and password
authentication. To enable authentication, set `--authentication=true` as one of your CLI
options and be sure to configure `--authentication-password` or `--authentication-keys-directory` to your
liking. The directory provided by `--authentication-keys-directory` is watched for changes and will reload
the authorized keys automatically. The authorized cert index is regenerated on directory
modification, so removed public keys will also automatically be removed. Files in this
directory can either be single key per file, or multiple keys per file separated by newlines,
similar to `authorized_keys`. Password auth can be disabled by setting `--authentication-password=""` as a
CLI option.

One of my favorite ways of using this for authentication is like so:

```bash
sish@sish0:~/sish/pubkeys# curl https://github.com/antoniomika.keys > antoniomika
```

This will load my public keys from GitHub, place them in the directory that sish is watching,
and then load the pubkey. As soon as this command is run, I can SSH normally and it will authorize me.

## Custom domains

sish supports allowing users to bring custom domains to the service, but SSH key auth is required to be
enabled. To use this feature, you must setup TXT and CNAME/A records for the domain/subdomain you would
like to use for your forwarded connection. The CNAME/A record must point to the domain or IP that is hosting
sish. The TXT record must be be a `key=val` string that looks like:

```text
sish=SSHKEYFINGERPRINT
```

Where `SSHKEYFINGERPRINT` is the fingerprint of the key used for logging into the server. You can set
multiple TXT records and sish will check all of them to ensure at least one is a match. You can retrieve
your key fingerprint by running:

```bash
ssh-keygen -lf ~/.ssh/id_rsa | awk '{print $2}'
```

If you trust the users connecting to sish and would like to allow any domain to be used with sish
(bypassing verification), there are a few added flags to aid in this. This is especially useful when
adding multiple wildcard certificates to sish in order to not need to automatically provision Let's
Encrypt certs. To disable verfication, set `--bind-any-host=true`, which will allow and subdomain/domain
combination to be used. To only allow subdomains of a certain subset of domains, you can set `--bind-hosts`
to a comma separated list of domains that are allowed to be bound.

To add certficates for sish to use, configure the `--https-certificate-directory` flag to point to a dir
that is accessible by sish. In the directory, sish will look for a combination of files that look like
`name.crt` and `name.key`. `name` can be arbitrary in either case, it just needs to be unique to the cert
and key pair to allow them to be loaded into sish.

## Load balancing

sish can load balance any type of forwarded connection, but this needs to be enabled when starting sish
using the `--http-load-balancer`,
`--tcp-load-balancer`, and `--alias-load-balancer` flags. Let's say you have a few edge nodes
(raspberry pis) that are running a service internally but you want to be able to balance load across these
devices from the outside world. By enabling load balancing in sish, this happens automatically when a
device with the same forwarded TCP port, alias, or HTTP subdomain connects to sish. Connections will then be
evenly distributed to whatever nodes are connected to sish that match the forwarded connection.

## Whitelisting IPs

Whitelisting IP ranges or countries is also possible. Whole CIDR ranges can be
specified with the `--whitelisted-ips` option that accepts a comma-separated
string like "<IP_ADDRESS>/22,<IP_ADDRESS>/22". If you want to whitelist a single
IP, use the `/32` range.

To whitelist countries, use `--whitelisted-countries` with a comma-separated
string of countries in ISO format (for example, "pt" for Portugal). You'll also
need to set `--geodb` to `true`.

## Demo - At this time, the demo instance has been set to require auth due to abuse

There is a demo service (and my private instance) currently running on `ssi.sh` that
doesn't require any authentication. This service provides default logging
(errors, connection IP/username, and pubkey fingerprint). I do not log any of the password
authentication data or the data sent within the service/tunnels. My deploy uses the exact
deploy steps that are listed above. This instance is for testing and educational purposes only.
You can deploy this extremely easily on any host (Google Cloud Platform provides an always-free
instance that this should run perfectly on). If the service begins to accrue a lot of traffic,
I will enable authentication and then you can reach out to me to get your SSH key whitelisted
(make sure it's on GitHub and you provide me with your GitHub username).

## Notes

1. This is by no means production ready in any way. This was hacked together and solves a fairly specific
use case.
      - You can help it get production ready by submitting PRs/reviewing code/writing tests/etc
2. This is a fairly simple implementation, I've intentionally cut corners in some places to make it easier
to write.
3. If you have any questions or comments, feel free to reach out via email
[me<EMAIL_ADDRESS>or on [freenode IRC #sish](https://kiwiirc.com/client/chat.freenode.net:6697/#sish)

## Upgrading to v1.0

There are numerous breaking changes in sish between pre-1.0 and post-1.0 versions. The largest changes are
found in the mapping of command flags and configuration params. Those have changed drastically, but it should be easy
to find the new counterpart. The other change is SSH keys that are supported for host key auth. sish
continues to support most modern keys, but by default if a host key is not found, it will create an OpenSSH
ED25519 key to use. Previous versions of sish would aes encrypt the pem block of this private key, but we
have since moved to using the native
[OpenSSH private key format](https://github.com/openssh/openssh-portable/blob/master/sshkey.c) to allow for
easy interop between OpenSSH tools. For this reason, you will either have to manually convert an AES
encrypted key or generate a new one.

## CLI Flags

```text
sish is a command line utility that implements an SSH server that can handle HTTP(S)/WS(S)/TCP multiplexing, forwarding and load balancing.
It can handle multiple vhosting and reverse tunneling endpoints for a large number of clients.

Usage:
  sish [flags]

Flags:
      --admin-console                               Enable the admin console accessible at http(s)://domain/_sish/console?x-authorization=admin-console-token
  -j, --admin-console-token string                  The token to use for admin console access if it's enabled (default "S3Cr3tP4$$W0rD")
      --alias-load-balancer                         Enable the alias load balancer (multiple clients can bind the same alias)
      --append-user-to-subdomain                    Append the SSH user to the subdomain. This is useful in multitenant environments
      --append-user-to-subdomain-separator string   The token to use for separating username and subdomain selection in a virtualhost (default "-")
      --authentication                              Require authentication for the SSH service
  -k, --authentication-keys-directory string        Directory where public keys for public key authentication are stored.
                                                    sish will watch this directory and automatically load new keys and remove keys
                                                    from the authentication list (default "deploy/pubkeys/")
  -u, --authentication-password string              Password to use for ssh server password authentication (default "S3Cr3tP4$$W0rD")
  -o, --banned-countries string                     A comma separated list of banned countries. Applies to HTTP, TCP, and SSH connections
  -x, --banned-ips string                           A comma separated list of banned ips that are unable to access the service. Applies to HTTP, TCP, and SSH connections
  -b, --banned-subdomains string                    A comma separated list of banned subdomains that users are unable to bind (default "localhost")
      --bind-any-host                               Bind any host when accepting an HTTP listener
      --bind-hosts string                           A comma separated list of other hosts a user can bind. Requested hosts should be subdomains of a host in this list
      --bind-random-ports                           Force TCP tunnels to bind a random port, where the kernel will randomly assign it (default true)
      --bind-random-subdomains                      Force bound HTTP tunnels to use random subdomains instead of user provided ones (default true)
      --bind-random-subdomains-length int           The length of the random subdomain to generate if a subdomain is unavailable or if random subdomains are enforced (default 3)
      --cleanup-unbound                             Cleanup unbound (unforwarded) SSH connections after a set timeout (default true)
      --cleanup-unbound-timeout duration            Duration to wait before cleaning up an unbound (unforwarded) connection (default 5s)
  -c, --config string                               Config file (default "config.yml")
      --debug                                       Enable debugging information
  -d, --domain string                               The root domain for HTTP(S) multiplexing that will be appended to subdomains (default "ssi.sh")
      --geodb                                       Use a geodb to verify country IP address association for IP filtering
  -h, --help                                        help for sish
  -i, --http-address string                         The address to listen for HTTP connections (default "localhost:80")
      --http-load-balancer                          Enable the HTTP load balancer (multiple clients can bind the same domain)
      --http-port-override int                      The port to use for http command output. This does not effect ports used for connecting, it's for cosmetic use only
      --https                                       Listen for HTTPS connections. Requires a correct --https-certificate-directory
  -t, --https-address string                        The address to listen for HTTPS connections (default "localhost:443")
  -s, --https-certificate-directory string          The directory containing HTTPS certificate files (name.crt and name.key). There can be many crt/key pairs (default "deploy/ssl/")
      --https-ondemand-certificate                  Enable retrieving certificates on demand via Let's Encrypt
      --https-ondemand-certificate-accept-terms     Accept the Let's Encrypt terms
      --https-ondemand-certificate-email string     The email to use with Let's Encrypt for cert notifications. Can be left blank
      --https-port-override int                     The port to use for https command output. This does not effect ports used for connecting, it's for cosmetic use only
      --idle-connection                             Enable connection idle timeouts for reads and writes (default true)
      --idle-connection-timeout duration            Duration to wait for activity before closing a connection for all reads and writes (default 5s)
      --load-templates                              Load HTML templates. This is required for admin/service consoles (default true)
      --load-templates-directory string             The directory and glob parameter for templates that should be loaded (default "templates/*")
      --localhost-as-all                            Enable forcing localhost to mean all interfaces for tcp listeners (default true)
      --log-to-client                               Enable logging HTTP and TCP requests to the client
      --log-to-file                                 Enable writing log output to file, specified by log-to-file-path
      --log-to-file-compress                        Enable compressing log output files
      --log-to-file-max-age int                     The maxium number of days to store log output in a file (default 28)
      --log-to-file-max-backups int                 The maxium number of rotated logs files to keep (default 3)
      --log-to-file-max-size int                    The maximum size of outputed log files in megabytes (default 500)
      --log-to-file-path string                     The file to write log output to (default "/tmp/sish.log")
      --log-to-stdout                               Enable writing log output to stdout (default true)
      --ping-client                                 Send ping requests to the underlying SSH client.
                                                    This is useful to ensure that SSH connections are kept open or close cleanly (default true)
      --ping-client-interval duration               Duration representing an interval to ping a client to ensure it is up (default 5s)
      --ping-client-timeout duration                Duration to wait for activity before closing a connection after sending a ping to a client (default 5s)
  -n, --port-bind-range string                      Ports or port ranges that sish will allow to be bound when a user attempts to use TCP forwarding (default "0,1024-65535")
  -l, --private-key-location string                 The location of the SSH server private key. sish will create a private key here if
                                                    it doesn't exist using the --private-key-passphrase to encrypt it if supplied (default "deploy/keys/ssh_key")
  -p, --private-key-passphrase string               Passphrase to use to encrypt the server private key (default "S3Cr3tP4$$phrAsE")
      --proxy-protocol                              Use the proxy-protocol while proxying connections in order to pass-on IP address and port information
  -q, --proxy-protocol-version string               What version of the proxy protocol to use. Can either be 1, 2, or userdefined.
                                                    If userdefined, the user needs to add a command to SSH called proxyproto:version (ie proxyproto:1) (default "1")
      --redirect-root                               Redirect the root domain to the location defined in --redirect-root-location (default true)
  -r, --redirect-root-location string               The location to redirect requests to the root domain
                                                    to instead of responding with a 404 (default "https://github.com/antoniomika/sish")
      --service-console                             Enable the service console for each service and send the info to connected clients
  -m, --service-console-token string                The token to use for service console access. Auto generated if empty for each connected tunnel
  -a, --ssh-address string                          The address to listen for SSH connections (default "localhost:2222")
      --tcp-aliases                                 Enable the use of TCP aliasing
      --tcp-load-balancer                           Enable the TCP load balancer (multiple clients can bind the same port)
      --time-format string                          The time format to use for both HTTP and general log messages (default "2006/01/02 - 15:04:05")
      --verify-dns                                  Verify DNS information for hosts and ensure it matches a connecting users sha256 key fingerprint (default true)
      --verify-ssl                                  Verify SSL certificates made on proxied HTTP connections (default true)
  -v, --version                                     version for sish
  -y, --whitelisted-countries string                A comma separated list of whitelisted countries. Applies to HTTP, TCP, and SSH connections
  -w, --whitelisted-ips string                      A comma separated list of whitelisted ips. Applies to HTTP, TCP, and SSH connections
```

repository: LovinLifee/sish

repo_name: LovinLifee/sish


text:
## [0.1.5](https://github.com/Brooooooklyn/canvas/compare/v0.1.4...v0.1.5) (2021-08-13)

### Bug Fixes

* default value of FilterQuality in SamplingOptions should be high ([389aa26](https://github.com/Brooooooklyn/canvas/commit/389aa26fda79dfca15b6f2d87fbd03fe92f28758))

### Features

* add resize SVG demo ([bf8388d](https://github.com/Brooooooklyn/canvas/commit/bf8388ddab06474a01362829437bcfc7df4bd248))

## [0.1.4](https://github.com/Brooooooklyn/canvas/compare/v0.1.3...v0.1.4) (2021-08-11)

### Features

- scale svg image if need ([72c404c](https://github.com/Brooooooklyn/canvas/commit/72c404c5049a0a0898bb91ab4ad1cd36fb71a4e4))

## [0.1.3](https://github.com/Brooooooklyn/canvas/compare/v0.1.2...v0.1.3) (2021-08-06)

### Bug Fixes

- icudtl.dat download logic in publish job ([f2bb048](https://github.com/Brooooooklyn/canvas/commit/f2bb048d0dde9e4703b5c0030011ba0c47a5038c))

## [0.1.2](https://github.com/Brooooooklyn/canvas/compare/v0.1.1...v0.1.2) (2021-08-05)

### Bug Fixes

- Windows icudtl.data version and path ([5c81eb7](https://github.com/Brooooooklyn/canvas/commit/5c81eb7d3edb7acaaf831233199eddecda834074))

### Features

- implement convertSVGTextToPath function ([9c7ca98](https://github.com/Brooooooklyn/canvas/commit/9c7ca989a54c40cf4eb949f651a91bfb629fc716))

## [0.1.1](https://github.com/Brooooooklyn/canvas/compare/v0.1.0...v0.1.1) (2021-08-02)

### Bug Fixes

- use viewbox as svg_container_size if width & height is empty ([406a298](https://github.com/Brooooooklyn/canvas/commit/406a298800ebe3807349d15d4ffa536db1f96afc))

### Features

- upgrade to skia/chrome/m93 latest ([6ca9526](https://github.com/Brooooooklyn/canvas/commit/6ca952651e24d6c7dbf730ebed0f13d9de07ffe3))

# [0.1.0](https://github.com/Brooooooklyn/canvas/compare/v0.0.12...v0.1.0) (2021-07-30)

### Bug Fixes

- canvas.png() to canvas.encode('png') ([b2d5afe](https://github.com/Brooooooklyn/canvas/commit/b2d5afeee91245fe226212e418fe62e16a238f91))
- multi font families ([2e934a5](https://github.com/Brooooooklyn/canvas/commit/2e934a5837f51b62b46172e608a6d34e4413d9f9))
- sample image size update ([8b0b147](https://github.com/Brooooooklyn/canvas/commit/8b0b1475112dd409c9e2652a5cd0bbdac3d772be))

### Features

- add .asWinding() to convert the sample image of SVG filltype ([f9f0d2b](https://github.com/Brooooooklyn/canvas/commit/f9f0d2bdf452a54c2606d55e47387371f37697ab))
- add basic measureText setup ([e1fc0bf](https://github.com/Brooooooklyn/canvas/commit/e1fc0bf2647c3e76cff8089d15078f4e9d200e97))
- measureText with all textAlign and textBaseline ([1891d76](https://github.com/Brooooooklyn/canvas/commit/1891d76090ec093430d63a217fbe4515c758b2c7))
- support register font with family name alias ([4860c80](https://github.com/Brooooooklyn/canvas/commit/4860c80aa6dac4ca073e20a5d2654ef6535e54c2))
- support woff/woff2 fonts ([70b7aa2](https://github.com/Brooooooklyn/canvas/commit/70b7aa2430ed04251c0d5016658a8147a13c167b))
- svg canvas backend ([f95f67a](https://github.com/Brooooooklyn/canvas/commit/f95f67afd5c051c1cf33e783e452d477a9430cad))

## [0.0.12](https://github.com/Brooooooklyn/canvas/compare/v0.0.11...v0.0.12) (2021-07-14)

### Features

- support raw pixels output ([f502548](https://github.com/Brooooooklyn/canvas/commit/f502548dc0c271710602a7363693540487056776))
- support toDataURL and toDataURLAsync on canvas element ([1d8c790](https://github.com/Brooooooklyn/canvas/commit/1d8c790777656ec1104fa465b2c9dcb929ead451))

## [0.0.11](https://github.com/Brooooooklyn/canvas/compare/v0.0.10...v0.0.11) (2021-07-13)

### Features

- support maxWidth in fillText and strokeText ([ccf33f3](https://github.com/Brooooooklyn/canvas/commit/ccf33f30b26aacab636791f3efb92a86ca7a6871))

## [0.0.10](https://github.com/Brooooooklyn/canvas/compare/v0.0.9...v0.0.10) (2021-07-12)

### Bug Fixes

- missing registerFromPath implementation ([8bac515](https://github.com/Brooooooklyn/canvas/commit/8bac515eac3c8bf5db026f701a57ee839fedb42d))

## [0.0.9](https://github.com/Brooooooklyn/canvas/compare/v0.0.8...v0.0.9) (2021-07-11)

### Features

- upgrade skia to chrome/m92 latest ([584a02a](https://github.com/Brooooooklyn/canvas/commit/584a02aef28516dd18d675a8f90c1f25dceae129))

## [0.0.8](https://github.com/Brooooooklyn/canvas/compare/v0.0.7...v0.0.8) (2021-06-23)

### Features

- support conic gradient ([850b6ee](https://github.com/Brooooooklyn/canvas/commit/850b6ee4f7df8ce440574fc41c16e8559ef1f232))
- support webp output ([4948c49](https://github.com/Brooooooklyn/canvas/commit/4948c49f89ea4e423dc14b240c82cb4d5e917248))

## [0.0.7](https://github.com/Brooooooklyn/canvas/compare/v0.0.6...v0.0.7) (2021-06-21)

### Bug Fixes

- **deps:** update rust crate once_cell to 1.8 ([c859162](https://github.com/Brooooooklyn/canvas/commit/c859162650590648d45e64782a104a5144a033bf))
- **deps:** update rust crate regex to 1.5 ([1915c60](https://github.com/Brooooooklyn/canvas/commit/1915c608fcb7318ce778f687c3ca08543203820f))
- JsArrayBuffer usage ([b58e987](https://github.com/Brooooooklyn/canvas/commit/b58e987bc7e92d5547e749b377720e1900454172))

### Features

- support jpeg output ([76adbdc](https://github.com/Brooooooklyn/canvas/commit/76adbdc04cd02f868fde9da21851694f10f15ce5))
- support svg source in image ([8df688f](https://github.com/Brooooooklyn/canvas/commit/8df688f702967fb60c75fceda52cbcf08a72be37))

## [0.0.6](https://github.com/Brooooooklyn/canvas/compare/v0.0.5...v0.0.6) (2021-05-06)

### Bug Fixes

- windows setAssetFontManager crash ([54861e9](https://github.com/Brooooooklyn/canvas/commit/54861e9b3b5fe18cbcd791b65b05c98b40087d42))

### Features

- add .editorconfig file ([62dcf35](https://github.com/Brooooooklyn/canvas/commit/62dcf35b6cdc11e3154af178b04e091aa09e3ac9))
- add font collection singleton scaffold ([9b7a00a](https://github.com/Brooooooklyn/canvas/commit/9b7a00a1eb2cef311cce8409fb37df359d3ab39e))
- support GlobalFonts.families ([00be237](https://github.com/Brooooooklyn/canvas/commit/00be237c08eff287ce706b30dd3ceda3e40727f6))
- support GlobalFonts.has ([0461afc](https://github.com/Brooooooklyn/canvas/commit/0461afcf8efc6ec49e2722f5f124c4bada45a48b))
- support GlobalFonts.register ([295d507](https://github.com/Brooooooklyn/canvas/commit/295d5072de571f1c6b04b930c99f6290f20149a4))

## [0.0.5](https://github.com/Brooooooklyn/canvas/compare/v0.0.4...v0.0.5) (2021-05-04)

### Bug Fixes

- **path:** wrong Stroke type cast and miterLimit default value ([5f1761b](https://github.com/Brooooooklyn/canvas/commit/5f1761b602c992639ab511336fc0551d061c8d5c))
- add stroke to trim test to make it more visually recognizable ([bddb3c6](https://github.com/Brooooooklyn/canvas/commit/bddb3c6ef96f588f36760f69e5077db56417d7cb))

### Features

- add getFillTypeString() for PathKit ([44719de](https://github.com/Brooooooklyn/canvas/commit/44719de4d119ffe370b0c6df26072303d8707a85))
- add PathKit.dash() ([#238](https://github.com/Brooooooklyn/canvas/issues/238)) ([c238113](https://github.com/Brooooooklyn/canvas/commit/c238113ef1feafd179d6c190e2a29e51326737d3))

## [0.0.4](https://github.com/Brooooooklyn/canvas/compare/v0.0.3...v0.0.4) (2021-04-19)

### Bug Fixes

- parse error for single font size rules ([aa80fb7](https://github.com/Brooooooklyn/canvas/commit/aa80fb7109584b32bf6a66ae7d70753ec53882b6))

### Features

- **path2d:** implement pathkit functions ([eea95bf](https://github.com/Brooooooklyn/canvas/commit/eea95bf627a8c643155618fa5e662c6060f73365))
- skia chrome/m91, add back mimalloc ([0420c14](https://github.com/Brooooooklyn/canvas/commit/0420c14339b2ef9c886d0495bddeb30c0af31f1d))

## [0.0.3](https://github.com/Brooooooklyn/canvas/compare/v0.0.2...v0.0.3) (2021-03-27)

### Bug Fixes

- wrong package name in index.js ([e3c35bb](https://github.com/Brooooooklyn/canvas/commit/e3c35bb0611f5d75f52d481738affdd530e1ac5a))

## [0.0.2](https://github.com/Brooooooklyn/canvas/compare/v0.0.1-alpha.3...v0.0.2) (2021-03-27)

### Bug Fixes

- bitmap destructor ([b138da2](https://github.com/Brooooooklyn/canvas/commit/b138da228286f560fe7aebe4e12ef5fc2ddf8e25))
- build on windows ([b731ea8](https://github.com/Brooooooklyn/canvas/commit/b731ea84d529d0a971b2fe34c20eb654f1fa9f34))
- compat with Node.js readonly error messages ([c7e1764](https://github.com/Brooooooklyn/canvas/commit/c7e176440b4d167b03e988059a9e8a34169da9a7))
- eslint & vscode config ignore ([f7dd018](https://github.com/Brooooooklyn/canvas/commit/f7dd018a81ff8dee0845258ef13e488c985f160f))
- image shadow ([8396b93](https://github.com/Brooooooklyn/canvas/commit/8396b93f4634705d1f0dfdb2028afb6fa3b25a99))
- image src getter ([336549d](https://github.com/Brooooooklyn/canvas/commit/336549d8f56b3e93687760b485d4a9d8cd72c6b4))
- setters on readonly properties ([adac797](https://github.com/Brooooooklyn/canvas/commit/adac797e5af7dd1407e05f6c3084dfa725161b6b))
- sync lock file ([340bfb5](https://github.com/Brooooooklyn/canvas/commit/340bfb571187635d041129eaf0c9e365bc7c336d))
- transform matrix config ([9dcddf2](https://github.com/Brooooooklyn/canvas/commit/9dcddf293c25c19a3d93b058d3ba78b43d52a281))

### Features

- add drawImage poc ([a5e5ddf](https://github.com/Brooooooklyn/canvas/commit/a5e5ddf52fc1be006590dcd63aad1ac53d2f5a1d))
- add image class poc ([11e04a5](https://github.com/Brooooooklyn/canvas/commit/11e04a597d2d0153bd5a15da2aabd6bec08efb0e))
- add image SkData field poc ([bb0c108](https://github.com/Brooooooklyn/canvas/commit/bb0c108d80da525efdb61a9b8653041f862933f7))
- ImageData relates API and tests ([24c7990](https://github.com/Brooooooklyn/canvas/commit/24c7990f9c83a1fa81aa9b23d7712980ac556467))
- implement image pattern ([2efbb18](https://github.com/Brooooooklyn/canvas/commit/2efbb18b6f80eadd5f457048c149cc50076fe2a2))
- scale and rotate ([f6c761f](https://github.com/Brooooooklyn/canvas/commit/f6c761f4ebbb57c23dbec1f9be5c80ab7be38b95))
- skia m89 ([e9c1cc9](https://github.com/Brooooooklyn/canvas/commit/e9c1cc94d33204e68ebe72ae94e934bf686d3e28))
- support all drawImage variants ([8d5ded6](https://github.com/Brooooooklyn/canvas/commit/8d5ded624f5e915907ece2696f0f5e350e244b4c))
- support context alpha ([929bdc0](https://github.com/Brooooooklyn/canvas/commit/929bdc092374ee8d196cc7fa5c56a057acfa2cfa))
- support creating SkImage ([3945321](https://github.com/Brooooooklyn/canvas/commit/39453214b2793d40f16c6229e6444d713c0904cc))
- support getContextAttributes ([4c0586b](https://github.com/Brooooooklyn/canvas/commit/4c0586b39cd923217c7db5bdd5bc620d3c438131))
- support isPointInPath ([2150788](https://github.com/Brooooooklyn/canvas/commit/2150788b01103f25a272d8c89cf3cea2e2d5851b))
- support isPointInStroke ([2a14513](https://github.com/Brooooooklyn/canvas/commit/2a14513c4a06ab9d6eeefcc31827b3a6e06d80a1))
- support naturalWidth/naturalHeight/complete/alt ([1bb1042](https://github.com/Brooooooklyn/canvas/commit/1bb104206450d440991cdd6cc093ad31696be489))
- sync skia m89 ([9748c44](https://github.com/Brooooooklyn/canvas/commit/9748c44658f4507dcb86e463a1e68117d05f057b))
- text states and font styles ([a175cf7](https://github.com/Brooooooklyn/canvas/commit/a175cf729f4340ec49cec464e8e10c3561c20ebb))

### Performance Improvements

- disable image data copy ([ccc8630](https://github.com/Brooooooklyn/canvas/commit/ccc8630906afaf573e7f46877efbb6ed652212f8))

## [0.0.1-alpha.3](https://github.com/Brooooooklyn/canvas/compare/v0.0.1-alpha.2...v0.0.1-alpha.3) (2021-01-06)

### Features

- properties in CanvasRenderContext2D ([12727a7](https://github.com/Brooooooklyn/canvas/commit/12727a795e75c6873a900dba0755e7e9471f85ef))
- testing for context2d functions ([107a650](https://github.com/Brooooooklyn/canvas/commit/107a650213ba3f13038955c2b8a7875b9b571449))

## [0.0.1-alpha.2](https://github.com/Brooooooklyn/canvas/compare/v0.0.1-alpha.1...v0.0.1-alpha.2) (2020-12-26)

### Features

- implement Path2D ([91124d6](https://github.com/Brooooooklyn/canvas/commit/91124d6ba143c2c0728f8725c24443b58ef3fa06))
- support gradient in fill/stroke style ([12e061c](https://github.com/Brooooooklyn/canvas/commit/12e061cdbd2ab4849a846cef2d5077bd00793613))

## [0.0.1-alpha.1](https://github.com/Brooooooklyn/canvas/compare/v0.0.1-alpha.0...v0.0.1-alpha.1) (2020-12-24)

### Features

- async/sync get png data from Canvas ([f6d8cd6](https://github.com/Brooooooklyn/canvas/commit/f6d8cd60a6d336822a885bb0302a1ae2b8eafa9b))

## [0.0.1-alpha.0](https://github.com/Brooooooklyn/canvas/compare/5b09b4b92712bbce9468f0b874aed3ec7b87a716...v0.0.1-alpha.0) (2020-12-17)

### Features

- simple example ([5b09b4b](https://github.com/Brooooooklyn/canvas/commit/5b09b4b92712bbce9468f0b874aed3ec7b87a716))
- strokeStyle ([e185ca3](https://github.com/Brooooooklyn/canvas/commit/e185ca3faa1a13a22af37a20284a00114b9669ae))
- upgrade everything ([5d27f63](https://github.com/Brooooooklyn/canvas/commit/5d27f6355ffe0ef8abcda5a7e14871cccfcdd71b))

license: MIT

repository: sunshaobin/canvas

branch_name: refs/heads/main

extension: md

gha_license_id: MIT

license_type: permissive

repo_name: sunshaobin/canvas


text:
# Weakly Supervised Posture Mining for Fine-Grained Classification

```
@inproceedings{pmrc_cvpr23,
title = {Weakly Supervised Posture Mining for Fine-Grained Classification},
author = {Tang, Zhenchao and Yang, Hualin and Chen, Calvin Yu-Chian},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
pages = {23735--23744},
year = {2023}
}
```

links
- [openaccess](http://openaccess.thecvf.com//content/CVPR2023/html/Tang_Weakly_Supervised_Posture_Mining_for_Fine-Grained_Classification_CVPR_2023_paper.html)

branch_name: refs/heads/master

gha_language: Jupyter Notebook


text:
---
date: "2018-10-11T15:10"
title: "One page game: d6D"
image: "./d6D-sheet-0.9.png"
tags: ["rules", "release", "roll-and-write"]
published: "true"
---

Here's one from the vault. **d6D: Bridge the Worlds** is a print-and-play [4X](https://en.wikipedia.org/wiki/4X) strategy game for 2-4 players, designed for a Ludum Dare competition in 2014. The game is played with just the print-out provided, a pencil and a set of six d6s for each player.

It's part Risk, part crayon rail. The aim is to conquer the six worlds.

Your d6s represent your armies — the higher the number, the stronger it is. Once you've built up your forces and conquered a couple of nearby worlds, you'll need to fight your opponents for control of the rest. When an army perishes, it is sent to the _realm of lost souls_... and once the _realm_ overflows with the damned, the game is over (or all of the worlds are conquered). The victor is the player who controls the most worlds, and managed to lose the fewest armies in the process.

[Download a PDF here](./d6D-sheet-0.9.pdf).

[![Downloadable game of d6D](./d6D-sheet-0.9.png)](./d6D-sheet-0.9.pdf)

repository: isaacwilliams/losing-games-blog

gha_language: JavaScript

repo_name: isaacwilliams/losing-games-blog


text:
## NAME

Cisco::ACI - Perl interface to the Cisco APIC API.

## SYNOPSIS

This module provides a Perl interface to Cisco APIC API.

```perl
    use Cisco::ACI;

    my $aci = Cisco::ACI->new(
			username=> $username,
			password=> $password,
			server	=> $server
    );

    # Required!
    $aci->login;

    # Get the leaf nodes of the pod as an array of
    # Cisco::ACI::FabricNode objects.
    my @leafs = $aci->get_leafs;

    # Same but for spines (both leaf and spine nodes
    # are Cisco::ACI::FabricNode objects).
    my @spines = $aci->get_spines;

    # Or, get a leaf by ID - still returns a
    # Cisco::ACI::FabricNode object.
    my $leaf = $aci->(101);

    # Do some interesting stuff with it.
    # Like, get the 5min measurements of policy CAM (TCAM) usage
    # as a Cisco::ACI::Eqptcapacity::PolUsage object.
    my $pol_usage = $leaf->PolUsage( '5min' );

    # So now we can calculate the policy CAM utilisation
    my $pol_utilisation = ( $pol_usage->polUsageCum
				/ $pol_usage->polUsageCapCum ) * 100;

    # Or get the number of faults present
    my $faults = $leaf->fault_counts;

     printf( 'Node %s has %d Minor, %d Major, %d Warning, and %d Critical faults\n',
		$leaf->name,
		$faults->minor,
		$faults->maj,
		$faults->warn,
		$faults->crit );

    # And much more...
```

## METHODS

### new ( %ARGS )

Constructor.  Creates a new Cisco::ACI object.  This method accepts three mandatory
and two optional named parameters:

- __username__

    The username with which to connect to the Cisco APIC API.

- __password__

    The password with which to connect to the Cisco APIC API.

- __server__

    The resolvable hostname of the Cisco ACI APIC to connect to.

- __port__

    The TCP port on which to connect to the Cisco ACI APIC, if not specified
    this parameter will default to a value of 443, which is probably what you want.

- __proto__

    The protocol to use when connecting to the Cisco ACI APIC, if not specified
    this parameter will default to a value of 'https', which is probably what you want.

### bd\_constraint ()

Returns the maximum configurable number Bridge Domains (fvBD) in the fabric.

### bd\_count ()

Returns the number of configured Bridge Domains (fvBD) in the fabric.

### cluster\_appliances ()

Returns all APICs in the cluster as an array of [Cisco::ACI::Infra::WiNode](https://metacpan.org/pod/Cisco::ACI::Infra::WiNode)
objects.  Note that APICs are also separately represented as devices of type
[Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode) within the Cisco APIC MO (see method __controllers()__).

### cluster\_standby\_appliances ()

Returns all standby APICs in the cluster as an array of [Cisco::ACI::Infra::SnNode](https://metacpan.org/pod/Cisco::ACI::Infra::SnNode)
objects.

### concrete\_devices\_constraint ()

Returns the maximum configurable number concrete devices (vnsCDev) in the fabric.

### concrete\_devices\_count ()

Returns the number of configured concrete devices (vnsCDev) in the fabric.

### contract\_constraint ()

Returns the maximum configurable number contracts (vzBrCP) in the fabric.

### contract\_count ()

Returns the number of configured contracts (vzBrCP) in the fabric.

### controllers ()

Returns all APICs in the cluster as an array of [Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode) objects.
Note that APICs are also separately represented as devices of type [Cisco::ACI::Infra::WiNode](https://metacpan.org/pod/Cisco::ACI::Infra::WiNode)
within the Cisco APIC MO (see method __cluster\_appliances()__).

### controller ( $ID )

Returns the APIC identified by the $ID parameter as a [Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode)
object.  Note that APICs are numbered sequentially starting from 1.

### ep\_constraint ()

Returns the maximum configurable number end points (fvCEp) in the fabric.

### ep\_count ()

Returns the number of configured end points (fvCEp) in the fabric.

### epg\_constraint ()

Returns the maximum configurable number end point groups (fvAEPg) in the fabric.

### epg\_count ()

Returns the number of configured end point groups (fvAEPg) in the fabric.

### fabric\_links ()

Returns all fabric links as an array of [Cisco::ACI::Fabric::Link](https://metacpan.org/pod/Cisco::ACI::Fabric::Link) objects.

### faults ()

Returns all fabric faults as an array of [Cisco::ACI::Fault::Inst](https://metacpan.org/pod/Cisco::ACI::Fault::Inst) objects.

### fexs ()

Returns all fabric extendeds (fexs) as an array of [Cisco::ACI::Eqpt::ExtCh](https://metacpan.org/pod/Cisco::ACI::Eqpt::ExtCh)
objects.

### get\_capability\_rules ()

Returns all capacity rules as an array of [Cisco::ACI::FvcapRule](https://metacpan.org/pod/Cisco::ACI::FvcapRule) objects.

### health ()

Returns the fabric health as an array of [Cisco::ACI::Health::Inst](https://metacpan.org/pod/Cisco::ACI::Health::Inst) objects.

### leaf ( $ID )

Returns the leaf node identified the the __$ID__ parameter as a
[Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode) object.

### leafs ()

Returns all leaf nodes as an array of [Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode) objects.

### login ()

Perfoms a login to the ACI APIC API - note that merely calling the constructor
does not automatically log you into the fabric.  Rather you are required to invoke
this method to do so.

### overallHealth5min ()

Returns the overall health of the fabric for the previous fivce minute interval as
an [Cisco::ACI::Stats::Curr::OverallHealth](https://metacpan.org/pod/Cisco::ACI::Stats::Curr::OverallHealth) object.

### service\_graph\_constraint ()

Returns the maximum configurable number of service graphs (vnsGraphInst) in the fabric.

### service\_graph\_count ()

Returns the number of configured service graphs (vnsGraphInst) in the fabric.

### spine ( $ID )

Returns the spine node identified the the __$ID__ parameter as a
[Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode) object.

### spines ()

Returns all spine nodes as an array of [Cisco::ACI::FabricNode](https://metacpan.org/pod/Cisco::ACI::FabricNode) objects.

### tenant ( $TENANT )

Returns the tenant identified by the $TENANT parameter as a [Cisco::ACI:Tenant](https://metacpan.org/pod/Cisco::ACI:Tenant)
object.

### tenant\_constraint ()

Returns the maximum configurable number of tenant (fvTenant) in the fabric.

### tenant\_count ()

Returns the number of configured tenants (fvTenant) in the fabric.

### vrf\_constraint ()

Returns the maximum configurable number of VRFs (fvCtx) in the fabric.

### vrf\_count ()

Returns the number of configured VRFs (fvCtx) in the fabric.

## AUTHOR

Luke Poskitt, `<ltp at cpan.org>`

## BUGS

Please report any bugs or feature requests to `bug-cisco-aci at rt.cpan.org`, or through
the web interface at [http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Cisco-ACI](http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Cisco-ACI).  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

## SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Cisco::ACI

You can also look for information at:

- RT: CPAN's request tracker (report bugs here)

    [http://rt.cpan.org/NoAuth/Bugs.html?Dist=Cisco-ACI](http://rt.cpan.org/NoAuth/Bugs.html?Dist=Cisco-ACI)

- AnnoCPAN: Annotated CPAN documentation

    [http://annocpan.org/dist/Cisco-ACI](http://annocpan.org/dist/Cisco-ACI)

- CPAN Ratings

    [http://cpanratings.perl.org/d/Cisco-ACI](http://cpanratings.perl.org/d/Cisco-ACI)

- Search CPAN

    [http://search.cpan.org/dist/Cisco-ACI/](http://search.cpan.org/dist/Cisco-ACI/)

## LICENSE AND COPYRIGHT

Copyright 2017 Luke Poskitt.

This program is free software; you can redistribute it and/or modify it
under the terms of the the Artistic License (2.0). You may obtain a
copy of the full license at:

[http://www.perlfoundation.org/artistic_license_2_0](http://www.perlfoundation.org/artistic_license_2_0)

Any use, modification, and distribution of the Standard or Modified
Versions is governed by this Artistic License. By using, modifying or
distributing the Package, you accept this license. Do not use, modify,
or distribute the Package, if you do not accept this license.

If your Modified Version has been derived from a Modified Version made
by someone other than you, you are nevertheless required to ensure that
your Modified Version complies with the requirements of this license.

This license does not grant you the right to use any trademark, service
mark, tradename, or logo of the Copyright Holder.

This license includes the non-exclusive, worldwide, free-of-charge
patent license to make, have made, use, offer to sell, sell, import and
otherwise transfer the Package with respect to any patent claims
licensable by the Copyright Holder that are necessarily infringed by the
Package. If you institute patent litigation (including a cross-claim or
counterclaim) against any party alleging that the Package constitutes
direct or contributory patent infringement, then this Artistic License
to you shall terminate on the date that such litigation is filed.

Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER
AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
 UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR
CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR
CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

repository: ggmo/Cisco-ACI

repo_name: ggmo/Cisco-ACI


text:
A new Red compiler rewritten in Rust

# Why Rust

* Rust is a systems programming language focused on safety, speed, and concurrency.

* llvm bindings with llvm-sys

# How to use

## linux environment

* install llvm-5.0

* sudo ln -s /usr/bin/llvm-config-50 /usr/bin/llvm-config

* cargo run

repository: bitbegin/neored

repo_name: bitbegin/neored


text:
---
title: "Introductory statistics skills pack"
author: "Glenna Nightingale and Michael Allerhand"
date: "2023-03-03T13:30:58Z"
tags: [Statistics, Epidemiology, Ecology, Social Science]
link: "https://bookdown.org/glenna_evans/statspack/"
length_weight: "3.9%"
repo: "rstudio/bookdown-demo"
pinned: false
---

This book provides basic material for students seeking to learn statistics in an R environment, [...] This skills pack introduces statistical concepts to beginners within the framework of R. Examples of analyses and R code are provided as well. Dr. Glenna Nightingale PhD Statistics
- research scientist (public health, epidemiology, spatial ecology, computational social science). Dr. Mike Allerhand, PhD Statistics
-since 2009 Statistician at the Centre for Cognitive Ageing and Cognitive Epidemiology, University of Edinburgh. Since 2018 Statistical Consultant in the Statistical Consultancy Unit ...

gha_language: R


text:
syslog
======

Golang alternative for built-in log/syslog package

Differences with standard library
--------

The "log/syslog" package writes raw data directly into syslog socket.
The resulting log message will look like:

    Sep 18 10:28:52 server 2013-09-18T10:28:52Z server [programname][20310]: Log message

You see that server name and datetime are duplicated. The log message format is hardcoded into source,
thus you cannot omit data duplication.

Another major disadvantage is that resulting log message cannot be processed using tools such as rsyslog,
because it cannot obtain the name of the sender application.

The approach used in this library is calling C functions openlog and syslog directly.
It solves both problems mentioned above.

The library provides:
* Openlog, Syslog functions with parameters identical to those in syslog.h C header
* log/syslog-like functions for writing messages: Emerg, Alert, Crit etc.
* Their formatted versions: Emergf, Alertf, Critf etc.
* io.Writer interface

Restrictions
--------

Because of using C-strings for calling syslog functions, to omit memory leaks
when you call Openlog function the data from **ident** parameter is copied into
static char array with fixed length. Length of this array is defined in syslog_wrapper.h
and currently equals **1000**. If length if ident string exceeds it, then
it will be cut up to maximum value.

Example
--------

    import "github.com/blackjack/syslog"
    func main() {
        syslog.Openlog("awesome_app", syslog.LOG_PID, syslog.LOG_USER)
        syslog.Syslog(syslog.LOG_INFO, "Hello syslog!")
        syslog.Err("Sample error message")
        syslog.Critf("Sample %s crit message", "formatted")
    }

The resulting log message will look like:

    Sep 18 18:13:46 server awesome_app[16844]: Hello syslog!
    Sep 18 18:13:46 server awesome_app[16844]: Sample error message
    Sep 18 18:13:46 server awesome_app[16844]: Sample formatted crit message

Feel the difference!

gha_license_id: NOASSERTION


text:
# Self-supervised point set local descriptors for point cloud registration. (SS-FeatNet)

![pipeline](https://github.com/STAR-Center/selfSupervisedDescriptor/blob/master/docs/pipeline.jpg)

Yuan, Y., Borrmann, D., Hou, J., Ma, Y., Nüchter, A., & Schwertfeger, S. (2021). Self-supervised point set local descriptors for point cloud registration. Sensors, 21(2), 486.

### Environment

Our code is developed on top of the implementation of [3DFeatNet](https://github.com/yewzijian/3DFeatNet).

Please follow [3DFeatNet](https://github.com/yewzijian/3DFeatNet) to preprocess the data.

####  Repo structure
```
./use_descriptor
-> train.sh # bash script to train model
-> exp/ # bash scripts to directly run experiments
-> models/ # network
-> tf_ops/ # PN clustering operation
-> cpp/ # preprocess including ISS-keypoints and FPFH-keypoints (not used)
-> data/ # data augmentation and loading
-> ckpt/ # model checkpoints
-> inference.py
-> train1jit.py
-> config.py
```

repository: STAR-Center/SS-FeatNet

repo_name: STAR-Center/SS-FeatNet


text:
# [arm32v7-java8](https://hub.docker.com/r/lluna89/arm32v7-java8/)
[![Hex.pm](https://images.microbadger.com/badges/version/lluna89/arm32v7-java8.svg)](https://hub.docker.com/r/lluna89/arm32v7-java8/) [![Hex.pm](https://images.microbadger.com/badges/image/lluna89/arm32v7-java8.svg)](https://hub.docker.com/r/lluna89/arm32v7-java8/) [![Hex.pm](https://img.shields.io/docker/stars/lluna89/arm32v7-java8.svg)](https://hub.docker.com/r/lluna89/arm32v7-java8/) [![Hex.pm](https://img.shields.io/docker/pulls/lluna89/arm32v7-java8.svg)](https://hub.docker.com/r/lluna89/arm32v7-java8/)

# Description
- Distribution: Ubuntu
- Architecture: arm32v7
- Base Image: arm32v7/ubuntu
- Application: Oracle JDK 8u291 (The Java Development Kit (JDK) is an implementation of either one of the Java Platform, Standard Edition, Java Platform, Enterprise Edition, or Java Platform, Micro Edition platforms[1] released by Oracle Corporation in the form of a binary product aimed at Java developers)

# Pull
docker pull lluna89/arm32v7-java8

# Run
docker run -it lluna89/arm32v7-java8

repository: pelayolluna/docker-hub

repo_name: pelayolluna/docker-hub


text:
## Dijkstra's algorithm for shortest paths
Originally published: 2010-08-02 13:03:44
Last updated: 2010-08-02 13:03:45
Author: poromenos

Dijkstra(G,s) finds all shortest paths from s to each other vertex in the graph, and shortestPath(G,s,t) uses Dijkstra to find the shortest path from s to t.  Uses the priorityDictionary data structure (Recipe 117228) to keep track of estimated distances to each vertex.

gha_language: Python


text:
# node-webrtcvad

A nodejs interface to the WebRTC Voice Activity Detector(VAD).

A [VAD](https://en.wikipedia.org/wiki/Voice_activity_detection)
classifies a piece of audio data as being voiced or unvoiced. It can
be useful for telephony and speech recognition.

The VAD that Google developed for the [WebRTC](https://webrtc.org/)
project is reportedly one of the best available, being fast, modern
and free.

## 0. Install

    npm install node-webrtcvad

## 1. Import

    import {WaveVad} from 'node-webrtcvad';

## 2. Set aggressiveness mode while create the instance.

   between 0 and 4.
   0 is the least aggressive about filtering out non-speech, 4 is the most aggressive. (added in 0.1.0)

    const vad = new WaveVad(3);

## 3. Get the result.

    const segments = await vad.getSegmentsFromFile("leak-test.wav", 30, 300);

output should be like this (changed in 0.1.3)

    {
        frames: [1,0,0,0,1,1,1...],
        windows: [
            { start: 510, end: 4260 },
            { start: 4290, end: 7860 }
            ...
        ]
        segments: [
            { start: 510, end: 4260 },
            { start: 4290, end: 7860 }
            ...
        ]
    }
each number in array "frames" represent 0: not speech, 1: speech.

each {start, end} in array "windows" represent the speech windows after triggerIn and triggerOut applied.

each {start, end} in array "segments" represent the segments which after leadin and minInterval applied.

## 4. CLI supported

You can install with -g to have a command to save vsd result to a text file

    npm install -g node-webrtcvad

    node-webrtcvad <wav-file.wav> <aggresiveness>

and the result of vad (a string of json) will be saved as a text file.

repository: BluSpring/node-webrtcvad

repo_name: BluSpring/node-webrtcvad


text:
---
layout: post
comments: true
title: DML Analysis Part 43
tags: virginica MBDSeq
---

## Revising manuscript figures

The new submission deadline is Dec. 31! I'd like to get a full draft in for comments before the end of the month, so I've been regaining motivation and slowly chipping away at manuscript edits. The task I focused on this week was revising figures and making some new ones. I chose this task because I wanted to finalize my methods and results sections before tackling my introduction and discussion, and because making figures is fun and it seemed like the best way to trick myself into being productive :satisfied:

### Recoloring plots!

First task: creating color schemes for my plots! I picked the Green-Blue color scheme from RColorBrewer, and checked that it was colorblind-friendly with `dichromat`.

```
plotColors <- rev(RColorBrewer::brewer.pal(5, "GnBu")) #Create a color palette for the barplots. Use 5 green-blue shades from RColorBrewer. Reverse the order so the darkest shade is used first.
barplot(t(t(proportionData)),
        col = dichromat(plotColors)) #Check that the plot colors will be easy to interpret for those with color blindess
```

**Figure 1**. Plot color scheme with `dichromat` adjustment.

I started by recoloring [previously-created figures](https://yaaminiv.github.io/DML-Analysis-Part42/): my methylation distribution (code [here](https://github.com/fish546-2018/yaamini-virginica/blob/master/analyses/2019-03-18-Characterizing-CpG-Methylation/2019-03-19-Characterizing-CpG-Methylation.Rmd)), stacked barplots (code [here](https://github.com/fish546-2018/yaamini-virginica/blob/master/analyses/2018-12-02-Gene-Enrichment-Analysis/2019-01-15-Proportion-Test.Rmd)), and DML location figures (code [here](https://github.com/fish546-2018/yaamini-virginica/blob/master/analyses/2018-12-02-Gene-Enrichment-Analysis/2019-02-22-Gene-Enrichment-Analysis.Rmd)).

**Figures 2-6**. Recolored versions of CpG locus distribution, CpG location stacked barplot, DML location stacked barplot, multipanel with DML locations in chromosomes and genes and hyper-hypomethylation breakdown, and scaled DML distribution.

### GOslim reanalysis

The next task I tackled was reanalyzing my GOslim information by following methods from [my *C. gigas* GOslim analysis](https://yaaminiv.github.io/WGBS-Analysis-Part8/). In [this Jupyter notebook](https://github.com/fish546-2018/yaamini-virginica/blob/master/notebooks/2019-08-28-blastx-to-GOslim.ipynb), I modified my GOslim annotations. I used GOslim annotations that included repeat GOslim terms for each gene, and included "uncharacterized biological processes" as a term in the analysis. Based on feedback from Steven and the rest of my committee, I first removed duplicate entries:

```
#Remove duplicate entries
#Count the number of unique IDs with GOSlim terms
!uniq Blastquery-GOslim-BP.sorted > Blastquery-GOslim-BP.sorted.unique
!uniq -f1 Blastquery-GOslim-BP.sorted.unique | wc -l
```

There were 126,112 unique *C. virginica* transcripts matched with GOslim terms. Once I removed duplicate entries, I removed any entry with "uncharacterized biological processes" using `grep --invert-match`:

```
#Remove all "other biological processes"
#Count the number of unique CGI IDs with defined GOSlim terms
!grep --invert-match "other biological processes" Blastquery-GOslim-BP.sorted.unique \
> Blastquery-GOslim-BP.sorted.unique.noOther
!uniq -f1 Blastquery-GOslim-BP.sorted.unique.noOther | wc -l
```

There were 105,959 unique *C. virginica* transcripts matched with defined GOslim terms. I moved onto [this R Markdown file](https://github.com/fish546-2018/yaamini-virginica/blob/master/analyses/2018-12-02-Gene-Enrichment-Analysis/2019-07-30-Gene-Enrichment-with-GO-MWU.Rmd) to annotate all tested genes and genes with DML with GOslim information. For all genes tested with GO-MWU, 27/2281 GO-MWU entries did not have accompanying GOslim entries, and 425/5283 GO-MWU entries did not have matching GOslim entries for genes with DML. After calculating the percentage of genes involved in each biological process, I created bar plots.

![Screen Shot 2019-11-19 at 11 04 50 AM](https://user-images.githubusercontent.com/22335838/69486392-1860b000-0e00-11ea-81a3-c972c99840f4.png)

![Screen Shot 2019-11-19 at 10 55 28 AM](https://user-images.githubusercontent.com/22335838/69486394-1ac30a00-0e00-11ea-8f8d-5fcf95720bab.png)

**Figure 7**. Percent of all genes tested involved in various biological processes.

**Figure 8**. Percent of genes with DML involved in various biological processes.

I figured it made sense to have a plot with biological process information for all tested genes and genes with DML side-by-side, so I created a multipanel plot. Instead of [using mirror plot code](https://genefish.wordpress.com/2019/10/09/creating-plots-mirrored-along-the-y-axis/) [like I did with the scaled DML distribution](https://yaaminiv.github.io/DML-Analysis-Part42/), I just created a multipanel with no margin between the two plots. I extended the leftside outer margin to make space for biological process labels. The code can be found [in this R Markdown file](https://github.com/fish546-2018/yaamini-virginica/blob/master/analyses/2018-12-02-Gene-Enrichment-Analysis/2019-07-30-Gene-Enrichment-with-GO-MWU.Rmd).

**Figure 9**. Side-by-side comparison of biological processes represented by all genes tested using GO-MWU enrichment and genes with DML.

I think this plot clearly shows why we didn't see any significantly enriched gene ontology categories: the distributions are so similar! Having the background to compare to the GOslim categories of genes with DML drives the point home.

Julian suggested I give more weight to genes with multiple DML, or less weight to genes with DML that are part of multiple biological processes. The first suggestion is good, but becuase we don't know the functional role of genes with multiple DML for gene expression in this species, I don't know of giving more weight to genes with multiple DML makes sense. I think my new processes takes into account genes with multiple processes, since I'm looking at how many times that process is represented in my data.

### Principal component analyses with `methylKit`

A while back, Katie suggested I compare PCAs for all my percent methylation data and DML. Instead of writing code from scratch using my multivariate class notes, I decided to use functions built into `methylKit`. Turns out that this should have been easy but in reality was way more complicated than it should have been. Understanding the matrix the data was in and what the functions were doing took me at least a day and a half. The documentation in the `methylKit` manual is somewhat helpful, but I found I had more questions than it could answer! I dug through specific function pages on the [R Documentation page](rdocumentation.org) and even the `methylKit` publication. But I digress...

I returned to [my `methylKit` R Markdown file](https://github.com/fish546-2018/yaamini-virginica/blob/master/analyses/2018-10-25-MethylKit/2018-10-25-MethylKit.Rmd) and examined the structure of the methylation information matrix.  The function `PCASamples` calculates a percent methylation matrix by dividing the number of cytosines by the sum of cytosines and thymines at that locus (C/C+T). Then, it uses `prcomp` to create the PCA. I struggled for a while to figure out how to customize the PCA that `methylKit` creates! FINALLY after hours of searching, I learned I could use the argument `obj.return = TRUE` to save the PCA object! I could then use `summary` to look at how much variance each PC explained.

```{r}
allDataPCA <- PCASamples(methylationInformationFilteredCov5Destrand, obj.return = TRUE) #Run a PCA analysis on percent methylation for all samples. methylKit uses prcomp to create the PCA matrix
summary(allDataPCA) #Look at summary statistics. The first PC explains 18.1% of variation, the second PC explains 11.7% of variation
```

According to Alan, my PCA explains more variance than his does. That's interesting, wbut I don't know what it means. I then used `ordiplot` to create a better looking PCA. I modeled my code after [code I used for the DNR paper](https://github.com/RobertsLab/paper-gigas-DNR-proteomics/blob/master/analyses/7-SRM/2018-12-01-Final-Ordination-Plot.Rmd).

```
fig.allDataPCA <- ordiplot(allDataPCA, choices = c(1, 2), type = "none", display = "sites", cex = 0.5, xlim = c(-400, 200), xlab = "", ylab = "", xaxt = "n", yaxt = "n") #Use ordiplot to create base biplot. Do not add any points
points(fig.allDataPCA, "sites", col = c(rep(plotColors[2], times = 5), rep(plotColors[4], times = 5)), pch = c(rep(16, times = 5), rep(17, times = 5)), cex = 3) #Add each sample. Darker samples are ambient, lighter samples are elevated pCO2

#Add multiple white boxes on top of the default black box to manually change the color
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")
box(col = "white")

ordiellipse(allDataPCA, plotCustomization$treatment, show.groups = "1", col = plotColors[4]) #Add confidence ellipse around the samples in elevated pCO2
ordiellipse(allDataPCA, plotCustomization$treatment, show.groups = "0", col = plotColors[2]) #Add confidence ellipse around the samples in ambient pCO2

axis(side =  1, at = seq(-400, 200, 200), col = "grey80", cex.axis = 1.7) #Add x-axis
mtext(side = 1, text = "PC 1 (18.1%)", line = 3, cex = 1.5) #Add x-axis label

axis(side =  2, labels = TRUE, col = "grey80", cex.axis = 1.7) #Add y-axis
mtext(side = 2, text = "PC 2 (11.7%)", line = 3, cex = 1.5) #Add y-axis label

mtext(side = 3, line = -5, adj = c(-100,0), text = "    a. All CpG Loci", cex = 1.5)
```

**Figure 10**. PCA with percent methylation data for all CpG loci with 5x data across all samples.

I then decided to do the same thing with just DML information. This is when it got more complicated than it needed to be. The original methylation data is in a `methylBase` object, and `PCASamples` only accepts input in that format. I needed a way to subset DML without compromising the format. According to the `methylKit` manual, you can only subset rows using either `select` or `[]`. After two hours of banging my head against a wall trying to `join` or `merge` my list of DML with all methylation data, I left the office and immediately had an epiphany. I realized I could get the row numbers of DML in the original methylation data, save the row numbers as a vector, then use that vector to select the rows I want, and save it as a `methylBase` object.

```{r}
DMLPositions <- rep(0, times = length(diffMethStats50FilteredCov5Destrand$chr)) #Create an empty vector with 598 places to store row numbers
for (i in 1:length(DMLPositions)) {
  DMLPositions[i] <- which(getData(diffMethStats50FilteredCov5Destrand)$start[i] == getData(methylationInformationFilteredCov5Destrand)$start)
} #For each DML, save the row number where that DML is found in methylationInformationFilteredCov5Destrand
tail(DMLPositions) #Confirm vector was created
```

```{r}
DMLMatrix <- methylationInformationFilteredCov5Destrand[DMLPositions,] #Subset methylationInformationFilteredCov5Destrand to only include DML and save as a new methylBase object
sum((DMLMatrix$start) == (diffMethStats50FilteredCov5Destrand$start)) == length(diffMethStats50FilteredCov5Destrand$start) #Confirm that start columns are identical. If they are identical, the sum of all TRUE statements should equal the length of the original methylBase object
tail(DMLMatrix) #Confirm methylBase object creation
```

I then used similar code wtih `PCASamples` and `ordiplot` to create a refined figure.

It's interesting that the first PC explains almost half of the variance in the data! PC 1 is definitely related to experimental conditions.

**Figure 11**. PCA with percent methylation data for DML.

And you betcha I made a multipanel plot.

**Figure 12**. Multipanel plot with PCAs for all CpG loci with 5x data across all samples and DML only.

### Heatmaps for DML

The last thing I wanted to do was make a heatmap of DML! I used `percMethylation` within `methylKit` to obtain the percent methylation matrix `PCASamples` uses.

```{r}
percMethDML <- percMethylation(DMLMatrix, rowids = TRUE) #Get percent methylation for all samples at DML. Include row IDs (chr, start, end) information
```

I used `pheatmap` and `heatmap.2` (from `gplots`) to create heatmaps:

```{r}
pheatmap(percMethDML, color = rev(plotColors),
         cluster_rows = TRUE, clustering_distance_rows = "euclidean", treeheight_row = 70, show_rownames = FALSE,
         cluster_cols = TRUE, clustering_distance_cols = "euclidean", treeheight_col = 40, show_colnames = FALSE,
         annotation_col = data.frame(pCO2 = factor(rep(c("Ambient","Treatment"), each = 5))),
         annotation_colors = list(pCO2 = c(Ambient = "grey90", Treatment = "grey10")),
         annotation_legend = FALSE, annotation_names_col = FALSE,
         legend = TRUE) #Create heatmap using pheatmap using percMethDML and plotColors color scheme. Cluster rows and columns using euclidean distances. Adjust the dendogram tree heights and do not show any row or column names. Create a dataframe with treatment information using annotation_col. Use annotation_colors to indicate colors for treatment ("grey90") and ambient ("grey10") samples. Do not include an annotation_legend or name for annotations (annotatino_names_col). Include a legend.
```

```{r}
par(oma = c(0, 1, 0, 0)) #Adjust outer margins
heatmap.2(percMethDML, col = plotColors, scale = "none", margins = c(1,1),
          trace = "none", tracecol = "black",
          labRow = FALSE, labCol = FALSE,
          ColSideColors = c(rep("grey90", times = 5), rep("grey10", times = 5)),
          key = TRUE, keysize = 1.8, density.info = "density", key.title = "", key.xlab = "% Methylation", key.ylab = "",
          key.par = list(cex.lab = 2.0, cex.axis = 1.5)) #Create heatmap using heatmap.2 from gplots package using percMethDML data. Use plotColors but do not scale data, label rows, or label columns. Use ColSideColors to indicate colors for treatment and ambient samples. Add a legend using key, and adjust keysize. Have key display density data with density.info. Do not add a key title or y-axis label, and label x axis with key.xlab.
mtext("Density", cex = 1.6, las = 3, adj = 0.8, padj = -29) #Manually add y-axis label for key since heatmap.2 doesn't let you change font size
```

I've used `pheatmap` before, but I like how `heatmap.2` also generates a density plot as part of the legend. I decided to save the `heatmap.2` version for the paper.

**Figure 13**. Heatmap of DML with percent methylation density plot in legend.

I tried making a multipanel plot with the heatmap and PCAs, but `heatmap.2` calls `plot.new` within its code so I couldn't create a multipanel plot! I could use `gridGraphics`, but I didn't want to figure out an entirely new package. If I wanted to create a multipanel in the future, I might just use InDesign or PowerPoint.

### Going forward

2. Update methods and results
4. Revise the discussion
5. Revise the introduction
7. Revise my abstract
8. Send to collaborators and committee members
8. Address any new edits and clean up the text
9. Update paper repository
10. Submit to the Special Issue
9. Post the paper on bioRXiv

{% if page.comments %}

Please enable JavaScript to view the comments powered by Disqus.

{% endif %}

gha_language: CSS


text:
[Back to Overview](../../../README.md)

# deeptech.model.layers.tensor_combiners

> Ways of combining tensors.

---
---
## *class* **Stack**(Module)

Stack layers along an axis.

Creates a callable object with the following signature:
* **tensor_list**: (List[Tensor]) The tensors that should be stacked. A list of length S containing Tensors.
* **return**: A tensor of shape [..., S, ...] where the position at which S is in the shape is equal to the axis.

Parameters of the constructor.
* **axis**: (int) The axis along which the stacking happens.

---
### *def* **forward**(*self*, tensor_list)

*(no documentation found)*

---
---
## *class* **Concat**(Module)

Concatenate layers along an axis.

Creates a callable object with the following signature:
* **tensor_list**: (List[Tensor]) The tensors that should be stacked. A list of length S containing Tensors.
* **return**: A tensor of shape [..., S * inp_tensor.shape[axis], ...] where the position at which S is in the shape is equal to the axis.

Parameters of the constructor.
* **axis**: (int) The axis along which the concatenation happens.

---
### *def* **forward**(*self*, tensor_list)

*(no documentation found)*


text:
---
title: Spreadsheet Blog 5
layout: post
author: arandeep.gill
permalink: /spreadsheet-blog-5/
source-id: 17vzQJlBZZCIRMU3utFXNUsfuC8-wkNbXPweejKSAMZc
published: true
---

    Title
    Spreadsheet Blog 5
    Date
    4/10/18

    Starting point:
    To complete our code.

    Target for this lesson?
    To be able to hide the other data that you used.

    Did I reach my target?
(add details to "Lesson
    I did most of the code.

    Lesson Review

    How did I learn? What strategies were effective?

    First our teacher told us about the work that we had to do. We did and overview and briefly talked about what we did last lesson, and then he told us what our task was for the lesson. The task was to complete the code and get as much done by the end of the lesson. We had to continue our code, and this time we had to workout how to hide all of the data inside one of the boxes and then press or change a number to get the data back up again. I managed to do most of it, as I had to finish the work from last week and then I started to code my work so it would hide the data. I managed to write most of the code down, but I didn't manage to complete all of it as it was already the end of the lesson.

    What limited my learning? Which habits do I need to work on?

    I need to work more faster and more efficiently, in this case to manage to finish all of the work on hiding the data in the code, which I almost completed.

    What will I change for next time? How will I improve my learning?

    Next time I will work more quickly, so I can get on and do the work more efficiently, instead of not managing to complete all of the lessons work.


text:
# dask-sql k8s example deployment

This repository contains some example code to deploy `dask-sql`, a Dask cluster and
Apache Hue as BI tool on a k8s cluster.

## Requirements

You need to have a k8s cluster. You can either run a development k8s cluster
locally e.g. via [kind](https://kind.sigs.k8s.io/docs/user/quick-start/)
or [minikube](https://minikube.sigs.k8s.io/docs/start/)
or deploy a cluster on one of the public cloud providers.

After that, make sure you have `kubectl` and `helm` installed
and you can access your cluster.

## Deployment

First, make sure the file `dask-sql/values.yaml` contains
the correct number of workers you want to have and add additional conda packages to install.

Then, call

    helm dependency update dask-sql
    helm upgrade --cleanup-on-fail --install dask-sql dask-sql

After the deployment has finished and all pods are running, do a port-forwarding

    kubectl port-forward svc/hue 8888:8888

and access "http://localhost:8888". You should be able to see the "nyc-taxi" table in the schema called "schema"
in the presto tab.
Please note, that the first access to the server triggers some initialization, which might take a couple
of seconds.

If the `dask-sql` pod is constantly restarting and not getting into running state and the log is stuck at

    Solving environment: ...working... failed with initial frozen solve. Retrying with flexible solve.

try to increase the number `dask_sql.probeDelay` in `dask-sql/values.yaml`.

Now, you can query the data.
For example, try the following query:

```sql
SELECT
    FLOOR(trip_distance / 5) * 5 AS "distance",
    AVG(tip_amount) AS "given tip",
    AVG(predict_price(total_amount, trip_distance, passenger_count)) AS "predicted tip"
FROM "nyc-taxi"
WHERE
    trip_distance > 0 AND trip_distance < 50
GROUP BY
    FLOOR(trip_distance / 5) * 5
```

## How does it work?

The helm chart installs three components:

### Dask cluster

The basis for `dask-sql` is a Dask cluster. Dask already comes with a nice helm chart,
which has many configuration parameters.
We use it via a dependency and just change the number of workers
and the installed packages.

### Apache Hue

For accessing the SQL server, we use the Apache Hue BI tool.
It consists of the webservice and a MySQL database for the settings, which are
deployed using the manifest files in `dask-sql/templates/hue/`.

### `dask-sql`

Finally we can start the `dask-sql` container with a custom startup file, which
looks like this:

```python
import tempfile
import requests
from dask.distributed import Client, wait
import dask.dataframe as dd
import xgboost
import numpy as np
import dask_xgboost

if __name__ == "__main__":
    # Create a dask client
    client = Client("dask-sql-scheduler:8786")
    print("Dashboard:", client.dashboard_link)

    # Load model and register predict function
    bst = xgboost.core.Booster()

    with tempfile.NamedTemporaryFile() as f:
        r = requests.get("https://storage.googleapis.com/dask-sql-data/model.xgboost")
        r.raise_for_status()
        f.write(r.content)
        f.flush()
        bst.load_model(f.name)

    # Our custom function for tip-prediction
    # using the already loaded xgboost model
    def predict_price(total_amount, trip_distance, passenger_count):
        # Create a dataframe out of the three columns
        # and pass it to dask-xgboost, to predict
        # distributed
        X = dd.concat([total_amount, trip_distance, passenger_count],
                        axis=1).astype("float64")
        return dask_xgboost.predict(client, bst, X)

    # Create a context
    from dask_sql import Context, run_server
    c = Context()

    c.register_function(predict_price, "predict_price",
                        [("total_amount", np.float64),
                            ("trip_distance", np.float64),
                            ("passenger_count", np.float64)],
                        np.float64)

    # Load the data from S3
    df = dd.read_csv("s3://nyc-tlc/trip data/yellow_tripdata_2019-01.csv",
        dtype={
            "payment_type": "UInt8",
            "VendorID": "UInt8",
            "passenger_count": "UInt8",
            "RatecodeIDq": "UInt8",
        },
        storage_options={"anon": True}
    ).persist()

    c.create_table("nyc-taxi", df)

    # Finally, spin up the dask-sql server
    run_server(context=c, client=client)
```

If you want to edit the startup file, you need to change `dask-sql/files/run.py`.


text:
---
layout: page
title: About
permalink: /about/
---

Some information about you!

### More Information

I'm a designer, thinker, and Wednesday-evening swing dancer.
Also a Dartmouth '23 taking a gap year! Currently, I'm interning at an organic sourdough formation in southern France, and in the past I've launched a successful [Kickstarter for recyclable cards](https://www.kickstarter.com/projects/1372918543/cheer-up-cards-for-everyone) and wrote a [body-positivity coloring book](https://www.amazon.com/Love-Body-Positivity-Coloring-Book/dp/1977784895) used by a couple hospitals around the country.

### Contact me

###[email<EMAIL_ADDRESS>


text:
# multievent

|     |   |
|-----|---|
|License |[![GitHub](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://raw.githubusercontent.com/karthiknadig/multievent/master/LICENSE)|
|Info |[![PyPI](https://img.shields.io/pypi/v/multievent.svg)](https://pypi.org/project/multievent/) [![PyPI](https://img.shields.io/pypi/pyversions/multievent.svg)](https://pypi.org/project/multievent/)|
|Tests|[![Build Status](https://dev.azure.com/c0d3r/multievent/_apis/build/status/multievent-CI?branchName=master)](https://dev.azure.com/c0d3r/multievent/_build/latest?definitionId=2&branchName=master) [![PyPI](https://img.shields.io/azure-devops/coverage/c0d3r/multievent/4.svg)](https://pypi.org/project/multievent/)|

`multievent` provides a easy API to wait on multiple events.

### Installtion
```console
python -m pip install git+https://github.com/karthiknadig/multievent
```

### Usage
```py
events = [threading.Event() for _ in range(0, 5)]

# Default is ANY
wait = wait_for_multiple_events(events)

# wait blocks until one of the events is set.
wait()
```

#### Wait for all events
```py
events = [threading.Event() for _ in range(0, 5)]

# Default is ANY
wait = wait_for_multiple_events(events, mode=MODE_ALL)

# wait blocks until all of the events are set.
wait()
```

#### Cancel wait
```py
events = [threading.Event() for _ in range(0, 5)]

cancel = CancelWait()
# Default is ANY
wait = wait_for_multiple_events(events, cancel=cancel)

def _run_this():
    time.sleep(5)
    cancel()  # see NOTE below.

t = threading.Thread(target=_run_this)
t.start()

# wait is blocked until either one of the events is set or
# cancel is called
wait()
# NOTE: Cancellation ends all monitoring. You have to call
# wait_for_multiple_events, and get a new wait function.
```

#### Wait for specified count of events

```py
events = [threading.Event() for _ in range(0, 5)]

# Default is ANY
wait = wait_for_multiple_events(events, mode=MODE_COUNT, count=3)

# wait blocks until three events are set.
wait()
```

repository: karthiknadig/multievent

repo_name: karthiknadig/multievent


text:
# react-sdom [![GitHub license](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/bonarja/react-sdom/blob/master/LICENSE) [![NPM version](https://img.shields.io/npm/v/react-sdom.svg)](https://www.npmjs.com/package/react-sdom)

react-sdom is an extension to access the React DOM using references, it returns a ref object with the extra functions of sdom, simplifying the task of manipulating the html DOM and are similar to the most common functions of the old jQuery, all this in a simpler and lighter script summarizing only the essential and more useful.

react-sdom Includes functions to animate the DOM using animate.css as a promise and ajax request.

<br/>

## check the complete documentation in the following link

## [https://bonarja.github.io/sdom/#/React](https://bonarja.github.io/sdom/#/React)

```javascript
import React from "react";
import { Sdom } from "react-sdom";

class Home extends React.Component {
    title = Sdom(); // get Sdom ref h1

    componentDidMount() {
        // use Sdom ref
        this.title
            .css({
                color: "coral",
                textTransform: "uppercase"
            })
            .in("bounceIn", 700)
            .then(() => {
                console.log("finished animation");
            });
    }

    render() {
        return (
            <div>
                <h1 ref={this.title}>hello</h1>
            </div>
        );
    }
}
export default Home;
```

repository: bonarja/react-sdom

repo_name: bonarja/react-sdom