Getting Started
This worksheet shows how you can preprocess and split videos for deep learning. In these examples, we use Google Cloud Storage. In order to actually run this worksheet, you need:
But it's not necessary to run the worksheet; you can follow it and apply the principles to whatever cloud, object, or local storage you use.
Sharded YouTube Files
We have about 6M videos downloaded from YouTube (part of the YouTube 8m dataset released by Google).
These videos are stored as 3000 shards, each containing about 2000 videos and each about 56 Gbytes large.
There is just one sample shard stored in the public bucket gs://nvdata-ytsamples
.
!gsutil ls gs://nvdata-ytsamples/yt8m-lo-*.tar | head
gs://nvdata-ytsamples/yt8m-lo-000000.tar
Each shard contains the video itself (.mp4
) plus a lot of associated metadata.
!gsutil cat gs://nvdata-ytsamples/yt8m-lo-000000.tar | tar tf - | head
---2pGwkL7M.annotations.xml
---2pGwkL7M.description
---2pGwkL7M.dllog
---2pGwkL7M.info.json
---2pGwkL7M.mp4
---2pGwkL7M.txt
-2cScG5TqjQ.annotations.xml
-2cScG5TqjQ.description
-2cScG5TqjQ.dllog
-2cScG5TqjQ.info.json
Splitting the Videos
For training, we usually don't want to use the entire YouTube video at once; they are variable length and are hard to fit into the GPU. Instead, we want to split up the video into frames or short clips.
Here, we are using a script based on ffmpeg to split up each video into a set of clips. We also rescale all the images to a common size. The input video for this script is assumed to be sample.mp4
, and the output clips will be stored in files like sample-000000.mp4
.
%%writefile extract-segments.sh
#!/bin/bash
exec > $(dirname $0)/_extract-segments-last.log 1>&2
#ps auxw --sort -vsz | sed 5q
set -e
set -x
set -a
size=${size:-256:128}
duration=${duration:-2}
count=${count:-999999999}
# get mp4 metadata (total length, etc.)
ffprobe sample.mp4 -v quiet -print_format json -show_format -show_streams > sample.mp4.json
# perform the rescaling and splitting
ffmpeg -loglevel error -stats -i sample.mp4 \
-vf "scale=$size:force_original_aspect_ratio=decrease,pad=$size:(ow-iw)/2:(oh-ih)/2" \
-c:a copy -f segment -segment_time $duration -reset_timestamps 1 \
-segment_format_options movflags=+faststart \
sample-%06d.mp4
# copy the metadata into each video fragment
for s in sample-??????.mp4; do
b=$(basename $s .mp4)
cp sample.mp4.json $b.mp4.json || true
cp sample.info.json $b.info.json || true
done
Writing extract-segments.sh
!chmod 755 ./extract-segments.sh
Running the Script over All Videos in a Shard
Next, we use the tarp
command to iterate the above script over each .mp4
file in shard 000000
.
!tarp proc --help
Usage:
tarp [OPTIONS] proc [proc-OPTIONS] [Inputs...]
Application Options:
-v verbose output
Help Options:
-h, --help Show this help message
[proc command options]
-f, --field= fields to extract; name or name=old1,old2,old3
-o, --outputs= output file
--slice= slice of input stream
-c, --command= shell command running in each sample dir
-m, --multicommand= shell command running in each sample dir
--shell= shell command running in each sample dir (default:
/bin/bash)
%%writefile splitit.sh
gsutil cat gs://lpr-yt8m-lo-sharded/yt8m-lo-000000.tar |
tarp proc -m $(pwd)/extract-segments.sh - -o - |
tarp split - -o yt8m-clips-%06d.tar
Writing splitit.sh
We can now run this script using:
$ bash ./splitit.sh
It's best to do this outside Jupyter since Jupyter doesn't work with long running shell jobs.
Of course, if you want to run this code over all 3000 shards, you probably will want to submit jobs based on splitit.sh
to some job queuing system.
Also note that the --post
option to tarp split
lets us upload output shards as soon as they have been created, allowing the script to work with very little local storage.
Output
Let's have a look at the output to make sure it's OK.
!tar tf yt8m-clips-000000.tar | head
---2pGwkL7M/000000.mp4.json
---2pGwkL7M/000000.info.json
---2pGwkL7M/000000.mp4
---2pGwkL7M/000001.info.json
---2pGwkL7M/000001.mp4
---2pGwkL7M/000001.mp4.json
---2pGwkL7M/000002.info.json
---2pGwkL7M/000002.mp4
---2pGwkL7M/000002.mp4.json
---2pGwkL7M/000003.info.json
tar: write error
These clips have been uploaded to gs://nvdata-ytsamples/yt8m-clips-{000000..000009}.tar
.
Processing Many Shards in Parallel
One of the benefits of sharding is that you can process them in parallel. The YT8m-lo dataset consists of 3000 shards with about 2000 videos each. To process them in parallel, you can use standard tools. You need to modify the script a little to take a shard name and to upload the result into a common bucket.
# splitshard.sh
gsutil cat gs://lpr-yt8m-lo-sharded/yt8m-lo-$1.tar |
tarp proc -m $(pwd)/extract-segments.sh - -o - |
tarp split - -o yt8m-clips-$1-%06d.tar -p 'gsutil cp %s gs://my-output/%s && rm -f %s`
On a single machine, you could run run this script with:
for shard in {000000..003000}; do echo $shard; done |
xargs -i bash splitshard.sh $shard
More likely, you are going to run a job of this size in the cluster, using Kubernetes or some other job queuing program. Generally, you need to create a Docker container containing the above script (and all dependencies), and then submit it with a simple loop again:
for shard in {000000..003000}; do echo $shard; done |
submit-job --container=splitshard-container $1
If you store your shards on AIStore, you can also simply tell AIStore to transform a set of shards using the splitshard-container
for you.


Tina Breaton
Web Developer
Welcome to the future home of your personal website!
Happy Mother's Day. Thanks for always being a great mom.
Love, Nick
Welcome to the future home of your personal website!
Happy Mother's Day. Thanks for always being a great mom.
Love, Nick


Menu
Home
Menu
Beverages
Cakes & Pastries
Snacks
Contact
Previous Slide
◀
Next Slide
▶
Chocolate Roll Cake
Curry Beef Puff
Gyoza
Peach Yukult
New York Cheese Cake


gabriel.plassat (Wed, 26 Jun 2019 13:19:35 GMT):
[copy/paste] from the 1st workshop :
How do we enable the most people to collaborate on redesigning Shared Mobility as a Commons ?
We found four actions to take ranked by importance from our brainstorming sessions
Use an online forum or other tools to enable greater collaboration
Find partners who have an interest in participating in the project
Participate or organize hackathons to develop concepts and MVPs
Engage universities in the project
Which tools and processes should we use to ensure all stakeholders are aligned within this project ?
We discussed several communication tools:
Community discussions, we talked about using: Telegram, Slack and our Meetup group but did not settle on anything yet. We will use a temporary mailing list for now for those interested.
Knowledge sharing, we discussed creating a Facebook group, setting up a Discourse forum or using a miro board , but did not settle on anything yet.
File-sharing and collaboration, we will continue to use our google drive folder, please contact me to get write access.
Blogging, we will continue to use our medium blog
Event planning, we will continue to use our meetup group
The tools for knowledge sharing and community discussions are important and before making a decision, I will also try and gather inputs at a conference next week called Open 2019 where people might have insights on this.
For those who missed the event they can find the presentation from the event here
https://docs.google.com/presentation/d/140tWTLxsbAHPh66ccLIjLflL0q-Uu8PlnAJr4z96Kkw/edit?usp=sharing
gabriel.plassat (Fri, 28 Jun 2019 07:16:58 GMT):
nous avons aussi https://forum.fabmob.io/
gabriel.plassat (Fri, 28 Jun 2019 07:20:13 GMT):
Partager des vélos recyclés https://wiki.lafabriquedesmobilites.fr/wiki/Partageons_plus_de_v%C3%A9lo
gabriel.plassat (Fri, 28 Jun 2019 07:26:04 GMT):
Blog de @troels https://medium.com/open-mobility
gabriel.plassat (Fri, 28 Jun 2019 07:31:24 GMT):
[ ](https://chat.fabmob.io/channel/0-denmark?msg=8XT8nNpHkPLGNd4Dk) Une solution open source pour partager des vélos recyclés https://wiki.lafabriquedesmobilites.fr/wiki/Cyclovis_-_service_de_v%C3%A9lo_partag%C3%A9_open_source par @sebastien.roques - nous pourrions le tester au Denmark :-)
sebastien.roques (Fri, 28 Jun 2019 07:31:24 GMT):
Has joined the channel.
gabriel.plassat (Fri, 28 Jun 2019 07:32:37 GMT):
les projets en cours :
gabriel.plassat (Fri, 28 Jun 2019 07:32:58 GMT):
Clipboard - 28 juin 2019 09:32
gabriel.plassat (Fri, 28 Jun 2019 07:41:00 GMT):
Propositions d'actions:
- copier/coller l'article Medium sur le blog de la FabMob
- regarder les 8 projets de communs en cours de production
- lister les sujets/projets imaginés coté Denmark
- puis ouvrir une FabMob denmark :-)
gabriel.plassat (Wed, 17 Jul 2019 14:10:41 GMT):
cc @troels
troels (Mon, 19 Aug 2019 12:15:25 GMT):
Désole pour ma réponse tardive, j'ai été déconnecté depuis quelque temps
Cet semaine je vais aller à Berlin pour faire partie du hackathon ETHBerlin, ou je vais vois si je peut faire quelques prototypes pour le prochain
https://github.com/ethberlinzwei/Find-A-Team/issues/10
Également ca va me permetre de me mètre à jour sur le dernière développement sur les sujets des "DAO's" et de "Token Engeneering" pour vois si je pourrais écrire un ou deux articles sur les sujets, pour voir s’il y a des idées qui pourrais être utilisé pour obtenir "shares mobility as a commons"
troels (Mon, 19 Aug 2019 12:39:33 GMT):
I also meet with @osarrat in Copenhagen a month ago and had a great introduction to their shared mobility project. Maybe there woudl be ways to collaborate there also.
osarrat (Mon, 19 Aug 2019 12:39:33 GMT):
Has joined the channel.
troels (Mon, 19 Aug 2019 12:41:14 GMT):
I think these are good initiatives, lets make it happen.
I am currectly going through the 8 projects, to see if we can collaborate on them.
gabriel.plassat (Thu, 22 Aug 2019 16:09:41 GMT):
Great we can start by a short description of theses 8 projects. It's possible to describe theses projects on the wiki if you want ?
troels (Wed, 25 Sep 2019 14:09:43 GMT):
Here in Copenhagen we are running a small experiment in two weeks during a large climate conference in the city:
https://bit.ly/2kYE5xE
osarrat (Wed, 25 Sep 2019 14:13:35 GMT):
Hi @troels !
I hope you spend a good summer and a good Roskilde festival ;)
Regarding bike sharing, I was yesterday at the FabMob General Assembly, and I heard about experiments using basic locks (with codes and not a key) and a chatbot. You can also take a look at those pages on the wiki : https://wiki.lafabriquedesmobilites.fr/wiki/Open_source_Bike_Share
https://wiki.lafabriquedesmobilites.fr/wiki/Cadenas_Connect%C3%A9_O.S._pour_V%C3%A9lo_Partag%C3%A9
Best !
gabriel.plassat (Wed, 25 Sep 2019 14:16:07 GMT):
thank you @troels , interesting project !! and @osarrat already give the right information. We have an open source chatbot that can manage code for standard lockers. I think it's complementary with your project
troels (Wed, 25 Sep 2019 14:17:08 GMT):
That could be usefull if we cannot make it worked with unlocked bikes, which me probably will find is not working, but would like to try it first
gabriel.plassat (Wed, 25 Sep 2019 14:26:34 GMT):
Evopod improve the chatbot and it's operationnel for bike sharing :-) cc @sebastien.roques
troels (Wed, 25 Sep 2019 14:27:52 GMT):
Also i am in dialog with http://common.bike/ which is also looking into making open souce solutions for bike sharing, but have postponed the tech part a bit as I wanted to make this very simple eksperiment first
gabriel.plassat (Wed, 25 Sep 2019 14:30:21 GMT):
great. I think you are right => we need to test this "extreme" scenario a fully open bike sharing service. In parallel we can discuss with a lowtech scenario
troels (Fri, 04 Oct 2019 12:32:54 GMT):
We are preparing to launch our shared bike next week and have created this website, where people can share their jouney on the bike
http://freebikeshare.org/
gabriel.plassat (Fri, 04 Oct 2019 12:44:25 GMT):
Excellent ! how can we help this project ??
troels (Fri, 04 Oct 2019 12:50:23 GMT):
For now we are just getting the first bike into the street so see if it can remain there without getting stolen and if it is sufficient with a low-tech tracking like this using #freebikeshare and a guest book. If it works we can maybe try and refurbish some bikes elsewhere.
troels (Fri, 04 Oct 2019 12:50:48 GMT):
Thanks for asking :-)
gabriel.plassat (Fri, 04 Oct 2019 12:55:55 GMT):
so there's no tracker at all on the bike ?
troels (Fri, 04 Oct 2019 12:57:44 GMT):
No, none at all in this first test.
gabriel.plassat (Tue, 29 Oct 2019 15:49:13 GMT):
Hi troels, do you have feedbacks on your shared bike ?
Caubel (Tue, 10 Mar 2020 16:54:32 GMT):
Has joined the channel.
laura.foglia (Tue, 10 Mar 2020 17:10:11 GMT):
Has joined the channel.
Jean.ROBERT (Tue, 10 Mar 2020 17:59:43 GMT):
Has joined the channel.
yann.tremeac (Thu, 12 Mar 2020 12:19:20 GMT):
Has joined the channel.
jerome-poyet (Mon, 16 Mar 2020 14:16:46 GMT):
Has joined the channel.
laurence.mechin (Mon, 16 Mar 2020 14:32:32 GMT):
Has joined the channel.
mireille (Mon, 16 Mar 2020 14:34:07 GMT):
Has joined the channel.
pierre.taillant (Mon, 16 Mar 2020 14:47:09 GMT):
Has joined the channel.
remy.leboennec (Mon, 16 Mar 2020 15:27:47 GMT):
Has joined the channel.
lara.hoelting (Tue, 17 Mar 2020 13:31:29 GMT):
Has joined the channel.
nicolas.lb (Fri, 20 Mar 2020 10:47:50 GMT):
Has joined the channel.
kmog (Fri, 20 Mar 2020 11:55:29 GMT):
Has joined the channel.
lea.chretien (Fri, 20 Mar 2020 15:19:08 GMT):
Has joined the channel.
paul_bridier (Fri, 20 Mar 2020 16:09:00 GMT):
Has joined the channel.
Yao (Fri, 20 Mar 2020 19:07:51 GMT):
Has joined the channel.
cecile.lavernhe (Mon, 23 Mar 2020 09:37:29 GMT):
Has joined the channel.
marc.cottignies (Mon, 23 Mar 2020 10:30:14 GMT):
Has joined the channel.
sandrine.carballes (Mon, 23 Mar 2020 10:50:22 GMT):
Has joined the channel.
Kiki (Mon, 23 Mar 2020 13:05:53 GMT):
Has joined the channel.
louise.kold-taylor (Mon, 23 Mar 2020 18:31:54 GMT):
Has joined the channel.
ClaraB (Sun, 29 Mar 2020 15:05:13 GMT):
Has joined the channel.
emmanuel.poisson-quinton (Mon, 30 Mar 2020 08:54:32 GMT):
Has joined the channel.
Cath (Mon, 30 Mar 2020 18:46:58 GMT):
Has joined the channel.
pony (Wed, 01 Apr 2020 09:23:41 GMT):
Has joined the channel.
salvatore.cimmino (Fri, 03 Apr 2020 13:51:37 GMT):
Has joined the channel.
karine (Sat, 04 Apr 2020 19:51:30 GMT):
Has joined the channel.
camillem (Sun, 05 Apr 2020 18:35:45 GMT):
Has joined the channel.
jonatan.cloutier (Tue, 07 Apr 2020 20:47:35 GMT):
Has joined the channel.
marie-pierre.gendron (Fri, 10 Apr 2020 14:42:06 GMT):
Has joined the channel.
Jesse (Fri, 10 Apr 2020 20:41:12 GMT):
Has joined the channel.
gontrand.dumont (Fri, 10 Apr 2020 20:55:01 GMT):
Has joined the channel.
xavier.massicotte (Fri, 10 Apr 2020 21:00:36 GMT):
Has joined the channel.
clem (Fri, 10 Apr 2020 21:28:11 GMT):
Has joined the channel.
marie.tack (Fri, 10 Apr 2020 21:52:00 GMT):
Has joined the channel.
Ysaia (Sat, 11 Apr 2020 01:32:32 GMT):
Has joined the channel.
ameliepb (Sat, 11 Apr 2020 14:18:09 GMT):
Has joined the channel.
laurent.lewis (Sun, 12 Apr 2020 16:22:41 GMT):
Has joined the channel.
Amelie (Sun, 12 Apr 2020 22:36:33 GMT):
Has joined the channel.
Amelie (Sun, 12 Apr 2020 22:38:43 GMT):
Has left the channel.
maude.lapointe (Mon, 13 Apr 2020 15:33:30 GMT):
Has joined the channel.
melissa.dlf (Mon, 13 Apr 2020 16:04:06 GMT):
Has joined the channel.
eva.murith (Mon, 13 Apr 2020 18:27:03 GMT):
Has joined the channel.
mathieu.couture (Mon, 13 Apr 2020 19:23:57 GMT):
Has joined the channel.
penelope.stuart (Mon, 13 Apr 2020 19:32:11 GMT):
Has joined the channel.
guillaume.fortin (Mon, 13 Apr 2020 19:34:23 GMT):
Has joined the channel.
chloe.fortier.devin (Mon, 13 Apr 2020 19:36:22 GMT):
Has joined the channel.
Romain_Gayet (Mon, 13 Apr 2020 19:37:26 GMT):
Has joined the channel.
nestel.jeremie (Tue, 14 Apr 2020 09:23:55 GMT):
Has joined the channel.
HeleneCauchoix (Tue, 14 Apr 2020 18:50:35 GMT):
Has joined the channel.
marie-helene.beaudry (Tue, 14 Apr 2020 22:35:31 GMT):
Has joined the channel.
mathieu.couture (Wed, 15 Apr 2020 14:09:36 GMT):
Has left the channel.
alexandre g (Fri, 17 Apr 2020 10:04:32 GMT):
Has joined the channel.
test_du_nouveau_bouton (Fri, 17 Apr 2020 13:01:05 GMT):
Has joined the channel.
ju.tav (Fri, 17 Apr 2020 16:34:01 GMT):
Has joined the channel.
Arthur (Fri, 17 Apr 2020 16:43:01 GMT):
Has joined the channel.
test_du_nouveau_bouton (Sat, 18 Apr 2020 20:14:35 GMT):
Has left the channel.
Pierre_Lagrandmaison (Mon, 20 Apr 2020 14:48:33 GMT):
Has joined the channel.
diana.borda (Wed, 22 Apr 2020 02:01:20 GMT):
Has joined the channel.
marie-reine.roy (Thu, 23 Apr 2020 13:00:41 GMT):
Has joined the channel.
ValerieM (Thu, 23 Apr 2020 16:47:02 GMT):
Has joined the channel.
melanie.marceau-d (Fri, 24 Apr 2020 15:33:28 GMT):
Has joined the channel.
cynthia.hamel-kropf (Sun, 26 Apr 2020 20:33:47 GMT):
Has joined the channel.
BENOIT_TROUVE (Mon, 27 Apr 2020 06:16:37 GMT):
Has joined the channel.
ali.saidi (Mon, 27 Apr 2020 20:08:18 GMT):
Has joined the channel.
AnneJulie_AB (Mon, 27 Apr 2020 22:22:55 GMT):
Has joined the channel.
alexandre.barreto (Tue, 28 Apr 2020 07:17:03 GMT):
Has joined the channel.
thierry.lachapelle (Tue, 28 Apr 2020 12:27:37 GMT):
Has joined the channel.
clement (Tue, 28 Apr 2020 17:37:13 GMT):
Has joined the channel.
helene.dimanche (Tue, 28 Apr 2020 20:28:58 GMT):
Has joined the channel.
Julie-Scheid (Wed, 29 Apr 2020 14:27:14 GMT):
Has joined the channel.
veloma (Wed, 29 Apr 2020 18:55:39 GMT):
Has joined the channel.
leandre (Wed, 29 Apr 2020 23:06:08 GMT):
Has joined the channel.
camille.jolain (Fri, 01 May 2020 01:54:01 GMT):
Has joined the channel.
johanne.belle-isle (Fri, 01 May 2020 17:07:03 GMT):
Has joined the channel.
RPP-Ysaia-Melanie-Chloe (Fri, 01 May 2020 18:53:46 GMT):
Has joined the channel.
damien.lhouillier (Mon, 04 May 2020 14:00:00 GMT):
Has joined the channel.
tqmn (Mon, 04 May 2020 16:12:38 GMT):
Has joined the channel.
mael (Wed, 25 Nov 2020 16:06:41 GMT):
Has joined the channel.
mael (Wed, 25 Nov 2020 16:06:41 GMT):
Hi everyone, as announced (in French) on #1-general, we're currently reorganizing this chat, removing most of the channels to keep a smaller, broader and hence more active selection.
This one is moving to #international :)
If your discussion is public, please use forum.fabmob.io/c/international/11 instead to get more views than this logged-in only chat
mael (Wed, 25 Nov 2020 16:33:44 GMT):
mael (Wed, 25 Nov 2020 16:33:44 GMT):
mael (Wed, 25 Nov 2020 16:33:44 GMT):
mael (Wed, 25 Nov 2020 17:13:02 GMT):
Groupe privé
mael (Thu, 26 Nov 2020 11:17:39 GMT):
Canal
mael (Thu, 26 Nov 2020 11:18:20 GMT):
Has joined the channel.
mael (Thu, 26 Nov 2020 11:18:21 GMT):
(navré pour tous ces messages d'administration, je fais des tests pour notre gestion des salons :sweat_smile: )


Google Chrome requires an extension to view locally stored projects. Alternatively, upload your RP file to Axure Cloud or use a different browser. You can also Preview from Axure RP.
What is a Chrome Extension? Extensions are downloadable plug-ins for Google Chrome that modify the browser and allow you additional capabilities.
Why do I need to install the extension? Google requires this extension to be installed to allow the viewing of local files in Chrome
Why does this extension require a high access level? This extension requires a high access level to allow the viewing of the file:// protocol. Axure does not track or access any of your information.
Need help or have any questions? Contact our support team at support@axure.com.


Macro Morning
by Chris BeckerBy Chris Becker
Overnight markets were rocked again as the possibility of the US/China trade talks extending well into 2020 firmed, as domestic concerns outweighed the bigger picture, stumbling on tariffs again. US stocks are down nearly 1% going into the close while the USD has firmed against most of the majors.
There are 2069 words left in this subscriber-only article.


I am Emma
Emma Nichols-Payne is an artist from Fort Worth Texas. She grew up training in studio commercial dance attending intensives in LA, NYC and Arizona. Starting in high school she began to pursue commercial dance with the local hip-hop crew Motiv8 All-stars, directed by Michael miles, performing at local gigs and music videos.
Currently finishing up her BFA in dance at Sam Houston State university she has kept her commercial career alive while training for the contemporary modern world.
Recently she has danced back up for Nio Amnesty and performed at the 2017 Super Bowl Patriots private parties. Making her Musical theatre debut last spring in SHSU’s production of Hairspray she found a new passion for the musical theater world and continues to train for Musical theatre as well as modern contemporary dance.
After graduation her initial goal is to perform in as many art forms that cross her path, big goals are Broadway and Cirque De Solei, but one must start somewhere so she is ready to set sail dancing on a cruise ship meeting all walks of life while grooving to her own beat.


Introduction
Welcome to the UpStride Documentation!
UpStride improves the overall performance of neural networks by leveraging the properties of our proprietary datatype, Hycor.
It offers a computational engine (that packages the Hycor) and a Python API to be used with TensorFlow/Keras.
Among the benefits of using UpStride instead of pure TensorFlow:
- Reduce in up to 10x the amount of data necessary to train a neural net in computer-vision tasks while keeping the same accuracy.
- Boost the accuracy performance of your neural network
- Generate more compact models (less floating-point parameters). This eases the deployment of neural nets in low-power and mobile devices, reducing energy consumption.
Check out the video below for an overview of UpStride.
How it works
UpStride integrates seamlessly with TensorFlow 2.2 (other frameworks, e.g. PyTorch, will be available in the future). It is assumed the user is experienced with development based on TensorFlow/Keras.
We offer two ways to use UpStride, either on the cloud or on premises:
- UpStride Cloud:
- Make training and inference requests using the UpStride REST API
- Expose trained models to the internet by creating unique endpoints
- Command-line interface (CLI) and simple web interface
- UpStride Enterprise:
- Docker is shipped to the client
- It can be installed in a local server/machine (requires the purchase of a license)
- Access to full-blown functionalities of the UpStride Python API.
Here is how UpStride integrates within a training/inference AI pipeline:
The dashed box represents the UpStride Docker container. The user runs the docker, loads her datasets and scripts, and uses the UpStride API to build neural networks that leverage the UpStride engine computational power.
Getting Upstride Engine
Upstride's products are packaged into docker containers images. The images are available in private docker registry listed below:
registry.us.upstride.io
--> for clients in the US
registry.upstride.io
--> for clients in the Europe
It is mandatory to use the docker cli to interact with the private registries. Don't try to download the content of the registry with the webbrowser. You will be automatically redirected to this document.
You only need two pieces of information to download containers images in the registry:
1. Login credentials i-e username and password
2. The exact docker image's name
Those information cannot be guessed out. There are provided during Upstride's onboarding or products delivery. Please contact us to have more information.
@upstride
When you received those information, use standard docker commands to login and pull docker images:
docker login -u username -p password registry.us.upstride.io
docker pull registry.us.upstride.io/image_repo/image_name:image_tag
Using Upstride Engine
Introduction
This is a simple Upstride neural network:
import tensorflow as tf
from upstride.type2.tf.keras import layers
inputs = tf.keras.layers.Input(shape=(224, 224, 3))
x = layers.TF2Upstride()(inputs)
x = layers.Conv2D(32, (3, 3))(x)
x = layers.Activation('relu')(x)
x = layers.Conv2D(64, (3, 3))(x)
x = layers.Activation('relu')(x)
x = layers.Flatten()(x)
x = layers.Dense(100)(x)
x = layers.Upstride2TF()(x)
model = tf.keras.Model(inputs=[inputs], outputs=[x])
UpStride's engine is divided in three main modules type1, type2 and type3.
Each module has his special capabilities and should be used to enhance a Deep Neural Networks in their specific cases.
Every module encapsulate a API similar to Keras.
To use it, start by importing the layers package from the upstride type you want to use.
Then the neural network can be define using keras API. Start by defining a Input, convert it to Upstride by calling layers.TF2Upstride
and build
the neural network the same way you do with Keras. At the end of the neural network call layers.Upstride2TF
to convert back upstride tensor to
TensorFlow tensor.
For training and inference, all TensorFlow tools can be used (distribute strategies, mixed-precision training...)
Hycor API 1.2
The Hycor is UpStride's unique and proprietary datatype. The following documentation describes how one can use and benefit from the Hycor-based layers to build neural networks.
This is the documentation of the Hycor API 1.2.
Only Python 3.6 or later is supported.
Module: upstride
The main module, where the UpStride custom layers are implemented.
UpStride's engine is divided in three main modules type1
, type2
and type3
.
Each module has his special capabilities and should be used to enhance a Deep Neural Networks in their specific cases.
Every module has the same the same type of layers and functions availables.
Submodule: upstride.type1
to import type 1
from upstride.type1.tf.keras import layers
This submodule should be used to deal with 2D data like points, lines, polygons or grayscale images. The type1 submodule layers are accesible by:
Submodule: upstride.type2
to import type 2
from upstride.type2.tf.keras import layers
This submodule should be used to deal with simple 3D data like 3D point cloud, 3D lines, polyhedrons or colored images. The type2 submodule layers are accesible by:
import upstride.type2.tf.keras.layers as uplayers
Submodule: upstride.type3
to import type 3
from upstride.type3.tf.keras import layers
This submodule should be used to deal with more complex 3D data like 3D point cloud, 3D lines, polyhedrons or colored images. The type3 submodule layers are accesible by:
Compromise between model size and accuracy performance (the 'factor' parameter)
This is a simple Upstride neural network with factor parameter:
import tensorflow as tf
from upstride.type2.tf.keras import layers
factor = 4
inputs = tf.keras.layers.Input(shape=(224, 224, 3))
x = layers.TF2Upstride()(inputs)
x = layers.Conv2D(32 // factor, (3, 3))(x)
x = layers.Activation('relu')(x)
x = layers.Conv2D(64 // factor, (3, 3))(x)
x = layers.Activation('relu')(x)
x = layers.Flatten()(x)
x = layers.Dense(100 // factor)(x)
x = layers.Upstride2TF()(x)
model = tf.keras.Model(inputs=[inputs], outputs=[x])
The simplest way to adapt your own code is described above: you only need to call the UpStride layers instead of regular TensorFlow. It allows the user to readily benefit from the superior learning capabilities of our Engine. This is the "vanilla" way of using UpStride.
However, due to the way the underlying UpStride mathematics is implemented, the vanilla approach results in a model that contains more free parameters than its pure TensorFlow counterpart. That's the way to go if you are after accuracy performance at all cost and can afford training bigger models.
However, there are use cases that ask for an increase in accuracy performance but are also constrained by the final size of the model. This is the case for any application that deploys intelligence on the edge, e.g., smartphones, IoTs -- every extra megabyte, or even kilobyte, may prevent the model to fit in the limited memory (RAM and storage) of edge devices.
The factor parameter L enables the user to make a compromise between overall accuracy performance and total number of free parameters of a model.
Let's revisit the code snippet of the examples above:
Type 2 specificities
When working in type 2, some options are available to improve the neural-network performance.
Tf2Upstride
Several strategies are available to convert TensorFlow tensors to Upstride tensors.
Default
x = layers.TF2Upstride()(inputs)
default
: our data structure is initialized with 0.
joint
x = layers.TF2Upstride(strategy='joint')(inputs)
joint
: the color information is used to create our data structure
grayscale
x = layers.TF2Upstride(strategy='grayscale')(inputs)
grayscale
: both the rgb and grayscale information are used to create our data structure
learned
x = layers.TF2Upstride(strategy='learned')(inputs)
learned
: a small neural network (2 convolutions with 3x3 kernel and 3 channels) is learning a mapping to project the information to our data structure. This method is a bit more expensive but may give better results
Upstride2TF
To concatenate the Hycor into a single vector
x = layers.Upstride2TF(strategy = "concat")(x)
Two strategies are possible:
- default
- concat
default
mode outputs a tensor that keeps only the first slot of the Hycor, whereas concat
generates a vector by merging all the slots of the Hycor together.


---
layout: post
title: 'Priceonomics Blog: What Happens to Stolen Bicycles?'
date: '2012-09-23T14:40:00.000-04:00'
author: Bob Sica
tags:
- Link
- crime
- cycling
- bike theft
- economics
modified_time: '2013-08-01T16:06:03.721-04:00'
blogger_id: tag:blogger.com,1999:blog-4599947215754335931.post-4002521489077650552
blogger_orig_url: http://blog.bobsica.com/2012/09/priceonomics-blog-what-happens-to.html
---
Thanks to John Gruber (@gruber) on Daring Fireball for pointing out this article on why “a$$holes” steal so many bikes. Was going to take my bike to SF, maybe not after reading this.
At Priceonomics, we are fascinated by stolen bicycles. Put simply, why the heck do so many bicycles get stolen? It seems like a crime with very limited financial upside for the thief, and yet bicycle theft is rampant in cities like San Francisco (where we are based). What is the economic…Priceonomics Blog: What Happens to Stolen Bicycles?


Chemical Engineer. AI Enthusiast. Adventurer.
Acceleration Consortium Research Fellow
Find Out More!
Chemical Engineering, Ph.D.
Chemical Engineering, M .Sc.
Environmental Engineering, M .Sc.
Chemical Engineering, B .Sc.
Python
MATLAB
JavaScript
HTML5
CSS
Deep Learning
Large Language Models
Cloud (AWS)
High Performance Computing
Computational Fluid Dynamics
Molecular Dynamics Simulations
Software Development
Web Development
Acceleration Consortium Postdoc Fellowship (2023)
Battery Informatics & ML Competition, Materials Research Society (2022)
Kwang-Yu and Lee-Chien Wang Fellowship (2021)
Earl W. Costich Fellowship (2020)
Mike Alizadeh Scholarship (2017)
University of Sharif Computer-Aided Chemical Engineering Contest (2014)
Acceleration ConsortiumToronto, ON(June 2023 - Present)
University of RochesterRochester, NY(Jan 2019 - May 2023)
Toyota Research InstituteLos Altos, CA(May 2022 - March 2023)
Missouri S&T Solar Car Design TeamRolla, MO(2016 - 2018)
Missouri S&TRolla, MO(2016 - 2018)
Goodyear Tire & Rubber Co.Akron, OH(May - Dec 2017)
Emden-Leer University of Applied SciencesEmden, Germany(July - Sep 2014)


no idea what
no idea what the fuckThis is an R HTMLdocument. When you click the Knit HTML button a web page will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: D3 allows you to bind arbitrary data to a Document Object Model (DOM), and then apply data-driven transformations to the document. For example, you can use D3 to generate an HTML table from an array of numbers. Or, use the same data to create an interactive SVG bar chart with smooth transitions and interaction.
D3 is not a monolithic framework that seeks to provide every conceivable feature. Instead, D3 solves the crux of the problem: efficient manipulation of documents based on data. This avoids proprietary representation and affords extraordinary flexibility, exposing the full capabilities of web standards such as HTML, SVG, and CSS. With minimal overhead, D3 is extremely fast, supporting large datasets and dynamic behaviors for interaction and animation. D3's functional style allows code reuse through a diverse collection of official and community-developed modules.D3 allows you to bind arbitrary data to a Document Object Model (DOM), and then apply data-driven transformations to the document. For example, you can use D3 to generate an HTML table from an array of numbers. Or, use the same data to create an interactive SVG bar chart with smooth transitions and interaction.
is is an R HTML document. When you click the part inside span slkajdlsjdoasjd
You can also embed plots, for example:
D3 is not a monolithic framework that seeks to provide every conceivable feature. Instead, D3 solves the crux of the problem: efficient manipulation of documents based on data. This avoids proprietary representation and affords extraordinary flexibility, exposing the full capabilities of web standards such as HTML, SVG, and CSS. With minimal overhead, D3 is extremely fast, supporting large datasets and dynamic behaviors for interaction and animation. D3's functional style allows code reuse through a diverse collection of official and community-developed modules.D3 allows you to bind arbitrary data to a Document Object Model (DOM), and then apply data-driven transformations to the document. For example, you can use D3 to generate an HTML table from an array of numbers. Or, use the same data to create an interactive SVG bar chart with smooth transitions and interaction.
D3 is not a monolithic framework that seeks to provide every conceivable feature. Instead, D3 solves the crux of the problem: efficient manipulation of documents based on data. This avoids proprietary representation and affords extraordinary flexibility, exposing the full capabilities of web standards such as HTML, SVG, and CSS. With minimal overhead, D3 is extremely fast, supporting large datasets and dynamic behaviors for interaction and animation. D3’s functional style allows code reuse through a diverse collection of official and community-developed modules.D3 allows you to bind arbitrary data to a Document Object Model (DOM), and then apply data-driven transformations to the document. For example, you can use D3 to generate an HTML table from an array of numbers. Or, use the same data to create an interactive SVG bar chart with smooth transitions and interaction.


Android is an open source Operating System (OS) for mobile platforms, particularly for phones and tablets. It was developed by Google, but other companies (particularly hardware manufacturers) have written customizable OS layouts (known as flavors) on top of the OS.
Its apps are distributable on Google Play, a distribution network for apps and other media. Apps are distributed as application package (APK) files.
Android has a Linux kernel written in C as a hardware abstraction layer.
The Android framework is written in Java in the package com.android
. The same framework is used for apps that come with the OS and apps written by other developers. A few notable components of the Android framework:
Activity
controls the GUI for an individual screen of the app.Intents
and BroadcastReceivers
to allow any app to handle specific kinds of requests by default as explained later.NotificationManagers
so these can occur in a uniform way.User applications are written in Java, but they can use native code if performance is an issue. There are four main components to user applications.
Activities
represent individual screens. Views
are the base class of all UI components, and collections of Views
are organized into layouts known as ViewGroups
.
BroadcastReceivers
respond to an event from outside the app.Manifest
file. We'll only touch on this in this tutorial, but you can find more info here.Services
are tasks that run without UIs. You would want these if you need something to run in the background while the UI is not being displayed because the user has switched to another application. The Service
can later be connected to the UI. A music application would use this to play music while the user switches to other apps.Each app runs on its own process, and each app is registered to the Linux kernel as a unique user to protect against malicious code and against bugs.
While Android does all it can to conserve resources, there are times when apps must die to make room for other resource-consuming apps. Thus, the app must save state about meta-information to the UI (such as where you're scrolled on a page) so that the app can return to the state the user expects upon resuming use of the app.
The Home application (like the Desktop of Android) is always running so it's easily accessible, but other Android applications use a LIFO stack of Activities
so Android can easily go back through a series of screens.
Activities
within an app and across apps.Android will give the app an opportunity to save and restore its state with various callback methods listed in the dynamic section below. Figure 1-1 (taken from Android's documentation) will help to clarify.
onCreate()
gets called when your Activity
is created.onPause()
gets called when Android takes your Activity
off the foreground. This is the only method that's guaranteed to be called before an Activity
is destroyed (onStop()
and onDestroy()
are not called in case of an emergency), but it also should be lightweight since it's called frequently. So make it comprehensive but short! onResume()
restores this state.onCreate()
to onDestroy()
. In onDestroy()
, you should save everything you need in a persistent state so you can restore it from scratch when the Activity
is launched again.onStart()
to onStop()
.onResume()
to onPause()
.onSaveInstanceState()
and onRestoreInstanceState()
are only for saving the state of the UI, but not persistent data. There are default versions already implemented that you can override.The NotificationManager
provides an API so that all apps can have a consistent presentation of notifications.
Regarding buttons at the bottom of an Android screen: newer phones as shown in Figure 1-2 have the following virtual buttons at the bottom of most screens.
On older devices (as pictured in Figure 1-3), you'll find more fixed, dedicated buttons for the following functions in the below dynamic section.
Both new and old phones also have a power button and a button to increase and decrease volume. In the past, you would have to implement the functionality of the Menu button, but now you don't have to worry about it.
A note on compatibility amidst various Android devices: it's best to have different configurations (layout and resources such as media files) for different screen sizes. Static strings and images should be separate from the code (in the resources folder) so you can maintain them separately and facilitate accommodation of various devices. It's also notable that some devices have limited features (e.g. not all devices have GPS), so you must define the necessary features and the minimum platform required (version of Android) in the Manifest
file.
There are also a variety of platform versions for Android--it's ideal to pick the one that has the lowest functionality you need for your app. If you want to support most platforms and only disable particular features on unsupported platforms, see this article.
To read more on Android's architecture, see the 3-part YouTube series on Androidology. For background on everything else, see Android Fundamentals.


Natural Language Processing
Resources for starting to learn NLP
These are resources for a variety of topics within Natural Language Processing (NLP). Many of these were created when I was learning about NLP or were created for the intro to NLP DiRP (Directed Reading Program) I am leading. I am by no means an expert on these topics, just a student wanting to share her knowledge. Please let me know if you see any mistakes here!
- What is it?
- What kind of tasks exist?
- Where is the field now?
This site explains in detail much where the field is currently and what kinds of tasks are being explored.
Transformers are the building blocks for the language models we see today. They are built on the concept of attention and consist of encoder and decoder stacks. Attention allows for models to remember the context that a word was found in. This is what BERT and other popular language models are built on top of. The notes below come from The Illustrated Transformer. These notes are better used as a supplement to the blog post than a replacement. If you are trying to implement a transformer based model, look into Hugging Face and their Transformers library.
Additionally, this Twitter thread contains a thread of useful resources to fully understand the concept from a high-level idea to the implimentation details.
Alammar, Jay (2018). The Illustrated Transformer [Blog post]. Retrieved from https://jalammar.github.io/illustrated-transformer/
Large language models like BERT and GPT have taken over the field of NLP and are seen on many of the state of the art models for a variety of tasks. These language models are trained on HUGE amounts of data at large companies (Google and OpenAI).
Below, I've attached my notes from reading The Illustrated BERT. I would recommend reading his blog post and use these notes as a supplement since he explains the math behind this model much better than my notes can.
Alammar, Jay (2018). The Illustrated BERT [Blog post]. Retrieved from http://jalammar.github.io/illustrated-bert/
As the influence of technology in our world continues to grow, the need for ethical considerations for how that technology is used also grows.


menu
New Presentation
Open Presentation…
Save
Save As…
Exit
Start Presenting
help_outline
Help
Settings
×
Save Changes
You have unsaved changes in the editor. Do you want to save the current document?


Source code for vmlibs
#! /usr/bin/env python
#
"""
Basic functions to operate on Virtual Machines in a set of clouds.
In more detail, `vmlibs` provides a functional interface to:
* Start/check status/stop a VM in a cloud infrastructure.
* List VM images and their associated metadata.
* List available machine types/sizes.
"""
# Copyright (C) 2011 ETH Zurich and University of Zurich. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
__docformat__ = 'reStructuredText'
__version__ = '$Revision$'
[docs]class VMControl(object):
"""
Control the lifecycle of a VM.
"""
def __init__(self):
"""
Initialize an empty VMControl object. You must run
configuration methods in order to get a working object.
"""
pass
[docs] def import_configuration(self, filename):
"""
Read `filename` and use it to configure this `VMControl` instance.
"""
pass
[docs] def list_available_machtypes(self):
"""
Query cloud servers and return a list of machine types available.
The return value is a list of "machine type IDs";
you should run `get_machtype_info` to translate the IDs into
information that can be programmatically consumed.
"""
pass
[docs] def get_machtype_info(self, mtid):
"""
Return complete information on the machine type identified by
`mtid`.
The return value is a named tuple object, with the following fields:
========= ===== ==================================
attribute type meaning
========= ===== ==================================
id str a copy of `mtid`
ram int amount of RAM, in MB
slots int number of CPU cores available
bandwidth int max bandwidth, in MB/s
cloud str identifier of the Cloud provider
========= ===== ==================================
"""
pass
[docs] def start(self, vmid, mtid):
"""
Start a VM given a "VM image ID" `vmid` and a "machine type ID" `mtid`.
Return a unique `hid` ("VM handle id") that can be used to operate on
the started instance.
"""
pass
[docs] def stop(self, hid):
"""
Stop the VM identified by `hid`.
"""
pass
[docs] def get_status(self, hid):
"""
Return the status of the VM instance identified by `hid`.
The returned status is one of the following strings:
========= ============================================================
status meaning
========= ============================================================
WAITING A request to start the VM has been sent to the Cloud server, but the VM is not ready yet.
UP The machine is up and running, and connected to the network.
STOPPED The remote VM has been frozen, but normal execution can be resumed.
DOWN The VM has been stopped and cannot be restarted/resumed.
========= ============================================================
Raise `ValueError` if `hid` is not a valid "VM handle"
as returned by the `self.start`:meth: method.
"""
pass
[docs] def get_info(self, hid):
"""
Return information on the VM instance identified by `hid`.
The return value is a named tuple object, conforming to the
following specification:
============ ======== ================================================
attribute type meaning
============ ======== ================================================
public_ip str public IP address in dot quad notation
private_ip str private IP address in dot quad notation
vmid str the VM image ID used to create the image
mtid str the machine type ID used to create the image
cloud str cloud identifier
started_at datetime when the request to start the machine was issued
up_at datetime when the machine was detected up and running
running_time duration total running time (in seconds)
bill float total cost to be billed by cloud provider
============ ======== ================================================
"""
pass
if "__main__" == __name__:
import doctest
doctest.testmod(name="__init__",
optionflags=doctest.NORMALIZE_WHITESPACE)


fprime.fbuild.settings
¶
fprime.fbuild.settings:
An implementation used to pull settings into the fprime build. This version uses INI files in order to load the settings from the settings.default file that is part of the F prime deployment directory.
@author mstarch
Module Contents¶
Classes¶
Class to load settings from INI files |
-
class
fprime.fbuild.settings.
IniSettings
[source]¶ Class to load settings from INI files
-
static
find_fprime
()[source]¶ Finds F prime by recursing parent to parent until a matching directory is found.
-
static
read_safe_path
(parser, section, key, ini_file)[source]¶ Reads path(s), safely, from the config parser. Validates the path(s) exists or raises an exception. Paths are separated by ‘:’. This will also expand relative paths relative to the settings file.
- Parameters
parser – parser to read from
key – key to read from
ini_file – ini_file path for clean errors
- Returns
path, validated
-
static
load
(settings_file)[source]¶ Load settings from specified file or from specified build directory. Either a specific file or the build directory must be not None.
- Parameters
settings_file – (optional) file to load settings from (in INI format). Must be specified if build_dir is not.
build_dir – (optional) directory to search for settings.ini. Must be specified if file is not.
- Returns
a dictionary of needed settings
-
static
-
exception
fprime.fbuild.settings.
FprimeLocationUnknownException
[source]¶ Bases:
Exception
Fprime location could not be determined
-
exception
fprime.fbuild.settings.
FprimeSettingsException
[source]¶ Bases:
Exception
An exception for handling F prime settings misconfiguration
Build: 1.4.1


Contact
Living for the
fancy
folk.™
We Love Hearing From You! You Are Special to Us!
Have a questions, need to book a room?
Contact Us
to book a room, say hi and for any questions.
Click here
to go home...but not your home.


Here's some content that I'd like to show or hide when the link is clicked. Let's also put a link in here.
Here's some more content that I'd like to show or hide when the link is clicked.
Here's even more content that I'd like to show or hide when the link is clicked.


I meant to grab a bag of stuff for school this morning on my way out the door. Turns out at 5:45 in the morning, you don’t remember to grab things off the counter (thankfully, I don’t need that stuff until tomorrow). I don’t like to-do list apps (prefer pen and paper), and my phone is on silent each morning until I get to school.
 I still get calendar reminders (out of absolute necessity) but even then, I tend to close those without thinking too much about actually remembering to do something.
Texts, though, are a different story. I pay attention to them. When someone sends a text, it has my attention.
So, rather than rely on a to-do list or plain calendar reminders to do something, I’m routing those through IFTTT to send myself a text.
To do this, log into IFTTT and create a new recipe using Google Calendar as the trigger. In step 2, be sure to choose “Event from search starts” as the trigger. Otherwise, any time you add an event, you’re going to get a text message, which isn’t cool.
Then, pick a keyword – I used “reminder” – to search for. It has to be in the title or the event description to fire correctly. So, for me, my calendar event would be: “Reminder – get groceries.” Then, set the time to when you actually want to do whatever it is you need to do. Again, mine is around dinner tonight because I’ll be near the kitchen and can do it quickly.
Set the SMS channel as the action (make sure your phone number is correct!) and heypresto, you have a SMS-enabled text reminder system for those little things you tend to forget.
Again, I know that this can be done just using the calendar notifications. But, if you’re like me, and hate those, you can use this instead. Also remember this works with any phone, not just smartphones. So, if you revert (like I’ve also considered) you can have the benefits of notifications when and where you need them on any platform.
Written on April 27th, 2015 by Brian Bennett Categorized in: All Technology
Leave a comment


{% assign tb = site.data.i18n-box[include.lang] %} {% assign tg = site.data.i18n-general[include.lang] %} {% if include.box-type == "post-cta-box"%}
{{include.content | default: 'Besides chat and many integrations, you can still count with: audit trail, unlimited history, scalability and more special features'}}
{{tg.become-partner}}
{{tb.parner_text}}
{{tg.become-partner}} {% elsif include.box-type == "migrate-box" or include.box-type == "migrate-box--small"%}


--- layout: bootstrap title: Docs permalink: /docs/ group: main menu: docs order: 2 ---
Get started by checkout the docs!


[1]
VERY EASY TO USE; I HAVENT FOUND ANY
[2]
VERY GOOD FOR THE MONEY AND WORKS GREAT; I DONT SEE ANY CONS YET
[3]
fast acquisition, fast re routing, awesome features; nothing. It's worked flawlessly


A little about me. Born and raised in the UK, I moved to New York City on a whim 15 years ago and fell in love. My journey into tech started when I had my daughter & like many women, I had a choice to make: go back to work, stay at home, other??. I decided to create my online shop Color Me WHIMSY. I took classes in Entrepreneurship & designed my store myself, doing everything from customization to SEO to Social Media.
I loved the technical side of running my business & grew passionate about learning new methods & staying current and up-to-date with new trends, & I really loved passing on my knowledge, helping others with their pain points & struggles. I decided to take the leap & follow my passion. I found a great course to teach me the basics & some excellent mentors to guide my journey now here I am, living, learning, & leveling up.
I am a Resposive Designer & Developer who:
- Loves visual storytelling & functional code.
- Understands business & project management.
- Has great communication skills.
- Has an excellent eye for detail & design.
- Enjoys puzzles & am naturally curious.
I can't wait to hear what you're about. Let's chat!