My first customer facing project at Adobe went live!
Back in March'18 I switched teams and left IT behind for a new initiative within Experience Cloud called Experience League. The portion I created is found at guided.adobe.com.

Discoholic 🪩

PR's Tumblrdome
hello vonnie
$LAYYYTER
I'd rather be in outer space 🛸
2025 on Tumblr: Trends That Defined the Year

JVL
cherry valley forever
Stranger Things
Misplaced Lens Cap
Show & Tell
art blog(derogatory)
Three Goblin Art
d e v o n

ellievsbear
tumblr dot com
Peter Solarz
TVSTRANGERTHINGS
styofa doing anything
he wasn't even looking at me and he found me

seen from United States

seen from Malaysia
seen from T1
seen from United States
seen from United Kingdom
seen from United States

seen from T1
seen from United States
seen from Singapore
seen from United States
seen from T1

seen from Malaysia

seen from Austria

seen from France
seen from Canada
seen from Malaysia
seen from United States
seen from Nigeria

seen from Singapore
seen from United States
@attackio
My first customer facing project at Adobe went live!
Back in March'18 I switched teams and left IT behind for a new initiative within Experience Cloud called Experience League. The portion I created is found at guided.adobe.com.
Promise.finally() ... why do we need it?
I'm a huge fan of JavaScript, and I love how it's been evolving over the years, however some new features are questionable from my point of view.
Changing the Promise spec to add a method which is already possible by the design of Promise is borderline insane.
Promise.finally() will allow you to do try/catch/finally with async functions, which sounds awesome and if you never use higher order functions it is awesome; however it's not an problem if you don't intend to use async functions!
Let me demonstrate:
Promise.reject(new Error('omgad')).catch(e => console.warn(e.message)).then(() => console.log('finally?'));
Considering you can't pass async functions around like normal functions for all styles of coding, this is a rabbit hole that you have to commit to. Good luck with that :D
tiny-httptest simplifies API testing in node.js
I made this module after noticing bugs in my stack due to a lack of coverage afforded by every test framework I looked at. It handles the annoying things like capturing & reusing cookies, headers & etags (special case).
https://www.npmjs.com/package/tiny-httptest
Released a boilerplate API for tenso
I released a sample tenso API on github as a starting point for new API gateways that are powered by node.js & want to be OWASP compliant with minimal developer effort.
https://github.com/avoidwork/tenso-sample
Watch Dogs 2 is the open world game I was looking for
It plays like a campy Mr. Robot, doesn't really rely on guns, and has neat gadgets. It also brings my GTX 1080 to it's knees, so, more please.
Goodbye
It's hard when you have to say goodbye to beloved "pet", which is a poor word to describe the type of bond & companionship you can have. Halo, my "therapy" cat of 18+ years was put to sleep last night. I can't describe the type of loss and pain this has inflicted my family with; however, I can gladly say that those 18 years started near the lowest point, the death of my father, and continued well into the highest point, my marriage. It was one hell of a ride with much love and laughter. Goodbye my mostly silent friend, you will be greatly missed.
https://www.flickr.com/photos/deviation/albums/72057594096631844
Launching a product feels good
Today my latest work project at Adobe went live. It's a great feeling to see the hard work & effort of a team come together.
Tor with a Raspberry Pi 3
Do it, it's worth having the anonymizing access point for casual browsing.
Getting a good score from SSL Labs!
https://www.ssllabs.com/ssltest/analyze.html?d=api.ottawa.ski
This was as simple as generating a 4096 bit key, i.e. openssl dhparam -out dhparam.pem 4096 and running the following config for nginx:
ssl_dhparam /opt/ssl/dhparam.pem; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_stapling on; ssl_stapling_verify on;
Ottawa.ski API beta is live!
I'm glad to say this API has finally gone pseudo 'live', with weather data provided from the OpenData initiative of the Canadian Government & my nodejs module canada-weather.
The API gateway is very simple in design. It's running tenso 4.0 which I released earlier this week, which is based on an effort to clean up the underlying turtle.io server.
Behind the API is a cron job which executes every 30 minutes to scrape weather data, and write to specific files on disk. This allows me to have the API gateway map requests to data without adding complexity; a file watcher is registered on startup, which updates the in RAM representation after a change is detected; if the file is erased the current representation is served until the server is stopped. The data sits in a Map>Map>Object structure for quick validation/retrieval/serialization.
I plan to use a similar method for the other API collections, but with a shorter polling interval.
The tenso server is kept alive with systemd, and the stdout & stderr are routed to syslog for me.
https://api.ottawa.ski
VMMDLXIX
7569 days.
Sentiment analysis of Tool’s AEnima
Done with AFINN sentiment analysis:
stinkfist: 4, 0.02 comparative
eulogy: -15, -0.06 comparative
h: -33, -0.13 comparative
useful idiot: N/A
forty-six & 2: -18, -0.07 comparative
message to harry manback: -56, -0.32 comparative
hooker with a penis: -36, -0.15 comparative
intermission: N/A
jimmy: -14, -0.07 comparative
die eier von satan (english): -9, -0.08 comparative
pushit: -4, -0.02 comparative
cesaro summability: N/A
ænema: -83, -0.21 comparative
(-)ions: N/A
third eye: 13, 0.05 comparative
Sentiment analysis of Tool’s Undertow
Done with AFINN sentiment analysis.
intolerance: 2, 0.12 comparative
prison sex: 1, 0.00 comparative
sober: -7, -0.05 comparative
bottom: -51, -0.28 comparative
crawl away: 3, 0.03 comparative
swamp song: -15, -0.16 comparative
undertow: -3, -0.01 comparative
4 degrees: 6, 0.03 comparative
flood: 0, 0.00 comparative
disgustipated: -21, -0.05 comparative
Sentiment analysis of Tool’s Opiate
Done with AFINN sentiment analysis.
sweat: 14, 0.10 comparative
hush: -19, -0.37 comparative
part of me: 10, 0.11 comparative
cold & ugly: -18, -0.3 comparative
jerk off: -22, -0.18 comparative
opiate: 3, 0.22 comparative
the gaping lotus experience (hidden): -2, -0.02 comparative
(via https://www.youtube.com/watch?v=0dX6LL7b8Y0)
Canada Weather Scraper
I released canada-weather yesterday under the OttawaSki organization on GitHub for my Ottawa.ski project. It's a node.js app designed to run from a crontab (scheduler) to scrape data for a city, or cities, by name. In my case, I have an API gateway watching the outputs for changes & hot swapping the data in real time. The app retrieves the 'site list' for the weather sites, and loads it into a haro datastore which indexes the english names, and runs the user input against as a search. The first match is used, the others are displayed via stdout, and the data is retrieved, transformed & written to disk asynchronously.
@DrScienceCat on twitter