#literally this is like the vs code of note taking apps
Explore tagged Tumblr posts
Text
ok i've been seeing some hype about this new notes app called Obsidian and i'm not gonna lie...
...it kind of fucking rules so far
#there's SOOOOOO MANY plugins and themes#also i can set up totally different vault environments for my school vs hobby stuff? let's gooooo#literally this is like the vs code of note taking apps#i completely understand the hype#also i think i'm going to like it a lot better than something like scrivener or manuskript for writing#i've tried manuskript and it was eh. went back to just doing everything in libreoffice#this feels less like its forcing me into a specific box/process#but still way more flexible than a normal text editor
6 notes
·
View notes
Text
Father to be Luigi Headcanons
When you tell him, he short circuits. It doesn’t matter how you tell him, cutesy note, direct announcement, accidentally show him the test. He just stares at you, dead silent, blinking like you told him you saw God in your breakfast toast.“You’re… wait. Wait. You’re—holy shit.” Then he drops to his knees and just wraps his arms around your stomach like you are literally holding the sun inside you.
He cries. Not like sniffles. Full tears. Starts talking too fast. Laughs mid-cry. Wipes his nose on his hoodie sleeve.“Are you okay? Are you scared? Are we gonna be okay? You’re gonna be such a good mom. Like unfairly good. I love you so much I might combust.”
Immediately panics about everything. Googles prenatal vitamins Orders 4 types of water bottles. Buys books with titles like "Engineering the Modern Father: Emotional & Structural Load-Bearing.” You tell him he’s spiraling. He stares at you like: “I’m literally responsible for protecting the vessel of our love, babe. I’m chill. This is me chill.”(He is not chill.)
Turns into the weirdest health nut alive. Bans you from lifting grocery bags. Meal preps aggressively. Has a meltdown over mercury levels in canned tuna. “Babe, this hummus has SODIUM. You’re carrying our future. You’re a national monument.”
He adds “baby-related zones” to his mental map. Hospital. Closest 24-hr pharmacy. The route to your OB/GYN. “Safe bathrooms within 10 miles.” honestly he'd probably build you a custom Google Map. Color-coded. Shared with you. Titled: “Pregnancy Pathways: Wife Protection Plan v1.” or something dumb like that
Starts timing your commute. Like if you normally take 13 minutes to get home and it takes 16 today?You’re getting a text like:“Not trying to be crazy but are you good? You’re +3 mins over your projected arrival time.”
Becomes weirdly obsessed with nesting but in a Luigi way. He’s not just building a crib. He’s: Comparing ergonomic gliders. Creating a color-coded “vibe board” for the nursery. Installing blackout curtains while shirtless and muttering: “I’m making a cave for our little cave goblin.” Also insists on a stupid theme like “Jungle Italian Renaissance”
Talks to your belly like it’s a walkie-talkie. “Hey kid. It's me. Your dad. She’s doing great. Kicked ass at work today. Just wanted you to know you’ve got a good one growing you.”, “If you ever hurt her from the inside, we’re gonna have beef. Love you tho.” Also puts headphones on your stomach and plays the Interstellar soundtrack.
Gets extra soft during sex. Like, he still knows how to make you feel good, but now he’s obsessed with holding you, whispering into your skin: “I’m inside my wife while she’s carrying our baby. This is some spiritual shit. I’m overwhelmed.” Also cries after and tries to hide it bc ya know he has to be tough.
Man is SAT at every doctor's appointment. He doesn't care what kind of work conflict he has or anything he is making it to every single one and taking diligent notes. He will ask a million questions and asks them again after you leave. He will start a shared notes app with you of all the stuff the doctor said too just so you can refer back to it at any given moment.
Once you hit the third trimester? He’s fully insane in the best way. Has you on live location. Has the hospital on speed dial. Has your OB’s entire office schedule memorized. Is running simulations in his head for “what if the water breaks at Target” vs. “on the freeway” vs. “in your sleep”. He’s sending you texts like: “Leaving for work. Your phone’s charged, right? Remember: if labor starts, call me, not Uber. I’ll dropkick a minivan.”
he absolutely spent the third trimester over-researching birth options. He’s made charts. He’s watched vlogs. He’s asked his friends inappropriate questions. He’s printed out: Hospital birth plan, Home birth plan, and “Emergency forest birth” plan (just in case). And he has each one stuck to your fridge just in case. He has a binder labeled “BABY STRATEGY.” When you ask what he actually wants, he says: “I want what you want. But also... home birth just feels so “sacred”. I wanna catch the baby myself. What if they imprint on me.” He’s both dead serious and so unqualified. You tell him: “I’m not pushing out a baby next to our houseplants.” He nods. Understands. Still gently lights a candle “for ambiance” when you hit 38 weeks.
When your water actually breaks, he thinks he’s the one dying. You're like “hey babe I think—” and he’s IMMEDIATELY ON THE FLOOR. “It’s happening. Oh my god it’s happening. Babe? Babe. Where is the bag. WHERE IS THE BAG.” Trips over the cat. Puts your sneakers on the wrong feet. Fully tries to hand you your skincare bag instead of the hospital one.
He’s still trying to convince you to labor in the bathtub before you go. “Babe. One bath. One soothing breath. You love baths. It’s in the plan. Page 3.” You’re like “I am leaking LIFE. We are LEAVING.” He salutes. Grabs the bag. Opens the wrong door. Walks into the closet.
In the car he is every kind of maniac. One hand gripping the wheel The other hand gripping your thigh like it’s an anchor. Voice shaking as he tries to coach you through contractions using a YouTube video he half-remembered from March “Breathe in 4. Out 6. You’re doing great. You’re incredible. You’re hotter than Beyoncé. I’m so scared.” Keeps whispering “my wife is having my baby” like it’s a spell.
At the hospital, he is both deeply unhelpful and absolutely devoted. Cries when they ask if he’s the dad. Holds your hand like he’s on a sinking ship. He is absolutely terrified of getting in the way of the doctors and nurses trying to help you but he also completely glued to you at the same time. And when the nurse says “she’s fully dilated”? He just blurts out:“Wait I thought we had more time. I didn’t even get to do the affirmation mirror thing.”
In the quiet moments between contractions, he’s whispering to your stomach. “Hey kid. I know it’s wild in there. Take your time. Be safe. But also please be chill. Mommy’s doing amazing. Daddy’s losing his mind.”
And when it’s go time? He’s right there. Holding your leg. Crying. Absolutely useless but incredibly present. He sees the head and gasps like he’s watching the Northern Lights. Then yells “BABE. OUR BABY HAS A SKULL. I CAN SEE IT. THIS IS INSANE.”
When the baby comes out, he falls apart. Just drops to his knees beside the bed. One hand on your face. One on your thigh. Sobbing. “You did it. You did it. I love you. I love them. I’m gonna pass out. But like romantically.” He’s shaking when he holds the baby. Can’t stop staring. Mumbles: “Hi. I’m your dad. I’ve been waiting my whole life to meet you.”
138 notes
·
View notes
Text
Glasses Review - Firmoo
Hello vision impaired friends, I bring you the gospel of Ordering Your Damn Glasses Online
I have previously ordered from EyeBuyDirect (luxotica/lenscrafters'/America's Best in disguise, sorry.) and Zenni Optical ( most well known online provider, A+ would recommend) and have seen lots of ads for free pairs from a competitor, Firmoo. I have too much prescription for the free pair offers to ever work out from ANY provider, but their fun designs put them on my list.
When my current glasses broke, I was dinking around and saw their current promotion is Buy One Get One Free PLUS 20% off lenses and as lenses are the real $$$ I jumped on that like tigger on crack. I am VERY nearsighted with astigmatism and the average pair of glasses from lenscrafters used to cost me $300 minimum.
After much deliberation with a million tabs open and a poll I ignored the results of for Reasons, I ordered a pair of clear frames and a pair of purple steampunk-y wireframes . Two pairs of HIGH PRESCRIPTION glasses for $87 shipped. I could cry, y'all.
Note: I have an up to date prescription and a nifty app that measures Pupillary Distance or 'PD'. you will need both these things accurate to have the best experience buying your glasses online.
I ordered them 9/22, they shipped 9/25, I received them 9/29 with regular shipping. They came well packed - each pair was in a bag made of cleaning cloth material inside a sturdy plastic case and they come in a foil bubble mailer.
Both pairs feel well made, with lots of attention to detail-
however I did not pay attention to detail or pay extra money for the Re-he-heaaallly thin lenses. So the clear ones are slightly too big and I hate the way the nose pieces sit, while the purple ones are a wee bit small across the temple and heavy to boot. I haven't had dents in my nose like this since I was 12.
the website lists their exchange policy as 30 days, the pamphlet that came with the glasses says 60. Either way it was pretty painless to go into my order history and select "exchange". The form I filled out with my reasons for dissatisfaction promised me I would be contacted within 24 hours.
My 'personal Firmoo consultant', 'Karen', emailed me with a code for the full price before discount of both pairs + standard shipping, as well as the usual customer service canned answers about checking the sizing information and did I know I could upgrade the lenses?
Also I could keep the failed pairs 'FOR NOW', here are some places that accept glasses as donations. (mixed messages, Karen, but sweet!)
New friends are April006, round anodized wireframes with a cute dingly gem thing, and Sandy020 , literal tortoiseshell cat eye frames.
This time I used the site's search terms to cut the temple width and earpiece length options down and double checked the weight of the base frames. (14g vs 24g for the round wireframes before my coke-bottle lenses. RIP my nose. )
New order was placed 10/5 and they arrived 10/17 . (last time I checked the tracking estimated arrival had creeped from the 19th up to the 23rd so grain of salt. This may be a tactic to make the order feel like it got here faster or legit delays. In my case there was a federal holiday involved.)
Complete disclosure I'm gonna grab a pair of pliers and take the little dangly off the wireframes. It makes a noise when I move my head and if I don't fold the frames in the right order when I take them off it'll scratch up the lenses. I ain't gonna remember to avoid that, so off it goes.
The Good:
Large selection, Good Quality, Good Communication. Lots of Off the Beaten Path options for internet weirdos. Firmoo p much always has a promotion going.
My wallet is so happy. SO HAPPY. Frames run $20-30ish to start. lenses will vary with your prescription and options.
If y'all want 50% off your first frames and to give me a $10 credit they have a referral program and my code is T4Z8I2. BOGO20 is a better value but it expires 11/01/23.
The Bad:
Not flexible about lens options- you go down one track and pick your options within that. If there was a way to put tinting on a pair of glasses other than blue light blocking I couldn't find it. (in contrast I believe Zenni lets you choose a range of colors and tint depth on any pair, designed as sunnies or not)
You Will Get Emails. Firmoo REALLY wants you to buy more glasses and post about it and tell your friends and HERE THIS CODE IS ONLY GOOD FOR 3 DAYS, GO BUY NEW GLASSES. They are marketing themselves to fashionable young influencers who change styles every month. Unsubscribe with impunity.
like Zenni, this is a company with the majority of it's functionality based overseas. It's cheaper because you're ordering directly from a factory and not paying Luxotica's markups to itself. Customer service is mostly English as Second Language speakers and there may be delays.
Not For Emergencies. I was able to coast on a pair of glasses from a prescription or 2 ago but it's gonna take time for your order to be made and shipped.
Overall I'm very happy with them and will probably order again.
Next time I have spare money I'm aiming at Wherelight because y'all. they are next down on the list of reputable to shady AF but they have the most amazing WTF designs.
156 notes
·
View notes
Note
Here’s an interesting thought experiment. I was reading your post about the Commando app Beta 2.1 vs 3.1 debate and whether there was an Alpha app or a Beta 1.1. What if there was an Alpha app and Douglas tried it with Adam, the original bionic but it didn’t work right and caused some brain damage which is why Adam is like that? Douglas then realized that if he was going to put the Commando app in a bionic’s head that he needed to completely rewire their brain to be able to handle actually having information downloaded like a computer. By the time he realized this Bree was too far along so he turned his attention to the next subject. He made Chase more computer like and did a bunch of stuff that would allow Chase to handle actual changes to his brain from outside influences. It’s why Chase has the Commando and override app. The other two can’t have actual apps in their heads like that because they weren’t created to handle things like that.
Yayyy another person to talk about Spike/the Commando App with!!
And this is such an interesting thought that I love!! These are all great connecting ideas too, the idea that Chase has these apps because he has a computer in his mind to process and handle it all unlike his siblings and not just because his main ability is super intelligence. After all, he does have more room for upgrades than his siblings. I love this idea!
I do wonder though if after Douglas were to hypothetically do this he went and gave Adam and Bree some from of compatibility to their chips since Chase can connect to them essentially through bluetooth. But him having the computer not only for his intelligence but also for his apps and to process the use and control of these apps alongside his normal brain is really something to think about. Not only that, but he does have a bunch of wiring inside his head and a bunch of different scanners from his bionic eyes that are also linked to his computer system too (identifying people, fingerprint scanning, etc.)
And with the Commando App, we see that in both versions, especially the first one we see in 1x03, that there is a bunch of coding that appears during the activation and deactivation of the app. This almost seems to imply too that the app truly is still not 100% complete, which matches with the Beta version we see.
We also see that the Commando App has an entire targeting system connected to Spike's vision. In the first version this comes in the form of Spike scanning the threat's face before completely locking onto the target as an "imminent threat."
In the second version, this just comes in the form of a literal target being in Spike's vision. He also has a gauge that measures his aggression level, which obviously varies for him. Not only that, but on the right side of Spike's vision he has gauges to measure speed and visibility presumably of his target, which is kind of scary lol.
A mystery however is why does the chip interrupter not only not work on the Commando App, but instead makes Spike more aggressive? It most likely has something to do with affecting the computer system in Chase. Maybe it doesn't work because Spike is an app and is potentially more linked to the computer in Chase than his chip? Is it just a glitch in general? Is Spike's aggression increase also a glitch or is it a defense mechanism against an outside influence? Who knows!
One last thing to note is the fact that after Spike takes a hard hit from Perry, it actually causes an error in Chase's computer system and glitches the Commando App out and forces it to disengage. Maybe this is something that would "naturally" happen or this is another example of the incomplete app being unstable (because one would imagine that this caliber of app and its purpose of fighting shouldn't be able to glitch out and shut down after a hard hit)
Another intriguing thought is that a few of Chase's abilities are apps but are considered "abilities" like the Commado App or his Magnetism App, if that makes sense. Some of his "abilities" are directly related to his computer system as apps compared to his normal "abilities" like his laser bo or forcefield. I just thought that that was interesting to point out because I never really realized that until now!
There's a lot to think about with this, and since we were never meant to dive this deep into because it's a Disney XD show, there's a lot to play around with!
#I might circle back to this because I feel like I had more to say but I forgot because I'm tired lol so I also apologize for any errors#but I am so so sorry for answering this late!! :[ School and work have kept me suuuuuper busy lately and I like thinking through my answers#beforehand and it took me a while to type this out#but I love love love talking about stuff like this especially with Spike/the Commando App in general so thank you for asking about this!!#and I assure you that I will get to your other ask when I have more downtime hopefully sometime later this week :]#disney lab rats#lab rats#chase davenport#spike davenport#lab rats spike#ask
36 notes
·
View notes
Note
Your OC Tian looks like he could he my OCs brother and I'm so obsessed with him. The beauty marks and the oblivious glazed over look really fucking do it for me
can u share more about him :0c
Omg thank you so much!!!!! I designed Tian to be so extremely husband-coded To Me so I'm happy some of the boxes he checks 4 me ✅ are checked 4 u also ✅🙏🏼
Tian (and Zhu) is the protagonist of two of my projects, the original and its overgrown AU. The OG is........ A xianxia romcom bildungsroman like....... Swan-maiden myth meets FFIX meets Disney Hercules.......... And the AU is what I usually draw/upload, which is a neo noir like...... FFVIII meets........ Drive (2011)....... Meets........... Disco Elysium which is a connection I'm only making right here, right now, as I type?????? Anyway OG-style Baby T is "tiger", "spring", vs Big T who is "dragon", "winter". Both are True Neutral tho I think Baby T leans Chaotic...
Some quick blips: Cap sun, Aries moon, Taurus rising, bday is 31 Dec; 6'2 188cm, ~190lbs 86kg, benches above his bodyweight; vegetarian, doesn't drink, healthiest guy you know (chainsmoking is healthy); blue MCR-coded tobacco depression wifeguy to Zhu’s red LDR-coded cocaine mania guywife
Charm points: natural curls, beauty marks, underbite
Talents: carpentry, wushu, gymnastics, fixing whatever
Likes: Zhu, tofu, his motorcycle
Dislikes: texting, cardio, doing laundry
Songs: MCR – Drowning Lessons + Fashion Statement + Desert Song (it's bad!!!!!!), The National – Walk Off, Hyukoh – 似是故人來 Like An Old Friend Arrives
Motifs: chrysanthemums, smoke, temples, the moon
Not really a talker, he's all abt acts of service and can be hard to understand if you're looking specifically for words. I like to think of him as the lead in a Western film except the horse is a black motorbike – silhouetted against the horizon, never says more than he has to, does what needs doing. His catchphrase is basically "🆗", "Sure." Also he doesn't use guns but anything else goes 🔨
Some flavor:





More under the cut if this hateful app will let me add one 🤪
I think he's best understood thru the way other ppl talk abt him – so here are a couple names/epithets!
His maternal grandmother is a distinguished mobster known as The Old Empress, which is why most ppl call Tian "Crown Prince", "the Prince", etc. Their family is more/less popularly-elected local deities (see "city god" on Wikipedia) and he's the last of the bloodline But has been refusing to officially inherit for over a decade, though he performs all the duties anyway. Old, old agreements put them above virtually all modern law, generally thru loopholes that allow them to, for example, literally start a gang war at 23 bc you got a little too annoyed Or take an eye for an eye/publicly execute someone as ritual vengeance. Pls note that Zhu is a criminal defense attorney. Smile
They also sometimes call him "Bodhisattva" bc he, due to Circumstances, grew up in a Buddhist monastery from age 8, along with Jin, his baby brother. He became an ordained monk at 20 but disrobed at 22 so he could help Jin thru university. During that time, he worked three primary jobs: seasonal construction worker/contractor, auto mechanic, and plumber. "why not model" No Vanities Lifestyle. He Is Just Some Guy. He Wishes He Were Still Bald. Fuck Fast Fashion Btw.
With his name specifically, Tian Tian, family name 田 “field” + given name 天 “heaven/day/sky” is his entire character – simple, no frills, unassuming on paper, but also strong, steady, salt of the earth. It's a name that once you see him both does and doesn't do him justice, like surely there's something fancier and yet between those two characters you already have the world. The name is also 9 strokes altogether! Fav number and an auspicious one – 9 heavens + if you've ever seen an imperial dragon robe, it's 9 dragons with scales in multiples of 9, eg 81.
A few bonus reasons I chose 天:
I associate him with swans (symbol of beauty but also violent, aggressive birds), 大天鹅 Big Heaven Goose
Single-character names are so elegant/Tough to me
Canonically seen as a "Fifth Great Beauty", literally a man named Heaven, the H is for Husband TO ME
FACT I decided on the monk thing after I named him and I think it's funny. His Dharma name is 釋恒心 Shi Hengxin btw which means "monk", literally, and "resolution"
Final bonus, literally my man:

#Thank u anon!!!!!!! I hope even 1% of this word wall is!!!!!!! Interesting!!!!!!!!!#I wrote this out between two Shinkansen rides and couldn't make it any shorter but I Did succeed in making it longer. My power...#Congrats on a no-doubt beautiful OC btw 🙏🏼#Tian#Bab Talk#This wretched app is so annoying to use on mobile btw give me a break#Pls feel free to ask abt my characters btw I luv talking abt them#babble
6 notes
·
View notes
Text
START UP- DREAMS: DISILLUSIONS vs DESTINY
It's starting to get exhausting dealing with the discourse in Start-up, especially when revolving around the love triangle that refused to be ceased. Heads up, whilst I'm on here analysing mostly about the relationship with Dosan and Dalmi. I didn't have a side for a long time, I also liked Jipyeong because he was based on Cyrano, he was the guy who wrote to her soul or whatever, but the thing is, as much as I've tried to follow where the show leads me, what clues the show leaves, which Fate is supporting (Fate represents the writer's opinion as well) and why a couple deserves to be together, whilst I've tried to be unbiased, I can't help but now shift the other way to Dosan 100%. I will be infuriated and disappointed if Dalmi ends up Han Ji Pyeong, there I said it, irrationally, possessively, and harshly. And I know this won't get a lot of notes and support but who cares. This is my voice and my opinion. I have come to dislike Jipyeong a lot, fear not this is not a Jipyeong hate post, I don't have it in me to make lists of reasons for why I dislike him, but this is about episode 11-12, our characters breakdowns from their dreams and destiny.
All of our main characters in start-up have a dream that yes again, Fate is trying to lead them to, but sometimes their goals don't align with what Fate has for them. The characters experiences; have shaped them to see the future in one way, to want things in another, and to also feel stopped cruelly by Fate and Luck each time it's near them, however, like with Destiny and Purpose, these characters are guided by Fate with good intentions, all the plans for Fate for them are to get to them to their most significant potential and success, even if it seems like it's not for them. Everyone is guided and pushed by Fate, almost forced even, if you try to do something that isn't for you Fate harshly stops you, if you try to run away from something that is for your benefit Fate forces you to go there.
So our 4 main characters have a destined path for them designed by Fate, its to ensure their skills, growth and talents are utilised in every way possible. This episode it seemed like everything was crashing down for our babies but really, although everyone feels defeated this storm was a push in the right direction. Here's why;
DOSAN’S DREAM: TO BE LOVED
Dosan, my Dosan, no words to explain the hurt he went through this episode. The way his dreams came crashing right in front of him, the way that the only way for him to move forward was to be on pause for a while and fulfil what the world wanted for him, to be a genius. I've written so many posts about Dosan being the person who's the most needed, used and wanted in the world of Start-Up. He's the key man remember, he's the person who everyone falls apart without him there. This episode Dosan was forced to go to the next part of his destiny, somewhere where he'd be utilised more and needed. Dosan was born to code, he was born to be a genius, not even metaphorically, or jokingly, the boy was given coding as his strength, it's automatic to him, authentic to him and is the thing that he's the most accurate at.
Except for so long because of this Dosan resented himself, he found it useless when he couldn't make friendships or connect with people correctly, he found it useless when it came to being loved for who he was, he found it useless when it came to him trying to find meaning for why he was such a loser. For him, coding was his comfort, his tool to help wherever he can (because that's just him helpful) and the only thing he could rely on. But because of this Dosan never saw how vital his coding was, he's humble, modest and just using it to help wherever he can, he didn't notice all that coding has done for other people.
First, it provided his friends job they were happy in; Their potential was seen (CODA and 2STO.
It led to an accurate handwriting forgery test to detect forgery other businesses.
It led to success with Noongil for both Dalmi's grandma and so many other people,
It led to him also accurately helping Dalmi code for her drug recognition app, which is also crucial for everyone to use.
Dosan is incredible, and the fact that he didn't understand why Alex would spend billions and billions to just get him is so sad, but it's good because it means he's not going to go bad. I just love him (that's me being biased). Everyone can see (apart from Jipyeong who I'll explain later), how great he is, how important he is but Dosan only wants his dreams, to be loved.
It's like he views his coding/geniusness like a curse? It makes him awkward and struggles with everything else, and it makes him feel worthless. All he's ever wanted was to be loved for who he really is (even though being a genius is also who he is);
He wanted his dad to love him without the idea of being a genius,
He wanted his friends to be by his side just for him,
He wanted Dalmi to love him only as his awkward, weird and stupid Dosan self.
His dreams from the start felt blocked because everyone tried to push him to see being a genius as his dream. His father interrupted his speech to Park Changho about what he wanted to say the obvious; winning awards etc. Dosan saw it as a burden, guilt, and just a barrier to actually loving himself for who he is.
DOSAN’S DESTINY; TO BE A GENIUS AND THE NAM DO SAN OF DALMI’S LETTERS
Thing is yes I get it, I get why he just thinks being loved and being happy is enough for him. But I agree with Fate as we've seen Dosan is so needed by the world for all that he can do, he's automatically the most selfless and inventive person around him, he takes dreams, ideas, and illusions and makes them real. Heck, he's a real-life manifestation of dreams (Dalmi's own dream guy). He's so incredible the way he just is, the symbol for everyone's hopes and dreams to come through; this isn't me being biased!
In episode 12 alone we see it;
He brings hope as a symbol for Youngsan's dreams; to not be seen as a failure.
He brings the solution for Dalmi's ideas to come through because he fixes and solves the coding issue for her on the plane.
He brings proof for Chulsan who always wanted to be seen and noticed for his skills and be recognised by going to 2STO.
He also brought ease for Dalmi's grandmum to still live comfortable although she may not be able to see. Still, he also made her dreams for granddaughter come through because he is a real-life manifestation of the guy she wanted for her.
He also made wishes come through for Jipyeong despite him not seeing it: he's the real-life representation which helps repay Jipyeong's debt to the grandma.
Dosan is so needed by everyone and also the world, so he couldn't stay stuck in the sandbox with Dalmi, he had to be forced to move on for now. So his dreams (to be loved) and her dreams (her dream guy) can come true.
DOSAN’S STORM: BEING FORCED TO GIVE IN AND SEPERATE FROM DALMI
Fate forces Dosan to become great and self-confident and see he's worthy.
That's where Alex comes through because Alex for everyone is actually the representation of Fate/Purpose, he's here to be the storm that forces them to grow. Like Dalmi said it's Fall; she's falling before she blossoms. Alex is the falling step, he's the hurt, the betrayals, the challenges before the beauty/truth is seen and appreciated. He's the fire/heat used to make the diamonds. And he did it, he pushed everyone by force to their next destinations. And he chose Dosan because he saw what we've seen, he knows how desperately the world needed Dosan's skills, how much his headquarters needed Dosan. He saw it all, and harshly had to cause reality to come so everyone grows up and pushes forward to where they need to go.
Symbols for Dosan's conflict with his dreams, vs destiny
Follow your dreams baseball: Dosan says he doesn't want the results and the awards Fate intends to bestow on him its led him to feel lonely with no one by his side. Fate doesn't stop his dreams as he thinks but also makes him viable for them without him knowing. Yes Dalmi broke his heart, but actually, it confirmed to us pretty much he's the one she wants, she selflessly chose to let him go because of how much she loves him, and he'll keep being in her heart until he returns. It also made her realise he is the guy of her dreams (despite the fact she said he wasn't) she was lying; everything she said was the opposite, he was the guy from her dreams, but at that moment life was making her think it was an illusion.
But in a show that is so supportive of dreams it literally is named after a place to prevent dreams from being ruined, Dalmi and Dosan will get back their dreams; its already in motion.
DALMI'S DREAMS: TO CONTINUE HER FATHER'S LEGACY AND BE SUCCESSFUL WITH HER CHOICES; TO PROVE EVERYONE WRONG/ TO BE CHOSEN
Dalmi is someone who I absolutely love, she's determined, resilient and she's actually so bright. The thing with her so far is that we see her potential, her ideas are genius, and she also represents dreams becoming a reality that is useful and helpful for people;
She's the one who poked Dosan in the right direction for the handwriting forgery test,
she's the one who brought up the idea of the self relying car
The person who brought up the idea for the drug recognition device.
She's great. But also she has her own dreams, Dalmi's dream whilst Dosan's is to be loved, is to be chosen/wanted. From a young age, she felt slighted that her sister and her mother did not pick her and her dad, and the fact the world seemed to make fun of her choices made by her heart. She had dreams to prove to everyone that she made the right choice, that she was on the right path, but also she wanted to continue her father's legacy and dreams. She wanted to be successful with her choices.
Her choices so far are: Her father, Dosan and being CEO of samsan tech. Each time she's been mocked, rejected by the world and hurt for her choices;
She's mocked by her sister for staying with her dad when he was going to die, and leave her alone, and force her to be behind.
She was rejected by the world as CEO of Samsan Tech when Alex didn't view her as useful or important,
and she was hurt because she chose Dosan as her love interest, she was hurt because she had to let him go cruelly to be who he was supposed to be, she was meant to be left alone by him if he was to grow and become prosperous.
In each of these, something great came out of it; her father inspired sandbox to be created, Samsan Tech was chosen by 2STO and won demo day, and Dosan was her dream guy manifested.
But she was the leftover, the discarded and the failure in each one. It's sad to see how much her dreams felt like disillusions, she was not the person winning from those dreams but the person those dreams did not belong to. Dalmi struggled this episode to see her self as worthy or needed. And that hurt.
DALMI'S DESTINY: TO BE THE GIRL ON THE SWINGS; AN INSPIRATION, A LEADER AND EXCELLENT SOURCE OF HELP TO PEOPLE
Thing is Dalmi is needed. Her destiny is to be the very face of the Sandbox company. She's the original source of the inspiration of this company used to make sure everyone's dream doesn't get hurt or ruined. She's meant to represent, innovation, comfort and success. She's meant to be great, and Fate wants her to be great. She's a leader, a spark of ideas, and a catalyst to winning. She is important. And she's destined to become a great source of help to people.
Notice the things she thinks of; its all to do with ease and helping people (like Dosan), whilst Dosan is application and manifestation, she's the innovation and inspiration to everything;
She is the person who makes him find a way to sort out the handwriting test,
She's the person who makes him realise how to sort out Noongil with VR and the voice activation,
She's the person who comes up with the self relying car,
She's the person who comes up with the drug recognition system.
See she's already the source of creation for helping the world and making life easier for people and companies. We see what she's good at in episode 1 with her father (she comes up with ideas for him, and she stays by his side as a helping hand). In episode 2 before she quits, she was able to get her company the money needed for buying the products she knew what fangirls wanted, and she catalysed sales. She's a catalyst. So why is she being deserted by Fate?
DALMI'S STORM: BEING REJECTED AS A CEO AND FORCED TO GIVE UP ON DOSAN
Fate forces Dalmi to become self-reliant and determined, she's been given the tools, experience, the location, dream, and the people by her side she just needs to see it.
Also, she was forced to reset, she was forced to go back and learn from her scars, remember she felt discarded by so many people, it wounded her pride and slowed her down, she was petty to her sister, and that always stopped her growth, Fate came in to force her to heal from that, to grow from that and work with her sister. Because they're both meant to fulfil her father's dream. Fate gave her the right people to use, and learn from (Dosan, Injae, Jipyeong, Sandbox owner, her father) to become who she's also meant to be. So it felt like Fall, but actually, it was for her to bloom into who she was meant to be.
If you noticed in episode 13 trailer: she has her own start up named after her father (fulfilling his legacy) she has the prototype for the car named after Dosan’s teachings (Tarzan) and she also works with Injae as well. She’s on her way to fulfilling her destiny, and Dosan needed to go for her to do so.
Symbols
Self relying car: Because those dreams aren't hers, see she's the catalyst in all of I've mentioned before, those scenarios where she's left, she's always helping others, but like her self reliant car, she needs to become self-reliant. Dosan is excellent to her he's her help, her inspiration, her guide, but she needs to grow and rely on her self, she needs to find out what her strengths are and not just rely on fantasies. Instead of dreaming it up, she needs to manifest it her self. She's now been given an opportunity without Dosan and JP input to find her own voice, where she's actually in charge and confident of what she knows.
Dosan's baseball: it was telling her to follow her dreams, not his, not JP, but hers. To do so, she needed to reset, return back to deal with her feelings, and pride and reunite with her scars and learn about her self. Dosan being there wouldn't help her at that moment. But also she returned the ball back to him: because he also needs to follow his path although he doesn't see it as his dreams; in doing what he was forced to, he'd return back to her and actually keep his promise/dream for her in episode 7 (to be wealthy and successful).
In a way, disappearing is fulfilling both their dreams/ideas Dalmis dream guy comes back to her the way she asked him to in episode 10 (the suit), and He becomes a dream version of himself for her. She still is his dream, and he still is hers.
It's funny how life works, it makes you face reality, but love brings fulfilment of dreams in a way you never expected it to, it's still going to get there, but you just have to climb up the mountain first before you see the view, a few obstacles to help you get to the top.
JIPYEONG'S DREAM: TO HAVE SUCCESS AND TO BE WEALTHY; TO BE WANTED
Jipyeong is an interesting case, he starts off alone, all he dreams of when he's young is to be successful and wealthy. But I also think his dreams are similar to Dalmi's; to be chosen/wanted. He's been without anyone for so long, deserted by Fate to be alone; he's an orphan. He doesn't trust anyone because he's never known how to, everything felt difficult, and he had to fight his way out on his own. For him, clinging to logic and controlling the real world is how he survives and is successful. In fact, controlling/investing in numbers is how he got his first success, that brought him here. He's always wanted to be wanted and chosen. But he also sees success as being above others as well, because he's been looked down on so long when he was younger, he wanted a chance to be seen as important.
In this episode everything comes crashing down for him
He realises he's not essential; He didn't even know details about someone he claimed he cared about the grandmum and her blindness. He noticed Dosan already helped her with that not him.
He realises he's not wanted; Dalmi already wanted and was in a relationship with Dosan who he looked down on; who just proved to everyone he's wanted and actually destined for greatness and success.
He realises he's not chosen; he stopped being seen as Samsan's Techs mentor by Yong San and everyone due to how much he belittles them and put them down. Because of this, they refused to listen to him when he tried to warn them and then he didn't try to help. He wasn't chosen by Dalmi although she thanked him for his words of advice. He wasn't chosen either by grandma because she already rejected him as Dalmi's love interest in episode 9.
So basically everything was falling apart for him, and he also realised he wasn't a good person. Although fangirls will keep on saying the opposite, he's not a good person, he's selfish and always so focused on the surface that he doesn't look deeper or take a chance on things. It makes him an awful mentor; all he does is break people down instead of offering advice on how to move forward—a pessimistic presence.
JIPYEONG'S DESTINY: FOUND FAMILY, TO BE WANTED DIFFERENTLY AND TO FEEL PEACE AND TRUST WITH PEOPLE. TO BE AN OLDER BROTHER TO ALL THESE CHARACTERS.
But the thing is like Jipyeong's strength has always been to do with Dalmi's grandmum. In fact, I wanted to say with Dalmi as well but not really cause he keeps crossing that line. His destiny has led him to finding someone who will choose and want him. Fate led him to Dalmi's grandmum in episode 1, it's why he was first shown, he also is being pushed by destiny to find the family he never had. It's about found family. Dalmi isn't meant to be his soulmate, she's meant to be family, just like the grandmum is like a mother figure to him. Jipyeong is meant to be loved, chosen and wanted as an older brother figure. I keep saying this, but you'll notice that's what the show has been showing, his advice only works when he's a mentor/ guidance to the group, it's like an older brother, he's meant to show them reality and berate them, but he's not meant to be the hero or the prince charming to Dalmi's rescue.
His advice works especially for Dalmi, who needs guidance on reality. But it's for a family relationship; he's been like an older brother to Dalmi for a long time, despite the fact that he was her fantasy Dosan on paper (Dosan is the manifestation of that), but as an older brother, he's protective, caring and looks out for her in the right way, he guides her and becomes another male figure in her life that is comfort and advice after her father died.
Jipyeong is meant to be a family member, that's why in the promo you see him finally getting his found family dream come true. He also said this was his dream/wish for his birthday he wanted a family to play go stop with; with Dalmi in his life, he's gotten a grandma, a mother figure (probably Dalmi's mum) and a sister (Dalmi). The fact that people don't see why this is what he was meant to be aiming for is funny to me.
It's not just to Dalmi he's meant to be destined for. Its Dosan, Dosan and him are destined to form a brother bond its why Fate pushed him to Dosan from the beginning, he was meant to guide and teach Dosan how to fulfil his destiny, but he let jealousy and pettiness prevent him from being a good mentor to Dosan, he looked down on him and refused Fates call to invest and trust in Dosan. It was a mistake, and he knew it this episode. Also, he had a found family with Samsan tech, he had three people who would have been friends to him if he didn't berate them and put them down in a disrespectful manner, even Yong San is there to teach Jipyeong to humble himself. But also its Dosan and his crew who help him achieve what he wanted the most to repay his debt to grandma; they make noongil, they use his AI to make noongil, for grandma. He was just too prideful to see it.
So Jipyeong is destined to become a good boy just like Grandma says he is like he's meant to grow to trust, and love and be chosen as a family member/ mentor. Its what he's been starved of for so long and where he's the most useful and needed.
JIPYEONG'S STORM: BEING SECOND LEAD AND FORCED TO SEE THAT HE'S WRONG ALL THE TIME AND SELFISH
Hence why his storm was exactly showing him all the ways, he failed though people didn't notice; it showed he was a horrible mentor because he didn't gain the trust and respect from his group, it showed he was an awful love interest because he was too focused on money and success to realise the girl he loved's grandma was going blind. He was against the source that was helping her, it showed he was always late, he was forced to be a second lead because Dosan has always been by her side helping and thinking of her first and foremost. Did he learn from his lesson?
Fate forces Jipyeong to become humble, selfless, and reflective. He still isn't even close to doing so, but also to understand the value of money and greed to not look on the surface
From the trailer it seems like he still doesn't get it, he's still trying to cross that line, maybe I'm a fool, but even after three years I'm sure Dalmi brother zoned him, we'll see, but I think he's still prideful and didn't get what Fate was doing when it gave him three years to spend time with his found family. He still has a long way to go, but I'm sure he'll grow, and I'm his final fulfilment for his destiny in being a good boy would be choosing selflessly to bring Dalmi to Dosan. Because I still think that's how Fate has been using him this whole time.
So these are the ways Fate pushed our characters to achieve their growth and become who they’re meant to be. In Jae also has her own story to tell but this was already too long and not connected to the love triangle. I’ll make her own post a review later on. But yeh I love this show, a lot of people like to call it useless, or failure to show its message, but this has always been an inpirational message about fulfilling your dreams and becoming the person you’re meant to be, how love helps that, but also how reality needs to happen for that as well. Life isn’t a bed of roses but we can always manifest and get our goals if we put enough effort and hard work into it. These characters all do that, and they all help each other grow. The love triangle may seem useless but it’s a learning point for all our character’s its a way for them to learn and change, and so I’m grateful for it. Just hopeful the writer doesn’t change her direction just because fangirls are threatning for her to make someone endgame who doesn’t deserve it. Okay that’s it. that’s the analysis for this week. Bye <3
#start up#tvn start up#start up kdrama#startup#kdrama net#kdrama#nam do san#seo dal mi#han ji pyeong#nam joo hyuk#bae suzy#november#cwg#fvete
200 notes
·
View notes
Text
Beginner Dart Language Tutorial for JavaScript Developers
Hello, and welcome to this series! 👋 I’m Daniel, a software engineer at RisingStack, and I’ll be your guiding hand to get to learn Dart and Flutter.
This series is aimed at those who know React-Native, JavaScript, or web development and are trying to get into cross-platform mobile development because I’ll be comparing Dart language examples to JavaScript ones, and Flutter with React and React-Native.
However, if you don’t know any of these technologies yet, don’t let that throw you off from this series - I’ll explain core concepts thoughtfully. Let’s get started!
Let's learn the Dart language as JS developers: We dive into OOP, classes, inheritance, and mixins, asynchrony, callbacks, async/await and streams.
Why would you want to learn Flutter and Dart?
Flutter and Dart are made by Google. While Dart is a programming language, Flutter is a UI toolkit that can compile to native Android and iOS code, has experimental web and desktop app support, and it’s the native framework for building apps for Google’s Fuchsia OS.
This means that you don’t need to worry about the platform, and you can focus on the product itself. The compiled app is always native code as Dart compiles to ARM, hence providing you the best cross-platform performance you can get right now with over 60 fps. Flutter also helps the fast development cycle with stateful hot reload, which we’ll make use of mostly in the last episode of this series.
By the end of this series, you’ll have a basic understanding of Dart, the basic data structures, object-oriented programming, and asynchrony with futures and streams.
In Flutter, you’ll take a look at widgets, theming, navigation, networking, routing, using third-party packages, native APIs, and a lot more. Then, in the last episode of this series, we’ll put it all together and build a full-blown minigame together! Seems exciting? Then keep reading!
This episode of the series focuses on the Dart part of this ecosystem. We’ll look into Flutter in the next episode, and then we’ll put it all together into a fun minigame in the last episode. I’m excited to see what you’ll all build with Flutter, so let’s jump right in!
Sidenote: throughout this series, I'll use the “👉” emoji to compare JS and Dart language examples. Typically, the left side will be the JS, and the right side will be the Dart equivalent, e.g. console.log("hi!"); 👉 print("hello!");
Dart vs JavaScript - the pros and cons
JavaScript and Dart cannot be directly compared as they both have different use cases and target audiences. However, they both have their own advantages and disadvantages, and after a few projects with both technologies, you’ll get to see where they perform well.
There are some things, however, that you’ll notice as you are getting into the Flutter ecosystem: Dart has a steeper learning curve with all those types, abstract concepts and OOP - but don’t let that throw you off your track.
JavaScript has a bigger community, and hence more questions on StackOverflow, more packages, resources, learning materials, and meetups.
But once you get the hang of Dart, you’ll notice that Dart and Flutter has much-much better developer tooling, it’s faster, and compared to pub.dev, (Dart’s package repository) npm has more packages with worse quality.
Variables and types in the Dart language
After the first glance at a Dart code snippet, you may notice a concept that you may be unfamiliar with if you only know JS. Dart is type safe.
It means that when you want to define a variable, you’ll either have to provide an initial value and let the compiler figure out what type matches it (implicit typing), or (and this is the optimal case) you’ll have to provide the type of the variable explicitly.
In programming, types define what kind of data you are trying to store in your variable - for example, with an int type, you’ll be able to store an integer number (e.g. 7). In Dart, the most commonly used primitive types are int, double, string and boolean. Here are some language examples:
// Heads up! This is some nasty Dart code! var num = 0; // Dart will implicitly give this variable an int type. var, let 👉var int myInt = 3; // this is an explicitly typed variable final double pi = 3.14; // const 👉final, static and const, more info below myInt = 3.2; // will throw an error as 3.2 is not an integer pi = 3.2; // will throw an error as pi is marked with final String name = "Mark";
There’s also a “fallback-type” or a non-typed type: dynamic. In Dart, the dynamic type can be used whenever the exact type of a parameter, argument, list item, or anything else cannot be determined while writing your code. Please always be extra careful when working with dynamically typed variables and add extra safety barriers to your code so that your app doesn’t crash when an unexpected type gets passed. Try to avoid using dynamic as much as possible.
Oh, and a quick tip: to play around with Dart, you can use DartPad. It’s an online Dart compiler, or a “playground” made by the Dart team.
A few words about final, static and const
In Dart, we can create constants with three keywords: final, static, and const. final can be only created once in the runtime, while const is created at compile-time. You can think of const as an even stricter final. (When in doubt, you can use final and you’ll be just fine. To read more about the keywords final, static, and const, check out this article on the official Dart blog.
To get to know more about variables and the built-in types in Dart, please refer to this short explanation.
Writing your first Dart language function
Type-safety will come up in a lot of places - for example, when writing functions, you’ll have to define the return type and the type of the arguments.
// return type, function name, parameters with their types and names double addDoubles(double a, double b) { return a + b; } addDoubles(3.2, 1.4); // => will return 4.6
And when your function doesn’t return anything, you can throw in the keyword void - just like the entry point of every Dart program, void main() does.
void main() { print(addNumbers(2, 3)); // console.log() 👉print() // this function does not return anything! }
What’s an entry point anyways? In JavaScript, the code starts executing from the first line and goes linearly line-by-line until it reaches the end of the file. In Dart, you have to have a main() function that will serve as the body of your program. The compiler will start the execution with the main function, that’s where it enters your code - hence the name entry point.
Control flow statements - if, for, while, etc.
They look and work just like in JavaScript. Here are some examples:
int age = 20; if(age >= 18) { print("here’s some beer! 🍻"); } else { print("🙅♂️sorry, no alcohol for you..."); } // let’s count from 1 to 10! // p.s.: notice the `int i` for (int i = 1; i <= 10; i++) { print("it’s number $i"); // string interpolation: ${} 👉 $ (for variable names) } // while loops: // please don’t run this snippet, it will probably crash or run out of resources... while("🍌" == "🍌") { // oh, and forget ===, you don’t need it in Dart! print("Hey! 👋 I’m a banana!"); }
Arrays and objects
In JavaScript, to store multiple pieces of data together, we use arrays and objects. In Dart, we call them lists and maps, and they work a bit differently under the hood (and they have some extra APIs!). Let’s look into them!
Array 👉List
In Dart, a list ideally stores an array of homogenous data . That’s right -- no more [1, "banana", null, 3.44] (ideally)! You can create a list with the [] syntax you are already familiar with from JS, and with the new List() constructor.
// the usual, implicitly typed, [] syntax var continents = ["Europe", "North America", "South America", "Africa", "Asia", "Australia"]; continents.add("Antarctica"); // .push() 👉 .add() // please note that when throwing in multiple types of data, Dart will fall back to the `dynamic` type for your list: var maybeBanana = [1, "banana", null, 3.44]; // the `new List()` syntax, with a dynamic length: // note the List<T> syntax: you need to pass in the desired value type between the <>s List<int> someNiceNumbers = new List(); someNiceNumbers.add(5); // fixed-length list: List<int> threeNiceNumbers = new List(3); // this list will be able to hold 3 items, at max. // dynamic list with the new List() syntax: List<dynamic> stuff = new List(); stuff.add(3); stuff.add("apple"); // this is still totally legit because of the <dynamic> type
Want to know more about lists in Dart? Check out the API reference here!
Object 👉Map
Now that we’ve covered arrays, we can move on to objects. In JavaScript, objects store key-value pairs, and the closest we can get to this data structure in Dart is a Map. Just like we saw at the List, we can define a Map both with the { ... } literal and with the new Map() constructor.
// the usual { ... } literal var notesAboutDart = { objects: "hey look ma! just like in JS!", otherStuff: "idc we’ll look into them later" }; // the new Map constructor Map notesAboutJs = new Map(); // … and of course, you can explicitly type Maps! // typed Map literal: Map<String, int> prices = <String, int>{ "apple": 100, "pear": 80, "watermelon": 400 }; // typed Map constructor: final Map<String, String> response = new Map<String, String>();
Knowing about these methods will be just enough for now - but if you want to get to know the advanced stuff like HashMaps right away, be sure to check out the API docs of the Map class.
Imports and exports
In JavaScript, you could simply expose values from your files with export or module.exports and refer to them in other files with import or require(...). In Dart, it’s both a bit more complex and simpler than that.
To simply import a library, you can use the import statement and refer to the core package name, a library name, or a path:
import 'dart:math'; // import math from “math” 👉import “math”; // Importing libraries from external packages import 'package:test/test.dart'; // import { test } from “test” 👉import “test/test”; // Importing files import 'path/to/my_other_file.dart'; // this one is basically the same // Specifying a prefix import 'dart:math' as greatMath;
But how about creating your own libraries or exporting stuff? Dart lacks the usual public, protected or private keywords that Java has for this purpose (sidenote: Dart is compared to Java a lot of times) and even the export keyword that we’re used to in JavaScript. Instead, every file is automatically a Dart library and that means that you can just write code without explicitly exporting stuff, import it in another file, and expect it to work out just fine.
If you don’t want Dart to expose your variable, you can (and should!) use the _ prefix. Here’s an example:
// /dev/a.dart String coolDudes = "anyone reading this"; String _hiddenSuffix = “...with sunglasses on 😎"; // /dev/b.dart import "./b.dart"; print("cool dudes: $coolDudes"); // => cool dudes: anyone reading this print("cool dudes: $coolDudes $_hiddenSuffix") // => will fail as _hiddenSuffix is undefined in this context
Oh, and just a quick note about naming variables: camelCasing is considered a best practice, just like capitalizing abbreviations longer than two characters (e.g. HTTP => Http, or HttpConnectionInfo). To know more about writing efficient and stylish Dart code, make sure that you read the Effective Dart guide later on your journey, once you are confident with the basics.
A quick intro to OOP and classes
Dart is an object oriented language - but what does that mean for you?
If you don’t know OOP yet, that means that you’ll have to learn a brand new paradigm of programming that is utilized in many popular languages like Java, C#, and of course, Dart. While introducing you to OOP isn’t the main goal of this series, I’ll provide you a quick intro so that you can start off with Dart and Flutter.
The first thing to settle is that JavaScript isn’t either strictly OOP nor functional - it contains elements from both architectures.
It’s up to your preferences, the project you work on, and the desired target framework, to choose (if a strict decision is ever made) between the two concepts. On the other hand, Dart is pretty strict about being OOP.
Here’s a little chart I made to help you wrap your head around the main differences between functional and object-oriented programming:
To sum up: before OOP, there was procedural programming. There were a bunch of variables and functions lying around - and it was simple, but if often led to spaghetti code. To solve this, engineers came up with OOP, where we group related functions and variables into a unit. This unit is called an object, and inside it there are variables called properties and functions called methods. While creating this unit, always try to be descriptive. To practice making up these units, you can come up with real-world objects around you and try to describe them with properties and methods.
A car would, for example, have properties like their brand, color, weight, horse power, their license plate number and other stuff that can describe a car. Meanwhile it would have methods for acceleration, breaking, turning, etc.
Of course, you don’t have cars inside your code, so let’s put that abstract idea into code! A great example of a unit inside JS would be the window object. It has properties like the width and height of the window and has methods for resizing and scrolling.
The four principles of OOP are:
Encapsulation: Group variables (properties) and functions (methods) into units called objects.This reduces complexity and increases reusability.
Abstraction: You should not be able to directly modify the properties or access all methods - instead, think of writing a simple interface for your object. This helps you isolate the impact of changes made inside the objects.
Inheritance: Eliminate redundant code by inheriting stuff from another object or class. (Dart achieves this with mixins - we’ll look into concrete examples later). This helps you keep your code base smaller and more maintainable.
Polymorphism: Because of the inheritance, one thing can behave differently depending on the type of the referenced object. This helps you in refactoring and eliminating ugly ifs and switch/case statements.
Real-Life Dart Examples
If you are confused or intimidated by this concept, don’t worry. Looking at real-life Dart examples will help you wrap your head around this whole mess we call OOP. Let’s look at a simple class with some properties and a constructor.
class Developer { final String name; final int experienceYears; // Constructor with some syntactic sugar // a constructor creates a new instance of the class Developer(this.name, this.experienceYears) { // The code you write here will run when you construct a new instance of the Developer class // e.g. with the Developer dev = new Developer(“Daniel”, 12); syntax! // Notice that you don't have to explicitly type // this.name = name; // one by one. This is because of a Dart syntactic sugar } int get startYear => new DateTime.now().year - experienceYears; // read-only property // Method // notice the `void` as this returns nothing void describe() { print( 'The developer is $name. They have $experienceYears years of experience so they started development back in $startYear.'); if (startYear > 3) { print('They have plenty of experience'); } else { print('They still have a lot to learn'); } } }
And somewhere else in the code, you can construct a new instance of this class:
void main() { Developer peter = new Developer("Peter", 12); Developer aaron = Developer("Aaron", 2); // in Dart 2, the new keyword is optional peter.describe(); // this well print this to the console: // The developer is Peter. They have 12 years of experience so they started development back in 2008. // They have plenty of experience. aaron.describe(); // => // The developer is Aaron. They have 2 years of experience so they started development back in 2018. // They still have a lot to learn. }
And that’s it! You’ve just made your first Dart class with properties and methods. You used typed variables, get-only (protected) variables, control flow statements, got the current year and printed some stuff out to the console.
Congratulations! 🎉
Inheritance and mixins in Dart
Now while you have momentum, let’s have a peek at inheritance and mixins.
Once you have a solid knowledge of classes and start to think of more complex systems, you’ll feel the need for some way to inherit code from one class to another without copying and pasting code all over the place and making a big ol’ bowl of spaghetti. ❌🍝
For this reason, we have inheritance in OOP. When inheriting code from one class to another, you basically let the compiler copy and paste members of the class (“members” of the class are methods and properties inside a class), and add additional code on top of the previous class. This is where polymorphism kicks in: the same core code can exist in multiple ways by inheriting from a base class (the class you inherit from).
Think of HTML. There are several similar elements that HTML implements, like a TextBox, a Select or a Checkbox. They all share some common methods and properties like the click(), focus(), innerHTML, or hidden. With class inheritance, you can write a common class like HtmlElement and inherit the repetitive code from there.
How does this look in practice? In Dart, we use the extends keyword to inherit code from a base class. Let’s look at a short example:
// notice the extends keyword. // we refer to the Developer class we defined in the previous snippet class RisingStackEngineer extends Developer { final bool cool = true; String sunglassType; RisingStackEngineer(String name, int experienceYears, this.sunglassType) : super(name, experienceYears); // super() calls the parent class constructor void describeSunglasses() { print("$name has some dope-ass $sunglassType-type sunglasses."); } }
And what can this class do? Let’s look at this snippet:
void main() { RisingStackEngineer berci = RisingStackEngineer("Bertalan", 300, "cool"); berci.describe(); // .describe(); is not defined on the RisingStackEngineer class directly - it’s inherited from the Developer class. We can still use it though! berci.describeSunglasses(); // => Bertalan has some dope-ass cool-type sunglasses }
Isn’t that amazing? Let’s make it even better with mixins. Mixins help you mix in more than one class into your hierarchy. For example, let’s give some keyboards for our developers:
class Keyboard { int numberOfKeys = 101; void describeKeyboard() { print("The keyboard has $numberOfKeys keys."); } }
And use a mixin to create some sort of developer-keyboard hybrid person with Dart and the with keyword:
class WalkingKeyboard extends Developer with Keyboard { // ... }
And that’s it! If you want to practice Dart before we move on to our last topic for today (asynchronous programming), be sure to play around with DartPad, an online compiler made by the Dart team.
Write some statements, create some classes and maybe even inherit some code. Don’t just read - pause this article and write some code! Once you feel comfortable with these base concepts (typing your variables, writing lists, maps, using control flow statements, creating classes), we’ll move forward to asynchronous programming with Dart.
Asynchronous programming in the Dart Langauge
Writing asynchronous code is a must when communicating with a server, working with files, or using some native APIs. In JavaScript, we had callbacks and async/await for timing our code. To our luck, Dart utilizes the very same concepts and embraces async/await to avoid callback hell.
Let’s look at a callback example first:
// Promise 👉 Future // the method return type is an asynchronous void Future<void> printWithDelay(String message) { // Future.delayed delays the code run with the specified duration return Future.delayed(Duration(seconds: 1)).then((_) { print(message); }); } void main() { print("hey hi hello"); printWithDelay("this message is printed with delay"); }
And look at the very same code with async/await:
// notice that you have to add in the async keyword to be able to await a Future Future<void> printWithDelay(String message) async { await Future.delayed(Duration(seconds: 1)); print(message); } void main() { print("hey hi hello"); printWithDelay("this message is printed with delay"); }
And that was it for the Promise 👉 Future part. If you’d like to know more about the Future API, be sure to read the documentation. But stay tuned! Dart has another API for handling asynchrony: Streams. 🤯
Streams in the Dart Language
Dart’s main advancement in asynchrony compared to many other languages is native support for streams. If you want to have a simple way to wrap your head around the difference between Futures and Streams, think of the following: Future handles “finished future” (e.g. a web API response) with a single value, while Streams handle continuous future (e.g. an asynchronous for loop) with zero or more values.
Consider the following chart:
How do you work with data received from Dart Streams? Whenever a new event happens in the stream (either new data is received or an error happened), Dart notifies a listener. A listener is a snippet of code that subscribes for events of a stream and processes data whenever an event is received. You can subscribe to a stream with the .listen() function, provide a callback and boom, there you go! Isn’t that easy? 🤩 Let’s look at an example to get the hang of it:
// this is an imaginative stream that gives us an integer every one second final exampleStream = NumberCreator().stream; // e.g. 1, 2, 3, 4, ... // print the data received from the stream final subscription = exampleStream.listen((data) => print(data););
By default, Dart streams only support one listener. Adding another listener to this stream would throw an exception - however, there is a tool that helps us adding multiple listeners to a single stream. Broadcast streams! You can just throw in .asBroadcastStream at the end of your stream and you’ll be able to add multiple listeners to your stream:
// same code but with a broadcast stream. Notice the .asBroadcastStream at the end! final exampleStream = NumberCreator().stream.asBroadcastStream; // and you’ll be fine adding multiple listeners final subscription = exampleStream.listen((data) => print(data);); final subscription2 = exampleStream.listen((data) => print(data););
But while we’re at listeners, let’s have a closer look at that API. I mentioned that you could either receive data or an error in a stream: how can you handle errors? I made a bit more advanced listener with error handling below. You can also run code when a stream finishes sending data (won’t send data anymore), you can explicitly define if you want to cancel listening when an error occurs, and a lot more. Here’s the code:
final advancedSubscription = exampleStream.listen( // this runs when new data is received (data) { print("data: $data"); }, // handle errors when one occurs onError: (err) { print("error: $err"); }, // do not cancel the subscription when an error occurs cancelOnError: false, // when the stream finishes, run some code. onDone: () { print("done!"); } );
Oh, and if this wouldn’t be enough for you, you can do stuff with the subscription object itself too:
advancedSubscription.pause(); // pause the subscription advancedSubscription.resume(); // resume the subscription advancedSubscription.cancel(); // remove/cancel the subscription
There is still a lot more that can be done with streams in Dart: you can manipulate them, filter their data, and of course, we didn’t have a look at asynchronous iterators and creating streams - however, this should be just enough for you to start development with Flutter.
If you want to know more about asynchrony in Dart, check out the following videos made by the Flutter team:
Isolates and event loops
Dart Futures
Dart Streams
Async/Await
Generators
And that’s it for asynchronous programming - for now!
Summing our beginner Dart tutorial up
Congratulations on making it this far into the course! 🎉 If it was a bit dry or heavy for you, don’t worry: this was a Dart-only episode. In this episode, we looked at a crap ton of stuff! We went from variables, types, and control flow statements to lists, maps, imports, and exports.
Then, we came to the heavier parts of the Dart ecosystem. We first had a look at why OOP exists, what are its pros, where it performs well, and then we looked at classes, inheritance, and mixins, and if that wouldn’t be enough, we even looked at asynchrony, callbacks, async/await and streams.
Don’t forget: if you want to practice all these new stuff we just learned about, you can always hit up DartPad and play around with it for a bit. (I even encourage you to do so as you’ll need to have a strong Dart knowledge to move on to Flutter).
In the next episode, we’ll look into Flutter: we’ll start with the CLI and a hello world app, and have a look at widgets, lists, styling, state management, props, routing, and networking - and in the last episode, we’ll put it all together and build a fun game. Until then, stay tuned!
All the bests ✌️ Daniel from RisingStack
Beginner Dart Language Tutorial for JavaScript Developers published first on https://koresolpage.tumblr.com/
0 notes
Text
What is Developer Experience (DX)?
Developer Experience¹ is a term² with a self-declaring meaning — the experience of developers — but it eludes definition in the sense that people invoke it at different times for different reasons referring to different things. For instance, our own Sarah Drasner’s current job title is “VP of Developer Experience” at Netlify, so it’s a very real thing. But a job title is just one way the term is used. Let’s dig in a bit and apply it to the different ways people think about and use the term.
People think of specific companies.
I hear DX and Stripe together a lot. That makes sense. Stripe is a payment gateway company almost exclusively for developers. They are serious about providing a good experience for their customers (developers), hence “developer experience.” Just listen to Suz Hinton talk about “friction journals”, which is the idea of sitting down to use a product (like Stripe) and noting down every single little WTF moment, confusion, and frustration so that improvements can be made:
Netlify is like Stripe in this way, as is Heroku, CodePen, and any number of companies where the entire customer base is developers. For companies like this, it’s almost like DX is what UX (User Experience) is for any other company.
People think of specific technologies.
It’s common to hear DX invoked when comparing technologies. For instance, some people will say that Vue offers a better developer experience than React. (I’m not trying to start anything, I don’t even have much of an opinion on this.) They are talking about things like APIs. Perhaps the state is more intuitive to manage in one vs. the other. Or they are talking about features. I know Vue and Svelte have animation helpers built-in while React does not. But React has hooks and people generally like those. These are aspects of the DX of these technologies.
Or they might be speaking about the feeling around the tools surrounding the core technology. I know create-react-app is widely beloved, but so is the Vue CLI. React Router is hugely popular, but Vue has a router that is blessed (and maintained) by the core team which offers a certain feeling of trust.
> vue create hello-world
> npx create-react-app my-app
I’m not using JavaScript frameworks/libraries as just any random example. I hear people talk about DX as it relates to JavaScript more than anything else — which could be due to the people in my circles, but it feels notable.
People think of the world around the technology.
Everybody thinks good docs are important. There is no such thing as a technology that is better than another but has much worse docs. The one with the better docs is better overall because it has better docs. That’s not the technology itself; that’s the world around it.
Have you ever seen a developer product with an API, and when you view the docs for the API while logged in, it uses API keys and data and settings from your own account to demonstrate? That’s extraordinary to me. That feels like DX to me.
Airtable docs showing me API usage with my own data.
“Make the right thing easy,” notes Jake Dohm.
That word, easy, feels highly related to DX. Technologies that make things easy are technologies with good DX. In usage as well as in understanding. How easily (and quickly) can I understand what your technology does and what I can do with it?
What the technology does is often only half of the story. The happy path might be great, but what happens when it breaks or errors? How is the error reporting and logging? I think of Apollo and GraphQL here in my own experience. It’s such a great technology, but the error reporting feels horrendous in that it’s very difficult to track down even stuff like typos triggering errors in development.
What is the debugging story like? Are there special tools for it? The same goes for testing. These things are fundamental DX issues.
People think of technology offerings.
For instance, a technology might be “good” already. Say it has an API that developers like. Then it starts offering a CLI. That’s (generally) a DX improvement, because it opens up doors for developers who prefer working in that world and who build processes around it.
I think of things like Netlify Dev here. They already have this great platform and then say, here, you can run it all on your own machine too. That’s taking DX seriously.
One aspect of Netlify Dev that is nice: The terminal command to start my local dev environment across all my sites on Netlify, regardless of what technology powers them, is the same: netlify dev
Having a dedicated CLI is almost always a good DX step, assuming it is well done and maintained. I remember WordPress before WP-CLI, and now lots of documentation just assumes you’re using it. I wasn’t even aware Cloudinary had a CLI until the other day when I needed it and was pleasantly surprised that it was there. I remember when npm scripts started taking over the world. (What would npm be without a CLI?) We used to have a variety of different task runners, but now it’s largely assumed a project has run commands built into the package.json that you use to do anything the project needs to do.
Melanie Sumner thinks of CLIs immediately as core DX.
People think of the literal experience of coding.
There is nothing more directly DX than the experience of typing code into code editing software and running it. That’s what “coding” is and that’s what developers do. It’s no wonder that developers take that experience seriously and are constantly trying to improve it for themselves and their teams. I think of things like VS Code in how it’s essentially the DX of it that has made it so dominant in the code editing space in such a short time. VS Code does all kinds of things that developers like, does them well, does them fast, and allows for a very wide degree of customization.
TypeScript keeps growing in popularity no doubt in part due to the experience it offers within VS Code. TypeScript literally helps you code better by showing you, for example, what functions need as parameters, and making it hard to do the wrong thing.
Then there is the experience outside the editor, which in the browser itself. Years ago, I wrote Style Injection is for Winners where my point was, as a CSS developer, the experience of saving CSS code and seeing the changes instantly in the browser is a DX you definitely want to have. That concept continues to live on, growing up to JavaScript as well, where “hot reloading” is goosebump-worthy.
The difference between a poor developer environment (no IDE help, slow saves, manual refreshes, slow pipelines) and a great developer environment (fancy editor assistance, hot reloading, fast everything) is startling. A good developer environment, good DX, makes you a better and more productive programmer.
People compare it to user experience (UX).
There is a strong negative connotation to DX sometimes. It happens when people blame it for it existing at the cost of user experience.
I think of things like client-side developer-only libraries. Think of the classic library that everyone loves to dunk: Moment.js. Moment allows you to manipulate dates in JavaScript, and is often used client-side to do that. Users don’t care if you have a fancy API available to manipulate dates. That is entirely a developer convenience. So, you ship this library for yourself (good DX) at the cost of slowing down the website (bad UX). Most client-side JavaScript is in this category.
Equally as often, people connect developer experience and user experience. If developers are empowered and effective, that will “trickle down” to produce good software, the theory goes.
Worst case, we’re in a situation where UX and DX are on a teeter totter. Pile on some DX and UX suffers on the other side. Best case, we find ways to disentangle DX and UX entirely, finding value in both and taking both seriously. Although if one has to win, certainly it should be the users. Like the HTML spec says:
In case of conflict, consider users over authors over implementors over specifiers over theoretical purity.
People think about time.
How long does a technology take to adopt? Good DX considers this. Can I take advantage of it without rewriting everything? How quickly can I spin it up? How well does it play with other technologies I use? What is my time investment?
This kind of thing makes me think of some recent experience with Cloudflare Workers. It’s really cool technology that we don’t have time to get all into right here, but suffice to say it gives you control over a website at a high level that we often don’t think about. Like what if you could manipulate a network request before it even gets to your web server? You don’t have to use it, but because of the level it operates on, new doors open up without caring about or interfering with whatever technologies you are using.
Not only does the technology itself position itself well, the DX of using it, while there are some rough edges, is at least well-considered, providing a browser-based testing environment.
A powerful tool with a high investment cost, eh, that’s cool. But a powerful tool with low investment cost is good DX.
People don’t want to think about it.
They say the best typography goes unnoticed because all you see is the what the words are telling you, not the typography itself. That can be true of developer experience. The best DX is that you never notice the tools or the technology because they just work.
Good DX is just being able to do your job rather than fight with tools. The tools could be your developer environment, it could be build tooling, it could be hosting stuff, or it could even be whatever APIs you are interfacing with. Is the API intuitive and helpful, or obtuse and tricky?
Feel free to keep going on this in the comments. What is DX to you?
Are we capitalizing Developer Experience? I’m just gonna go for it.
Looks like Michael Mahemoff has a decent claim on coining the term.
The post What is Developer Experience (DX)? appeared first on CSS-Tricks.
What is Developer Experience (DX)? published first on https://deskbysnafu.tumblr.com/
0 notes
Link
The news of Zeit Vercel raising $21m (slide deck here) is great occasion for taking stock of what is going on with cloud startups. As Brian Leroux (who runs Begin.com) observes, with reference to Netlify's $55m Series C last month:
Between just Netlify and Vercel the VC community has put over 70MM in cloud focused on frontend dev in 2020.
Haven't AWS/GCP/Azure owned the cloud space? What is the full potential of this new generation of startups basically reselling their services with some value add?
Cloud's Deployment Age
I am reminded, again, of Fred Wilson's beloved Carlota Perez framework that I wrote about in React Distros. First you have an Installation Age, with a lot of creative destruction. Then, with the base primitives sorted out, we then build atop the installed layer, in a Deployment Age:
I think the same dynamics I outlined with frontend frameworks is happening here with cloud services. I'm obviously a LOT less well versed with the history of cloud, so please please take this with a grain of salt.
The "Failure" of PaaS
The argument is that the Big 3 Cloud Providers are mostly providing the new commoditized primitives on which the next generation of cloud services will be built. AWS is AWS, Azure maybe caters to the dotNet/Microsoft crowd better, whereas GCP maybe differentiates on Kubernetes and Machine Learning. Basically everyone has a container thing, a data thing, a file storage thing, a serverless thing, and so on.
A nice way to think about it, which I attribute to Guillermo (but I'm not sure about), is that these basic services are the new "Hardware". Instead of going to Fry's and picking up a motherboard, we now go to the AWS Console and pick up a t2.micro or to Azure for a Durable Function. Instead of debating Sandisk vs Western Digital we match up AWS Aurora vs Azure DocumentDB. The benefits are clear - we don't get our hands dirty, we can easily (too easily?) scale with a single API call, and thanks to Infra-as-Code we can truly treat our infra like cattle, not pets.
When the Big N clouds launched, the expectation was that Platform as a Service (PaaS) would win out over Infrastructure as a Service (IaaS). I mean - look at this chart! - if you were running a Software business, would you want to run it atop an IaaS or a PaaS? It made intuitive sense, and both Google App Engine and Azure originally launched with this vision, while Salesforce bought Heroku within 3 years of founding.
But this thesis was wrong. As Patrick McKenzie recently noted:
I'm surprised that Heroku's model didn't win over AWS' model and that DevOps is accordingly a core competence at most SaaS companies. This seems obviously terrible to me every time I'm doing DevOps, which probably took ~20% of all engineering cycles at my last company for surfacing very little customer value.
This rings true. As moderately successful as Heroku, Parse, and Firebase were, they are dwarfed by the size of the big clouds' IaaS businesses. It turns out that most people just wanted to lift and shift their workloads, rather than start new apps from scratch on underpowered platforms. Assisted by Docker, this acquired the rather unfortunate name of "cloud native". (Unfortunate, because there are now "more native" versions of building cloud-powered apps than "containerize everything and somehow mention agile")
But I don't think the PaaSes were wrong.
They were just early.
Developer Experience as a Differentiator
The thing about hardware providers is that they don't cater well to specific audiences. By nature, they build for general use. The best they can do is offer up a default "Operating System" to run them - the AWS Console, Google Cloud Console, Microsoft Azure Portal (Dave Cutler literally called Azure a Cloud OS when it began).
Meanwhile, the "undifferentiated heavy lifting" (aka Muck) of wrangling datacenters turned into "undifferentiated heavy lifting" of messing with 5 different AWS services just to set up a best practices workflow.
So increasingly, intermediate providers are rising up to provide a better developer experience and enforce opinionated architectures (like JAMstack):
Netlify
Vercel
Repl.it
Begin.com
Glitch
Render.com
Amplify
KintoHub
The working name for this new generation of cloud providers, used by Martin Casado, Amjad Masad, and Guillermo Rauch, is "second layer" or "higher level" cloud providers.
Nobody loves these names. It doesn't tell you the value add of having a second layer. Also the name implies that more layers atop these layers will happen, and that is doubtful.
Cloud Distros
I think the right name for this phenomenon is Cloud Distros (kinda gave this away in the title, huh). The idea is both that the default experience is not good enough, and that there are too many knobs and bells and whistles to tweak for the average developer to setup a basic best practices workflow.
Ok, I lied - there is no average developer. There are a ton of developers - ~40m, going by GitHub numbers. They don't all have the same skillset. The argument here is that cloud is going from horizontal, general purpose, off the shelf, to verticalized, opinionated, custom distributions. There are ~300,000 AWS Cloud Practitioners - yet, going by Vercel's numbers, there are 11 million frontend developers.
In order to cross this "chasm", the cloud must change shape. We need to develop custom "Distros" for each audience. For the Jamstack audience, we now have Netlify, Amplify, Begin and Vercel. For the Managed Containers crew, we have Render and KintoHub. For the Hack and Learn in the Cloud folks, we have Glitch and Repl.it. What the business nerds call verticalization or bundling, developers call "developer experience" - and it is different things to different people.
What's funny is these startups all basically run AWS or GCP under the hood anyway. They select the good parts, abstract over multiple services and give us better defaults. This is a little reminiscent of Linux Distros - you can like Ubuntu, and I can like Parrot OS, but it's all Linux under the hood anyway. We pick our distro based on what we enjoy, and our distros are made with specific developer profiles in mind too.
The Future of Cloud Distros
What we have now isn't the end state of things. It is still too damn hard to create and deploy full stack apps, especially with a serverless architecture. Serverless cannot proclaim total victory until we can recreate DHH's demo from 15 years ago in 15 minutes. I have yet to see a realistic demo replicating this. Our users and their frameworks want us to get there, but the platforms need to grow their capabilities dramatically. In our haste to go serverless, we broke apart the monolith - and suffered the consequences - now we must rebuild it atop our new foundations.
Begin and Amplify have made some great steps in this direction - offering integrated database solutions. Render and KintoHub buck the serverless trend, offering a great developer experience for those who need a running server.
There's probably no winner-takes-all effect in this market - but of course, there can be an Ubuntu. This generation of Cloud Distros is fighting hard to be the one-stop platform for the next wave (even the next generation) of developers, and we all win as a result.
0 notes
Text
Week in Ethereum news, annotated edition
Now that Gitcoin grants is over, this is a shill-free intro. Thanks to those who donated. Still have a bunch of thank you notes to send, and don’t have contact info for some.
I’ve been doing the annotated edition the day after, this one is 2 days after. Not sure what cadence I like. Perhaps it should be before?
Meanwhile I asked (on Twitter, naturally) whether I should create a separate Twitter account for Week in Ethereum News. The early vote was solidly yes, but overnight it became no.
Eth1
Latest core devs call. Tim’s notes: lots of ungas talk
Geth v1.9.10 – light client checkpoint oracle, higher propagated transaction cap, bug fixes
Multiaddr, ENR and enodes: network addresses explainer
The notes/call are an interesting read. They always are, but particularly this week if you think ungas and account versioning are interesting subjects.
Eth2
Latest what’s new in eth2
Latest Eth2 call. Notes from Mamy and Ben
Hsiao-Wei: Attestation aggregation in Eth2
Attestant: understanding the validator lifecycle
Runtime Verification formally verified the eth2 deposit contract
eth2stats
It’s been amusing to me how some parts of the investor community have gotten obsessed with the deposit contract. Given how many people have been holding their ETH from the sale, I imagine that hitting 7 figures will not be difficult, so I don’t understand the obsession with deploying the deposit contract. It’s not the limiting factor and never has been.
As I re-read Ben’s What’s New in Eth2, I realize that i’d like the annotated edition to be more like that. But it’s not.
Layer2
Fuel’s testnet is in open beta, fraud proofs under 1m gas. Using colored coins (!)
Miner challenges Arbitrum is dealing with
How Loopring aims to make its zk rollup transactions composable on layer1
Jordi Baylina’s Iden3 zk rollup slides
Layer2 has been hard so far. ETH and BTC’s original Raiden and Lightning channel networks have been slow to ship and failed to gain traction. Plasma has mostly fallen by the wayside, though there are teams finally putting Plasma variants into production that may produce interesting lessons.
It’s all rollup this week. In part because rollup seems to offer an easier environment for app devs, and with less of the problematic “but” problems that Plasma had. Channel networks are still coming (channels are already here), though I think it’s become clear to everyone that channel networks are quite complicated to get right.
It is a little amusing that Fuel is using colored UTXO coins, a la Bitcoin 2013.
Stuff for developers
Better Solidity debugging: console.log and stack traces
ABDK’s online tools: key of an address, calculate address pre-deploy, RLP encoder/decoder, encode/decode raw signed/unsigned transactions
Securify v2, free security scanner
Auditing your code with Web3j and its EVM
Sam Sun caught a vulnerability in Curve, which was solved by moving front end to a fixed version.
What are Burner Wallet Plugins? Customizing your popup event/economy
How to run your own xDai chain with arbitrary message bridge
web3connect v1beta.26 – a single web3 provider for all wallets
What does Truffle and WalletConnect mean?
a lightweight directory access protocol
Using CREATE2 explainer
Smart contracts on Austin Griffith’s eth.build
AirScript v0.6 and genSTARK v0.7 AirScript compiles to AirAssembly, which genSTARK uses to create a STARK
Lots of tools. Mostly self-explanatory - good open source projects spin off tools.
Every Solidity developer is excited about better debuggers. That’s been an issue for awhile.
Ecosystem
Year in Ethereum 2019 by Josh Stark and I
Scalability estimates for Waku (Status’s Whisper alternative)
A style guide for ethereum.org
<obligatory Jeb Bush please clap gif for Year in Ethereum> And when I say “please clap” I mean “literally hold down the clap button on Medium” so that people see it outside of Eth diehards.
I’ve said it before, but as soon as Status is a viable alternative, I’m planning to delete my other messengers. Messengers catch on because of “intolerant minorities” (to use Taleb’s phrase) who make others download a new messenger to communicate with them.
Enterprise
Key factors in choosing between Clique, Raft, and IBFT for private chains
Commodity giants consortium (Cargill, ADM, Glencore, Bunge, Dreyfus) chooses Quorum, Orchestrate and Kaleido for their tech stack
Governance and standards
EIP2315: JUMPSUB and RETSUB for simple EVM subroutines
EIP2489: deprecate GAS opcode
EIP2488: deprecate CALLCODE opcode
ERC2477: NFT metadata integrity
The DigixDAO voted for dissolution. TheLAO wants a DigixLAO
Social choice theory and voting on multiple outcomes
What to expect when summoning a MolochDAO
SignalDAO, a signalling DAO for Metacartel/MolochDAO using a Telegram bot doing web3 calls via Abridged SDK
Someone should write a history of DigixDAO. One of the first big 3 ETH token sales (Augur, Digix, Maker), it just never really happened. Probably some lessons in there about how early idealists gradually bump up against real world regulartions and with that much money at stake always choose the risk-averse path. Given how much DGX the founders hold, they’re going to get a nice payday. But who else remembers when the Digix founders were giving away 1 eth via a Reddit tip bot they created?
Application layer
Set Social Trading is live on mainnet. Automatically copy what your favorite trader is doing.
a URL shortener using ENS + the lightweight director access protocol referenced above in dev tools
How people are using Pepo, crypto’s TikTok
Ethernal: a text-based MUD. die and you lose your items!
There’s now over 100 million Dai
Rocket: get a loan against your NFTs, live on Ropsten testnet
Rho: a spec for a float to fixed automated market maker swap protocol
Synthetix: the state of Synthetix and 2020 roadmap adding ETH as collateral
This was a microcosm of what is happening on Ethereum at the app layer: DeFi, games, payments, and tokenization, and some mismash therein.
I’m pretty excited about interest rate swaps. Hope someone builds it.
Tokens/Business/Regulation
Davos was this week, so WEF issued a framework for Central Bank digital currencies in the age of blockchain
An onchain NFT for accredited investors
POAP event NFTs as a sybil-resistant identity layer
Tokenized real estate: purchase to settlement in 15 minutes with RealT
Bitcoiners often say things like “tokenized real estate doesn’t provide any benefits,” and they’re not entirely wrong, but getting to settlement in 15 minutes is a real benefit.
General
How not to critique Ethereum: a guide for Bitcoiners
A curated list of blockchain research papers
Benchmarking Brave vs Chrome/Firefox/Opera for speed and battery use
Chris Dixon: blockchains are computers that make commitments
This first said “a guide for lazy Bitcoiners,” but taking that out was my last edit before pressing send. Magnanimity is a virtue.
Chris Dixon’s blog post is interesting to me because it’s nice to see people writing again for broader audiences. In cryptowinter, the hype completely died. The talent flowing into this space has slowed way down. This isn’t bad in and of itself - things happen in cycles, no big deal, and it was time to deliver on some of the hype. But with scalability solutions hitting, tooling much improved, and key management that is ready for mass adoption, it seems like the hype cycle is about to get started.
0 notes
Photo
The most popular JavaScript links of 2019
#469 — January 3, 2020
Read on the Web
JavaScript Weekly
The holiday season is rapidly coming to a close and we're looking forward to not only a new year but the entirety of the Roaring Twenties. Rest assured, the JavaScript world is not going to look the same when 2030 turns up so watch this space! 😄
We'll be back as usual next week, but this week we're taking a look back at 2019 and the most popular things you clicked on. If you didn't read every issue in 2019 (we wouldn't expect you to!) you'll hopefully find a few things worth revisiting here.
Thanks for supporting us — we look forward to keeping you up-to-date in the years to come.
— Peter Cooper and the Cooperpress team
📈 Our most popular links of 2019:
1. The TypeScript Tax: A Cost vs Benefit Analysis — As much as we love JavaScript, this was really a strong year for TypeScript, with it seeming to become the de facto way to bring strong typing to JavaScript. Back in January, Eric Elliott asked "is it worth it?" and presented some critical, data-driven analysis to establish its viability. It was your most clicked link of 2019.
Eric Elliott
2. New ES2018 Features Every JavaScript Developer Should Know — We're now looking forward to ES2020 and we've had ES2019 in 2019 too, but this post remains packed with interesting examples of spread properties within object literals, asynchronous iterators and asynchronous iterables, Promise.prototype.finally, and other features that are still not exactly common to see in the wild.
Faraz Kelhini
The Complete ⚛️ React Learning Path — Take your React to the next level to find out what it is fully capable of with this comprehensive learning path.
Frontend Masters sponsor
3. 43 JavaScript Questions, With Their Answers Explained — Whether for fun or a job interview, this remains an interesting set of JavaScript-related questions, complete with explanations of the answers.
Lydia Hallie
4. I Don't Hate Arrow Functions (But..) — Arrow functions (=>), as introduced in ES6, have generally been a much welcomed addition to JavaScript but Kyle Simpson reminded us they’re not suitable in every scenario and created an ESLint plugin to help you keep a handle on their use.
Kyle Simpson
5. Responsible JavaScript: A Three Part Series — We originally only linked to part one of this great series where Jeremy Wagner plotted a course to avoid the unnecessary bloat and inaccessible patterns of modern JavaScript trends.. but now you can enjoy part 2 and part 3 too, where he went into more technical depth on bundling and handling third-party scripts.
Jeremy Wagner
6. What’s New in JavaScript — At this year’s Google I/O ’19, Mathias Bynens and Sathya Gunasekaran of the V8 team gave a fantastic 30 minute ‘state of the union’ talk on the state of JavaScript as a language and what new features are being baked in.
Google I/O video
💻 Jobs
JavaScript Developer at X-Team (Remote) — Work with the world's leading brands, from anywhere. Travel the world while being part of the most energizing community of developers.
X-Team
Senior Software Engineer, Frontend — Use the latest tech to mold an innovative, empathy-centric experience for creators to order fast, high-quality parts (forging space robots to animatronics).
Fictiv
Find a Job Through Vettery — Vettery is completely free for job seekers. Make a profile, name your salary, and connect with hiring managers from top employers.
Vettery
📘 The most popular articles & tutorials of 2019

The Cost of JavaScript in 2019 — Addy Osmani presented a 2019 update to his Cost of JavaScript in 2018 article in both video and article forms. If you still want to get a feel for where the true bottlenecks are with JavaScript, this is a must read.
Addy Osmani
Should We Rebrand 'JavaScript'? — This thoughpiece provoked quite a bit of discussion in the community over the problems (or not) with ‘JavaScript’ as a name. I think we'll see more on this front in 2020.
Kieran Potts
First Online Mentored Software Bootcamp w/ Job Guarantee — Get a job or your money back with Springboard’s online bootcamp. Benefit from 1:1 mentorship, our exclusive curriculum, and top career coaching.
Springboard (Software Engineering Career Track) sponsor
When Should You Be Using Web Workers? — Web Workers provide a way to run JavaScript in background threads in the browser and you’d think using them as much as possible would be a good thing.. right? Current frameworks make this tough, says Surma, who shows us why we should be working to change this ASAP.
Surma
Practical Ways to Write Better JavaScript — You’re not necessarily going to agree with all of them (e.g. “Use TypeScript”!) but this is a reasonably solid batch of points to think about overall.
Ryland Goldstein
JavaScript Symbols: But Why? — Not played with symbols (a new data type introduced with ES6) yet? This is a gentle way to get up to speed with not only what they are but why you might use them.
Thomas Hunter II
Make 2020 the Year to Master MongoDB. Try Studio 3T Today — Generate driver code for JavaScript, Python, Ruby and more? Build queries fast with our drag & drop editor? Of course.
Studio 3T sponsor
Using Native JavaScript Modules in Production Today — “now, thanks to some recent advances in bundler technology, it’s possible to deploy your production code as ES2015 modules—with both static and dynamic imports—and get better performance than all non-module options currently available.”
Philip Walton
7 Tricks with Resting and Spreading JavaScript Objects — Using modern JS features to merge objects, organize properties, and more.
Joel Thoms
📺 The most popular videos of 2019
▶ Why I Was Wrong About TypeScript — Smells like an opinion-driven talk, but actually covers the history behind compile-to-JS languages, how we got to a point where interest in TypeScript is growing strongly, and why it’s worth taking seriously.
TJ VanToll
▶ Why 0.1 + 0.2 === 0.30000000000000004: Implementing IEEE 754 in JS — Head to your node CLI right now and type in 0.1 + 0.2. If the answer confuses you, this is the video for you. And even if you know why, working with the building blocks behind floating point representations is just cool anyway.
Low Level JavaScript
Video Developer Report - Top Trends in Video Technology 2019
Bitmovin sponsor
▶ Keep Betting on JavaScript — Kyle Simpson presents a history lesson of JavaScript, looks at how a variety of features were (or weren’t) introduced, and compels us to think about the future of the Web and JavaScript as we contribute and ‘place bets’ on technologies.
Kyle Simpson

▶ A Look at Deno: A New(ish!) JavaScript Runtime — Ryan originally created Node about ten years ago but over the past couple of years he’s been working on Deno, a non-Node compatible, TypeScript-focused runtime with some interesting features. (Note: Poor audio until a few minutes in.) I suspect we'll hear a lot more about this in 2020.
Ryan Dahl
🔧 The most popular code & tool releases of 2019
Svelte 3 Released: Rethinking Reactivity — Svelte is one of the most interesting UI frameworks out there as it’s not scared of taking a unique approach. Rather than running in the browser, Svelte runs at build time, compiling your app into more efficient runtime JavaScript. Svelte 3 took some major steps forward, particularly in helping you write less code.
Rich Harris
Mithril.js 2: A JavaScript Framework for Building Brilliant Applications — Mithril is a really neat alternative to things like Vue, React or Angular. It’s very compact and fast (so ideal for mobile), runs a bit closer to vanilla JS than the alternatives, and is great for tying together vanilla JS libraries rather than needing its own alternatives.
Mithril
RunJS: A JavaScript 'Scratchpad' Tool for the Desktop — Write and run JavaScript instantly. Useful for learning, experimenting, or perhaps even creating screencasts, tweets, or similar educational content. Originally macOS only but now supports Windows and Linux too.
Luke Haas
Pixi.js 5: Create Beautiful 2D Web Experiences — Boasts the ‘fastest, most flexible 2D WebGL renderer’ to let you take advantage of hardware acceleration without getting involved in WebGL or 3D concerns. Check out demos for what the code looks like and what you’d use it for. There’s also a Pixi Playground for quickly crafting your own experiments.
PixiJS
Babylon.js 4.0: The (Very) Powerful WebGL Graphics Engine — Such a significant release that they released a 2 minute video trailer for it! Want to play? Enjoy this editable live demo.
Microsoft
Postwoman: An API Request Builder and Tester — A free alternative to Postman, a popular app for debugging and testing HTTP APIs. Postwoman works in the browser and supports HTTP and WebSocket requests as well as GraphQL. Insomnia is a similar tool if you want to run something as a desktop app.
Liyas Thomas
FlexSearch.js: A Full Text Search Library — Claims to outperform all of the alternatives while supporting features like multi-word matching and phonetic transformations. Happy in both the browser and Node.js.
Nextapps GmbH
Just: A JavaScript Task Library from Microsoft — If you’re familiar with Ruby’s rake, it’s a bit like that. Define tasks in JavaScript, run them with just (which works fine without installation using npx) and you get a bunch of nice features like logging and task composition.
Microsoft
Node-RED 1.0 Released — Node RED is a flow-based, visual programming tool (aimed primarily at hardware automation) that’s built on top of Node.js. Despite only reaching 1.0 in 2019, it’s a mature project used in numerous real world IoT projects.
Nick O'Leary
by via JavaScript Weekly https://ift.tt/2QHifL3
0 notes
Text
Version 374
youtube
windows
zip
exe
macOS
app
linux
tar.gz
source
tar.gz
I had a great week. A ton of Qt problems are fixed, and a macOS App is ready. If you were waiting for a cleaner release, I would recommend this for all Windows and Linux users.
Qt
I mostly worked this week on Qt bugs. I appreciate all the reports everyone sent in. I have fixed a whole lot, mostly bringing things back in line to where the wx build was. The whole list is in the changelog, but the highlights are:
Fixed the cursor not unhiding in the media viewer as long as it was over a media.
Fixed the resizing texts that were causing subscription popups and others to bounce around.
Fixed pages auto-resorting media on creation when not desired.
Fixed tab drag and drop when 'do not follow' (+shift) mode is on.
File drag and drop to discord should be fixed on Windows if the options->gui BUGFIX is set.
Added basic high DPI scaling support--all feedback appreciated. -- EDIT: It looks like high dpi scaling is making thumbs and media viewer unintentionally scale up in a pixelly way on some machines. I will put time into this week and see if I can get them looking better for 375.
Fixed some memory leaks.
There is still some stuff I didn't have time to get to--some layout/sizing problems for dialogs, some splitter/sash positioning issues, focus sometimes not transferring when requested, and some weirder stuff like html rendering as a web document in text labels rather than displaying literally. I'll keep going, but the vast bulk of the work is done.
macOS and Linux builds
I fixed a critical issue in the macOS build and believe I have it working as good as the others. If you are a macOS user who has a backup, please give it a go and let me know what you get. If you want a confirmed clean release, please wait a week. Some things like maximised media viewers are a little janky, so I'm interested in feedback on what you see and what you would like it to do instead, if anything. I have disabled borderless fullscreen for now for similar reasons. Also, the centered tab bar for regular pages has thrown off all the tab drag and drop position calculations, so tab rearrange and intra-client file drag and drops are disabled--I'll put some time into it next week and see if I can fix it.
The Linux build now has some common library files removed. This should improve font compatibility for some users by causing hydrus to rely on your higher compatibility system libraries rather than the ones on my dev machine. If you use the built release and have the wrong font or other UI jank, please try doing a semi 'clean' install this week by deleting all the .so files in your base install directory (the ones beside the 'client' executable) before extracting as you normally would. If you try this, make sure you have a backup beforehand, just in case you accidentally delete the wrong thing.
Arch users who run from source may have been unable to run the client due to 'shiboken' issues. This is because Arch recently updated to Python 3.8, where PySide2 (a Qt wrapper) does not currently work! Some updated running-from-source instuctions on how to use PyQt5 instead are now here: https://hydrusnetwork.github.io/hydrus/help/running_from_source_linux_packages.txt
full list
qt environment/build:
macOS build is useable! tab drag and drop position calculation doesn't work yet, so intra-client file DnDs and tab rearrange DnDs are disabled for now. borderless fullscreen is also disabled, feedback on this vs maximise would be appreciated
fixed a critical bug in the macOS release that was resulting in 100% CPU repaint loop for the canvas viewer when media was loaded (wew). this may have affected certain other platforms in some situations
the linux build has a variety of common library files removed, letting your OS rely on higher compatibility system defaults. this _should_ clean up font and other issues for users running on very new/old system libraries. if you cannot run 374, please let me know your distro and version and any error messages
the special linux running from source document is updated, including info about Arch and PyQt5
fixed a windows build issue that meant some animated gifs were not able to load and render correctly
fixed a precise time fetching issue for users running from source with python 3.8
high dpi scaling should have improved support. please report on bad layout issues and other artifacts
fixed creating a serialised object png when using PyQt5
fixed file save dialogs with filetype filters when using PyQt5
fixed an important menubar related memory leak
_seem_ to have fixed an important media viewer memory leak
.
qt ui fixes:
fixed pages not collecting and sorting on creation if they do not have to, which restores the 'preserve flat unsorted order' behaviour of session loads and file drag and drop page tab creations
fixed the cursor not unhiding on move in the media viewer when over an animation or static image
fixed the issue where a new thumbnail panel would double-up with the old one for half a second if a menu caused the panel swap
reworked the elided (text that cuts off...) label code to more reliably work on single lines, which fits our purposes. the network job control (esppecially on subscription popups) and top hover window should now show their long statuses without changing their parent panel's layout
updated a variety of old text-wrap-width wx-hacks texts to instead auto-fill available space
the various downloaders should now be careful about handling large status texts. if a multiline error or html page slips in to a status somewhere, your download pages' lists should no longer go nuts with very tall spam-filled status cells
hydrus->discord drag and drop should be fixed if the BUGFIX is on!
fixed page tab drag and drop to do live drag selection with 'do not follow' behaviour (this is switched by holding down shift during drag), and, in this case, got it to return to the original page's neighbour/parent once the drop is complete
fixed 'center' dialogs positioning on the center of their parent windows, rather than the center of the primary screen
fixed the hover windows not passing shortcuts up to the media viewer when not consumed
fixed some misc 'can I consume a shortcut' focus/active checking code
fixed the various hide/parents/siblings tag menu items for tags with counts
fixed the main gui and other non-dialog windows remembering their pre-maximise/fullscreen sizes if set to remember size and previously closing while maximised/fullscreened
menubar menus should now show description text in the main gui statusbar on mouseover of their items
fixed a bad menu initialisation in the canvas preview panel
fixed a little page splitter bork and improved size of preview window on initial boot
fixed the edit notes dialog when launched from the media viewer
fixed a couple of text edit issues in edit url class panel
fixed page up/down scroll for taglists
fixed page down scroll for thumbnail grid, and fixed page up/down distance
fixed thumbnails not scrolling into view if they are keyboard-selected slightly off screen but within the scroll option percentage threshold
misc layout and style cleanup
misc refactoring
.
misc:
you can now set the maximum size of duplicate filter pair batches (default 250) under options->duplicates
when an ipfs service fails to pin a file and returns no hash or the empty multihash, this is now recognised, info dumped to log, a simple popup message sent, and the job continued. this is just a patch--better error handling here will come later
if the client or server are launched with a custom temp_dir that does not exist, it will now attempt to create it (previously errored out)
fixed a clean exit after certain client boot fail error handling, and repeated cleaner exit for the server
added some new memory profiling actions to the help->debug menu
parallel subscriptions should now initialise with less of an aggresive CPU spike
if the client or server crash before the application can be launched, the crash log is now called hydrus_crash.log. if the db dir is not yet established, it will now try to find and put it in your desktop and, failing that, then your user dir
the client no longer prints 'booting db' twice
a variety of misc code cleanup and fixes
next week
I was going to take an easy week, but I ended up crunching again, ha ha, so I'll for real take it a bit easier this coming week. There's still some Qt stuff to fix, and doubtless a few more reports to come in, and Qt css theming to add, but I'd also really like to get back to doing some normal work. There's a thousand things to do, so one part of it will just be going through my list and triaging the most important stuff.
As we get to the end of the year, I would like to finish some tag work like namespace siblings and tag filters on uploading and tag processing, and also try getting this mpv window embedded into the media viewer so we have full-featured video and legit audio support. My ideal is to have the 'emergency' tag work complete for February so I can put up a new 'big job to work on next' poll.
0 notes
Text
How To Learn Data Science If You’re Broke

Over the last year, I taught myself data science. I learned from hundreds of online resources and studied 6–8 hours every day.
In the following article, I give guidelines and advice so you can make your own data science curriculum. I hope to give others the tools to begin their own educational journey. So they can begin to work towards a more passionate career in data science.
A Quick Note
When I say “data science”, I am referring to the collection of tools that turn data into real-world actions. These include machine learning, database technologies, statistics, programming, and domain-specific technologies.
A few resources to start out your journey.

The internet is a chaotic mess. Learning from it can often feel like drinking from the fun end of a fire-hose.
There are simpler alternatives that offer to sort the mess for you.
Sites like Dataquest, DataCamp, and Udacity all offer to teach you data science skills. Each creating an education program that shepherds you from topic to topic. Each requires little course-planning on your part.
The problem? They cost too much, they don’t teach you how to apply concepts in a job setting, and they prevent you from exploring your own interests and passions.
There are free alternatives like edX and coursera which offer one-off courses diving into specific topics. If you learn well from videos or a classroom setting, these are excellent ways to learn data science.
Check out this website for a listing of available data science courses. There are also a few free course curricula you can use. Check out David Venturi’s post, or the Open Source DS Masters (a more traditional education plan).
If you learn well from reading, look at the Data Science From Scratch book. This textbook is a full learning plan that can be supplemented with online resources. You can find the full book online or get a physical copy from Amazon ($27).
These are just a few of the free resources that provide a detailed learning path for data science. There are many more.
To better understand the skills you need to acquire on your educational journey, in the next section I detail a broader curriculum guideline. This is intended to be high-level, and not just a list of courses to take or books to read.
A Curriculum Guideline
Python Programming
Programming is a fundamental skill of data scientists. Get comfortable with the syntax of Python. Understand how to run a python program in many different ways. (Jupyter notebook vs. command line vs IDE)
I took about a month to review the Python docs, the Hitchhiker’s Guide to Python, and coding challenges on CodeSignal.
Hint: Keep an ear out for common problem-solving techniques used by programmers. (pronounced “algorithms”)
Statistics & Linear Algebra
A prerequisite for machine learning and data analysis. If you already have a solid understanding spend a week or two brushing up on key concepts.
Focus especially hard on descriptive statistics. Being able to understand a data set is a skill worth its weight in gold.
Numpy, Pandas, & Matplotlib
Learn how to load, manipulate, and visualize data. Mastery of these libraries will be crucial to your personal projects.
Quick hint: Don’t feel like you have to memorize every method or function name, that comes with practice. If you forget, Google it.
Check out the Pandas Docs, Numpy Docs, and Matplotlib Tutorials. There are better resources out there, but these are what I used.
Remember, the only way you will learn these libraries is by using them!
Machine Learning
Learn the theory and application of machine learning algorithms. Then apply the concepts you learn to real-world data that you care about.
Most beginners start by working with toy data-sets from the UCI ML Repository. Play around with the data and go through guided ML tutorials.
The Scikit-learn documentation has excellent tutorials on the application of common algorithms. I also found this podcast to be a great (and free) educational resource behind the theory of ML. You can listen to it on your commute or while working out.
Production Systems
Getting a job means being able to take real-world data and turn it into action.
To do this you will need to learn how to use a business’ computational resources to get, transform, and process data.
This is the most under-taught part of the data science curriculum. Mainly because the specific tools you use depend on the industry you are going in to.
However, database manipulation is a required skill set. You can learn how to manipulate databases with code on ModeAnalytics or Codecademy. You can also implement your own database (cheaply) on DigitalOcean.
Another (often) required skill is version control. You can acquire this skill easily by creating a GitHub account and using the command line to commit your code daily.
When considering what other technologies to learn, it is important to think about your interests and passions. For example, if you are interested in web development, then look into the tools used by companies in that industry.
Advice for executing your curriculum.
1. Concepts will come at you faster than you can learn them.
There are literally thousands of web pages and forums explaining the use of common data science tools. Because of this, it is very easy to get side-tracked while learning online.
When you start researching a topic you need to hold your goal in mind. If you don’t, you risk getting caught up in whatever catchy link draws your eye.
The solution, get a good storage system to save interesting web-resources. This way you can save material for later, and focus on the topic that is relevant to you at the moment.
If you do this right, you can make an ordered learning path that shows you what you should be focused on. You will also learn faster and avoid being distracted.
Warning, your reading list will quickly grow into the hundreds as you explore new topics that interest you. Don’t worry, this leads us to my second piece of advice.
2. Don’t stress. Its a marathon, not a sprint.
Having a self-driven education can often feel like trying to read a never-ending library of knowledge.
If you’re going to be successful in data science you need to think of your education as a lifelong process.
Just remember, the process of learning is its own reward.
Throughout your educational journey, you will explore your interests and discover more about what drives you. The more you learn about yourself, the more enjoyment you will get out of learning.
3. Learn -> Apply -> Repeat

Don’t settle for just learning a concept and then moving to the next thing. The process of learning doesn’t stop until you can apply a concept to the real world.
Not every concept needs to have a dedicated project in your portfolio. But it is important to stay grounded and remember that you are learning so you can make an impact in the world.
4. Build a portfolio, it shows others they can trust you.
When it comes down to it, skepticism is one of the biggest adversities you will face when learning data science.
This may come from others, or it may come from yourself.
Your portfolio is your way of showing the world that you are capable and confident in your own skills.
Because of this, building a portfolio is the single most important thing you can do while studying data science. A good portfolio can land you a job and make you a more confident data scientist.
Fill your portfolio with projects that you are proud of.
Did you build your own web app from scratch? Did you make your own IMDB database? Have you written an interesting data analysis of healthcare data?
Put it in your portfolio.
Just make sure write-ups are readable, the code is well documented, and the portfolio itself looks good.
This is my portfolio. A simpler method to publish your portfolio is to create a GitHub repository that includes a great ReadMe (summary page) as well as relevant project files.
Here is an aesthetically pleasing, yet simple, GitHub portfolio. For a more advanced portfolio, look into GitHub-IO to host your own free website. (example)
5. Data Science + _______ = A Passionate CareerFill in the blank.
Data science is a set of tools intended to make a change in the world. Some data scientists build computer vision systems to diagnose medical images, others traverse billions of data entries to find patterns in website user preferences.
The applications of data science are endless, that’s why it is important to find what applications excite you.
If you find topics that you are passionate about, you will be more willing to put in the work to make a great project. This leads to my favorite piece of advice in this article.
When you are learning, keep your eyes open for projects or ideas that excite you.
Once you have spent time learning, try to connect the dots. Find similarities between projects that fascinate you. Then spend some time researching industries that work on those types of projects.
Once you find an industry that you are passionate about, make it your goal to acquire the skills and technical expertise needed in that business.
If you can do this, you will be primed to turn your hard work and dedication for learning into a passionate and successful career.
0 notes
Text
How should you brainstorm?
The brainstorming stage is important to the writing process because it’s where you build the foundations for your story. I used to brainstorm by taking notes of everything I thought of, but I found that didn’t work really well for me because so many of my early ideas were just images. That got me into pinterest, which is way easier for me because it’s so visual.
But that got me thinking, does it work better for some people to brainstorm with notes vs visually, or other ways?
So you probably know that there are different types of learners. I’m a visual learner, and I think that’s why pinterest works so well for me. I had a few ideas for how other types of learners might want to brainstorm.
You probably don’t fit just under one type, so read though all the type descriptions and pick and choose the strategies that sound like they’d work for you. The important thing is to do what helps you and what feels right.
Visual learners:
You might be a visual learner like me if you picture your story ideas as images or scenes from a movie. You might also do things like color code your notes, act things out when you tell your friends stories, or picture the music video that might go along with the song you’re listening to.
If you’re a visual learner, Pinterest would probably really help you brainstorm. There are so many boards specifically for story inspiration, but there’s also a lot of photography to look into. Here is a board I like for character inspiration. It will probably also help you to color code your outline (I do mine by character, you could do yours by location or plot thread, etc.) and draw a map if you’re writing a fantasy or sci fi. Even if you’re using a real world setting, Google Earth is a great resource (psst, use streetview. Super helpful for writing about places you’re not currently in.).
Auditory learners:
You might be an auditory learner if you like to talk your ideas out loud, if you prefer to just listen during lectures, and you get a lot of your ideas from listening to music. You might also prefer audiobooks to physical books and prefer phone calls to texting.
You probably already know it helps you to talk out loud to get your ideas. However, there’s not always a person around to talk to. If that’s the case, you can use the notes function on your phone (or voice memos, or record yourself on your laptop) to dictate your ideas. Just enable dictation on the keyboard, and talk to yourself. Seriously. Something else you might like to do is make a playlist for your idea. (Spotify is good for this, but you can also just use youtube for free.) Every time you hear a song that gives you an idea for your book, add it to the playlist. Then listen to the playlist again while you’re writing.
Read-Write learners:
These people can also be called Verbal learners. If you get your ideas while reading - even just while scrolling through twitter or reading your textbooks - this might be you. You probably prefer to take notes than just listen, and you might get lost if you’re listening to rather than reading a story.
If this is you, I suggest you stick by the age-old author advice to keep a notebook on you at all times. You can use a free app like Evernote or a purchasable software like Scrivener to organize your notes, or you can just write them down by hand, old-fashioned style. You might also find mind maps useful, or plotting worksheets like this one. Even if you’re not a plotter, I’d advise you to keep a brain dump document to write down your ideas so you can go back and find them later.
Kinesthetic learners:
If you consider yourself a hands-on person, you don’t like following directions, and/or you think trial and error is the best way to figure something out, this is probably you. You might also be a slow decision-maker and prefer real life scenarios over abstract thinking.
You probably need something you can physically manipulate to help your brainstorming, like a bulletin board. Write all your ideas on sticky notes or notecards and put them up, so you can move them around and see how they might best fit together. I’d also encourage you not to plot your book in too much detail, and don’t worry if you end up needing to edit as you go. Despite what people say, you won’t literally summon the spirit of satan to your room if you change something you wrote before it’s done. I promise.
Remember that you probably don’t fit perfectly under one heading, so it’s important to try out several strategies in combination to find what works for you. I’m visual and kinesthetic, so I have pinterest boards and I write my scenes out of order. The way you brainstorm can also vary project to project, so do what feels natural and don’t hold yourself to doing the same thing every time.
Good luck and (the most important part) have fun as you brainstorm!
3 notes
·
View notes
Text
Guide to Core Web Vitals for SEOs and Developers
Core Web Vitals, or just Web Vitals, are a new set of performance metrics that help highlight aspects of web page development that affect User Experience (UX): page loading, interactivity, and visual stability. Google is set to make Core Web Vitals ranking factors as part of the Page Experience Update some time in 2021.
The metrics center on when certain events complete, including what is interactive or visually affected as these events take place while pages load until a point of stability relative to user experience. That means score values can change as users interact with your page. You achieve better scores when events occur faster along stop-watch time intervals.
Performance metrics for each Web Vital statistic is graded according to three outcomes:
Good (passes)
Needs Improvement
Fail
The current metrics are:
Largest Contentful Paint (LCP). The time interval between the start of a page load to when the largest image or text block in a user’s viewport is fully rendered. You might see the score change as your page loads and when content is visible but the largest node is still in the backlog yet to be displayed, which gets more noticeable on throttled connection speeds.
First Input Delay (FID). The amount of time it takes for a page to be ready for user interactivity, meaning that as pages are assembling how long does it take for the page to respond to clicks, scrolls, or keyboard input processing their corresponding event handlers. User interaction can be significantly delayed by main thread-blocking script tasks.
Cumulative Layout Shift (CLS). The measured distance and fraction of the viewport which shifts due to DOM manipulation or the lack of dimension attributes for major media elements. When we fail to define the dimensions for our hero images, for example, text on our pages first appears only to disruptively get displaced, causing a major content layout “shift” for our users.
Long-time users of PageSpeed Insights (PSI) may be familiar with similar metrics, many of which are going to stick around, but maybe not all of them will. Core Web Vitals represent a culmination of these other metrics and come out of the Developer Experience complexity with them. The simplicity of Web Vitals are meant to cut through the noise for welcomed clarity and fewer, grander metrics to follow.
Google plans to limit updates to annual Web Vitals version releases in order to prevent the goal posts from moving too frequently for site developers and SEO Companys. But expect Google to add new metrics over time. It looks like the next addition is going to measure page animations, but that metric is under development and won’t be introduced this year, for example.
How to analyze mobile and desktop Web Vitals scores
You get independent Web Vitals scores between mobile (phone) devices or desktop / laptop. In some tools you can specify which device category for running a query or test, and you can switch between them when both are available in a tool like Google PageSpeed Insights. PageSpeed Insights defaults to mobile stats, so you’ll need to switch to the desktop tab in order to see the difference in a page’s scores.
Google has added Core Web Vitals metrics to Search Console reporting when Chrome User Experience data is available. If you’re accessing Web Vitals scores within Search Console then the dashboard displays both device categories with scores across URLs covered by your indexing. You can drill down into groups of pages that are indicated as having problems.
Google exposes field data from over 18 million websites that have tallied enough stats to report Web Vitals as part of its Chrome User Experience Report (CrUX). The data is housed at Google’s BigQuery service where you can query historical stats from these websites going back several years. Updates are ongoing and available the second Tuesday of each month following the accumulated stats.
In order to see mobile and desktop scores using the new CrUX report, you’ll need ‘phone’ or ‘desktop’ as device form factors in your SQL statements. Interestingly, ‘mobile’ doesn’t work and ‘tablet’ works only rarely for the scarcity of the specified data. Google is sticking with a phone, tablet, or desktop form factor device classification in these data.
Tablet data can be seen in queries for the Google origin (domain), for example, but you aren’t going to see it for sites that are much less busy.
Understanding lab vs. field data
Conditions can result in wildly varying scores, and scores can literally change as you navigate pages. It’s important to understand how each score is tabulated, given a certain environment.
You can only truly interpret results after you first determine whether you’re looking at lab or field data. Web Vitals “lab” data are collected via browser API as part of page load event timers and mathematical approximations simulating user interactivity, whereas “field” data is made up of the same metrics collected from actual user experiences navigating your pages by transmitting those event timer values to a repository.
Lab data. Both SEO Company practitioners and developers can access lab data in real-time using PSI, WebPageTest, Chrome Dev Tools, and through a new ‘Web Vitals’ Chrome browser extension. PSI and WebPageTest tallies your scores from page load events and approximates page interactivity delays by counting up thread-blocking script task timings.
Lab data tools are incredibly useful in your workflow for reporting and ultimately improving scores. These should make up part of your TechSEO Company arsenal. For developers, if only a handful of templates power your website, then these lab data may be all that you regularly need unless you start seeing problems in field data catching you off-guard.
You can introduce the Web Vitals JavaScript library to your workflow and testing pipeline. Available via CDN, the library (less than 1k) can be included in production HTML and written to transmit independently gathered field data to where you want to collate them for reports. Example code demonstrates how to do so for transmitting scores to Google Analytics.
Lighthouse also comes with various access points which can be useful in your development workflow and it includes several additional tests that can help ensure your adherence to modern web standards. Lighthouse can help you debug situations where you are troubleshooting Web Vitals problems.
Comparing lab results with field data. Modern browsers beginning with Chrome measure how users actually experience your website in the wild via builtin JavaScript APIs. You can access these with plain old JavaScript, or choose one of Google’s libraries modified to suit your requirements. Google collects and, as noted, exposes field data from Chrome users with its CrUX report using the same browser APIs.
There are a few different ways to access or visualize CrUX data. You can utilize connectors from BigQuery output to other Google services for generating dashboards, such as a prebuilt connector for DataStudio.
It’s easier to access CrUX field data by verifying ownership of your website with Google Search Console where the dashboard displays it in an interface which allows you to drill down by clicking instead of having to write SQL queries.
Alternatively, you can simply use PSI which provides you data going back 28 days if they’ve got it. The API which drives that spot check recency report also has an independent open source JavaScript library that you can use to bring the data into your project. It serves as a standalone library where, for demonstration purposes, a developer already created a slick frontend app for it.
Troubleshooting Web Vitals reporting
Due to the dynamic nature of some of the timings, and how they’re collected, you’re always going to need to verify lab data with correlating field data and debug discrepancies. For example, subsequent page loads can vary your result values when using the Web Vitals Extension.
This can happen for a couple of reasons.
Your browser is able to assemble resources faster on refresh by virtue of utilizing its own cache reserve. Additionally, the extension is able to accumulate interactive values as you navigate the page in a way that is useful for approximating real-world field data rather than calculating a score by adding up thread-blocking script task timings.
For more accurate local results using the Web Vitals Extension and Chrome Dev Tools remember to empty your cache data or bypass it with shift-refresh when moving fast with the web browser in your workflow. Another tip is to load ‘about:blank’ before starting a performance recording session in Dev Tools for a clean start to the report.
Ideally, lab and field scores don’t differ too much without a good reason. Whenever you make significant changes, your lab results are going to be ahead of your field data. That means if you see failing tests in the field, and you’ve improved lab scores to pass, you either need to be patient for field data to catch up or push field data independently to Analytics to verify it.
You might imagine the trickiest field data score to emulate locally would be CLS. This isn’t necessarily the case. You can set an option to stick an overlay of Web Vitals using the Chrome Extension where when you interact with the page you can watch score changes as you navigate.
This works for FID as well. The FID score starts empty. Once with the first page interaction (click, scroll, or keyboard input) the timings of thread-blocking tasks are added to that moment which becomes your score.
Finally, the highly detailed information in Chrome Dev Tools lets you troubleshoot CLS to a fine-grained level with performance recording and playback. Look for the “Experience” section that outputs CLS shifts in the recording. There is also a setting for highlighting shifts in the display using a blue flash that wraps elements as they shift and add to your score.
Tool time
PageSpeed Insights. Your first stop measuring Web Vitals should be PageSpeed Insights. You get both lab data and field data (when available) in one report. You also get several other metrics largely related to improving failing pages, particularly findings that affect the speed of a page and downloading its assets.
Web Vitals Chrome Extension. Using the Chrome extension you can access Web Vitals on page load, and as discussed, you can interact with the page to troubleshoot in case you have First Input Delay and or Content Layout Shift problems. It’s also available to you page-to-page as you browse websites.
WebPageTest. Using this independent testing tool you can configure your approach with a variety of conditions. Built by Google engineers who are part of the Chromium team, the information is as authoritative as anything you get from Google itself and makes RESTful APIs available.
Google Search Console. If you haven’t already verified ownership of your website to use Google Search Console, then you should go and do so for help drilling down into problem areas with pages that are failing out in the field assuming you are showing in CrUX. You can drill down to locate groups of pages with similar problems, ultimately it links you to PageSpeed Insights.
Web Vitals JavaScript APIs. Use JavaScript to access the metrics directly from the browser and transmit them to a repository of your choice. Alternatively, you can introduce the test to your development process and ensure that changes you make aren’t going to negatively affect your scores after you push to production.
Chrome Dev Tools. Chrome itself provides the ultimate set of tools for discovering or tracing back problems using the highly detailed information available in reports and page load recordings in the Performance tab. The extensive array of tools and endless switches or options is ideal for the most exacting optimization work.
About The Author
Detlef Johnson is the SEO Company for Developers Expert for Search Engine Land and SMX. He is also a member of the programming team for SMX events and writes the SEO for Developers series on Search Engine Land. Detlef is one of the original group of pioneering webmasters who established the professional SEO Company field more than 20 years ago. Since then he has worked for major search engine technology providers, managed programming and marketing agency teams for Chicago Tribune, and consulted for numerous entities including Fortune 500 companies. Detlef has a strong understanding of Technical SEO Company and a passion for Web programming.
Website Design & SEO Delray Beach by DBL07.co
Delray Beach SEO
source http://www.scpie.org/guide-to-core-web-vitals-for-seos-and-developers/ source https://scpie1.blogspot.com/2020/07/guide-to-core-web-vitals-for-seos-and.html
0 notes
Text
Guide to Core Web Vitals for SEOs and Developers
Core Web Vitals, or just Web Vitals, are a new set of performance metrics that help highlight aspects of web page development that affect User Experience (UX): page loading, interactivity, and visual stability. Google is set to make Core Web Vitals ranking factors as part of the Page Experience Update some time in 2021.
The metrics center on when certain events complete, including what is interactive or visually affected as these events take place while pages load until a point of stability relative to user experience. That means score values can change as users interact with your page. You achieve better scores when events occur faster along stop-watch time intervals.
Performance metrics for each Web Vital statistic is graded according to three outcomes:
Good (passes)
Needs Improvement
Fail
The current metrics are:
Largest Contentful Paint (LCP). The time interval between the start of a page load to when the largest image or text block in a user’s viewport is fully rendered. You might see the score change as your page loads and when content is visible but the largest node is still in the backlog yet to be displayed, which gets more noticeable on throttled connection speeds.
First Input Delay (FID). The amount of time it takes for a page to be ready for user interactivity, meaning that as pages are assembling how long does it take for the page to respond to clicks, scrolls, or keyboard input processing their corresponding event handlers. User interaction can be significantly delayed by main thread-blocking script tasks.
Cumulative Layout Shift (CLS). The measured distance and fraction of the viewport which shifts due to DOM manipulation or the lack of dimension attributes for major media elements. When we fail to define the dimensions for our hero images, for example, text on our pages first appears only to disruptively get displaced, causing a major content layout “shift” for our users.
Long-time users of PageSpeed Insights (PSI) may be familiar with similar metrics, many of which are going to stick around, but maybe not all of them will. Core Web Vitals represent a culmination of these other metrics and come out of the Developer Experience complexity with them. The simplicity of Web Vitals are meant to cut through the noise for welcomed clarity and fewer, grander metrics to follow.
Google plans to limit updates to annual Web Vitals version releases in order to prevent the goal posts from moving too frequently for site developers and SEO Companys. But expect Google to add new metrics over time. It looks like the next addition is going to measure page animations, but that metric is under development and won’t be introduced this year, for example.
How to analyze mobile and desktop Web Vitals scores
You get independent Web Vitals scores between mobile (phone) devices or desktop / laptop. In some tools you can specify which device category for running a query or test, and you can switch between them when both are available in a tool like Google PageSpeed Insights. PageSpeed Insights defaults to mobile stats, so you’ll need to switch to the desktop tab in order to see the difference in a page’s scores.
Google has added Core Web Vitals metrics to Search Console reporting when Chrome User Experience data is available. If you’re accessing Web Vitals scores within Search Console then the dashboard displays both device categories with scores across URLs covered by your indexing. You can drill down into groups of pages that are indicated as having problems.
Google exposes field data from over 18 million websites that have tallied enough stats to report Web Vitals as part of its Chrome User Experience Report (CrUX). The data is housed at Google’s BigQuery service where you can query historical stats from these websites going back several years. Updates are ongoing and available the second Tuesday of each month following the accumulated stats.
In order to see mobile and desktop scores using the new CrUX report, you’ll need ‘phone’ or ‘desktop’ as device form factors in your SQL statements. Interestingly, ‘mobile’ doesn’t work and ‘tablet’ works only rarely for the scarcity of the specified data. Google is sticking with a phone, tablet, or desktop form factor device classification in these data.
Tablet data can be seen in queries for the Google origin (domain), for example, but you aren’t going to see it for sites that are much less busy.
Understanding lab vs. field data
Conditions can result in wildly varying scores, and scores can literally change as you navigate pages. It’s important to understand how each score is tabulated, given a certain environment.
You can only truly interpret results after you first determine whether you’re looking at lab or field data. Web Vitals “lab” data are collected via browser API as part of page load event timers and mathematical approximations simulating user interactivity, whereas “field” data is made up of the same metrics collected from actual user experiences navigating your pages by transmitting those event timer values to a repository.
Lab data. Both SEO Company practitioners and developers can access lab data in real-time using PSI, WebPageTest, Chrome Dev Tools, and through a new ‘Web Vitals’ Chrome browser extension. PSI and WebPageTest tallies your scores from page load events and approximates page interactivity delays by counting up thread-blocking script task timings.
Lab data tools are incredibly useful in your workflow for reporting and ultimately improving scores. These should make up part of your TechSEO Company arsenal. For developers, if only a handful of templates power your website, then these lab data may be all that you regularly need unless you start seeing problems in field data catching you off-guard.
You can introduce the Web Vitals JavaScript library to your workflow and testing pipeline. Available via CDN, the library (less than 1k) can be included in production HTML and written to transmit independently gathered field data to where you want to collate them for reports. Example code demonstrates how to do so for transmitting scores to Google Analytics.
Lighthouse also comes with various access points which can be useful in your development workflow and it includes several additional tests that can help ensure your adherence to modern web standards. Lighthouse can help you debug situations where you are troubleshooting Web Vitals problems.
Comparing lab results with field data. Modern browsers beginning with Chrome measure how users actually experience your website in the wild via builtin JavaScript APIs. You can access these with plain old JavaScript, or choose one of Google’s libraries modified to suit your requirements. Google collects and, as noted, exposes field data from Chrome users with its CrUX report using the same browser APIs.
There are a few different ways to access or visualize CrUX data. You can utilize connectors from BigQuery output to other Google services for generating dashboards, such as a prebuilt connector for DataStudio.
It’s easier to access CrUX field data by verifying ownership of your website with Google Search Console where the dashboard displays it in an interface which allows you to drill down by clicking instead of having to write SQL queries.
Alternatively, you can simply use PSI which provides you data going back 28 days if they’ve got it. The API which drives that spot check recency report also has an independent open source JavaScript library that you can use to bring the data into your project. It serves as a standalone library where, for demonstration purposes, a developer already created a slick frontend app for it.
Troubleshooting Web Vitals reporting
Due to the dynamic nature of some of the timings, and how they’re collected, you’re always going to need to verify lab data with correlating field data and debug discrepancies. For example, subsequent page loads can vary your result values when using the Web Vitals Extension.
This can happen for a couple of reasons.
Your browser is able to assemble resources faster on refresh by virtue of utilizing its own cache reserve. Additionally, the extension is able to accumulate interactive values as you navigate the page in a way that is useful for approximating real-world field data rather than calculating a score by adding up thread-blocking script task timings.
For more accurate local results using the Web Vitals Extension and Chrome Dev Tools remember to empty your cache data or bypass it with shift-refresh when moving fast with the web browser in your workflow. Another tip is to load ‘about:blank’ before starting a performance recording session in Dev Tools for a clean start to the report.
Ideally, lab and field scores don’t differ too much without a good reason. Whenever you make significant changes, your lab results are going to be ahead of your field data. That means if you see failing tests in the field, and you’ve improved lab scores to pass, you either need to be patient for field data to catch up or push field data independently to Analytics to verify it.
You might imagine the trickiest field data score to emulate locally would be CLS. This isn’t necessarily the case. You can set an option to stick an overlay of Web Vitals using the Chrome Extension where when you interact with the page you can watch score changes as you navigate.
This works for FID as well. The FID score starts empty. Once with the first page interaction (click, scroll, or keyboard input) the timings of thread-blocking tasks are added to that moment which becomes your score.
Finally, the highly detailed information in Chrome Dev Tools lets you troubleshoot CLS to a fine-grained level with performance recording and playback. Look for the “Experience” section that outputs CLS shifts in the recording. There is also a setting for highlighting shifts in the display using a blue flash that wraps elements as they shift and add to your score.
Tool time
PageSpeed Insights. Your first stop measuring Web Vitals should be PageSpeed Insights. You get both lab data and field data (when available) in one report. You also get several other metrics largely related to improving failing pages, particularly findings that affect the speed of a page and downloading its assets.
Web Vitals Chrome Extension. Using the Chrome extension you can access Web Vitals on page load, and as discussed, you can interact with the page to troubleshoot in case you have First Input Delay and or Content Layout Shift problems. It’s also available to you page-to-page as you browse websites.
WebPageTest. Using this independent testing tool you can configure your approach with a variety of conditions. Built by Google engineers who are part of the Chromium team, the information is as authoritative as anything you get from Google itself and makes RESTful APIs available.
Google Search Console. If you haven’t already verified ownership of your website to use Google Search Console, then you should go and do so for help drilling down into problem areas with pages that are failing out in the field assuming you are showing in CrUX. You can drill down to locate groups of pages with similar problems, ultimately it links you to PageSpeed Insights.
Web Vitals JavaScript APIs. Use JavaScript to access the metrics directly from the browser and transmit them to a repository of your choice. Alternatively, you can introduce the test to your development process and ensure that changes you make aren’t going to negatively affect your scores after you push to production.
Chrome Dev Tools. Chrome itself provides the ultimate set of tools for discovering or tracing back problems using the highly detailed information available in reports and page load recordings in the Performance tab. The extensive array of tools and endless switches or options is ideal for the most exacting optimization work.
About The Author
Detlef Johnson is the SEO Company for Developers Expert for Search Engine Land and SMX. He is also a member of the programming team for SMX events and writes the SEO for Developers series on Search Engine Land. Detlef is one of the original group of pioneering webmasters who established the professional SEO Company field more than 20 years ago. Since then he has worked for major search engine technology providers, managed programming and marketing agency teams for Chicago Tribune, and consulted for numerous entities including Fortune 500 companies. Detlef has a strong understanding of Technical SEO Company and a passion for Web programming.
Website Design & SEO Delray Beach by DBL07.co
Delray Beach SEO
source http://www.scpie.org/guide-to-core-web-vitals-for-seos-and-developers/ source https://scpie.tumblr.com/post/624316935884144640
0 notes