#additional tag/s: this js so bad
Explore tagged Tumblr posts
Text
oomf on twitter said the original drawing (by puke) made sano looks like tteokbokki (korean rice cake),
#boyfriend to death#btd art#btd fanart#btd sano#sano kojima#monster boy#boyfriend to death sano#333noxh#additional tag/s: this js so bad#boo tomato tomato tomato
200 notes
·
View notes
Text
i can fix him
ft. itoshi sae, itoshi rin, chigiri hyoma, nagi seishiro, sendo shuto, and noel noa (gn!reader)
— ‘i dont like your tone'
genre(s). comedy n a little angst ig?? BUT ITS NOT THAT BAD LIKE I MEAN IT IS A SHEYFU CHAT AU SO 😁😁😁😁
cw. I DONT REMEMBER WAHT I WROTE BUT IF THERES SWEARING THEN THATS THE CW LMAOOO LOVE U ALL + possibly triggering or offensive phrases so if u find some fo those please dont hesitate to tell me!! oh! and very ooc HAUHAHAHAH
note. this has been sitting in my drafts for like 2 weeks HAHAHA ENJOY AND HOPEFULLY MORE SMAUS TO COME (ALSO i put rin and sae's and nagi and sendo's parts tgt for layout purposes!! OFC THEIR CONCEPTS ARE DIFFERENT YUP THASTS IT ENJOY MWAMWAMWAMW) (also im so sorry for the bad quality wherein bad quality may or may nmot be referring to the writing in addition to the image quality KLPLLOKASIDJASUDHU)












tagging: @whatisnureotypical, @itoshivy, @lalaufey, @levihanmyotp (AYRA IDK IF U STILL WANNA GET TAGGED BUT IM TAGGING U ANW JS TELL ME IF DONT WANNA LUV U MWWAWMAWMAWM)
🐈⬛: thank you for reading! reblogs, comments, and likes are very much appreciated!
if you'd like to be part of my taglist, please access the gform below! thank you and hope to see you there <3
© sheyfu on tumblr
#🐈⬛️.chatroom#⚽.blue lock#blue lock#bllk#blue lock smau#bllk smau#itoshi sae#itoshi sae x reader#itoshi rin#itoshi rin x reader#chigiri hyoma#chigiri hyoma x reader#nagi seishiro#nagi seishiro x reader#sendo shuto#sendo shuto x reader#noel noa#noel noa x reader#blue lock x reader#bllk x reader
880 notes
·
View notes
Text
For My Hopeless Night
read it on AO3 at https://archiveofourown.org/works/51638359 by Golgoth4sTerror I used an ai poem generator for the title so... (it fits tho) dont expect much. If you have read my old "works", I'm sorry, they are terrible. My writing style is extremaly different now. This has inspiration in an old work of mine (remake but different fandom) that I marked as annonymous. (It isnt that bad but its not good either) {Still working on a summary} Words: 38, Chapters: 1/20, Language: English Fandoms: Undertale (Video Game) Rating: Mature Warnings: Graphic Depictions Of Violence, Major Character Death Categories: F/F, M/M, Other Characters: Sans (Undertale), Dreamtale Nim (Undertale), Nightmare Gang (Undertale) Relationships: Sans (Undertale)/Original Character(s), Sans/Sans (Undertale) Additional Tags: Undertale Alternate Universes, Alternate Universe - No Powers, Alternate Universe - Modern Setting, Alternate Universe - Humantale (Undertale), Dreamtale Sans | Dream (Undertale), Dreamtale Sans | Dream Needs a Hug (Undertale), Poor Dreamtale Sans (Undertale), Implied/Referenced Child Abuse, Implied/Referenced Rape/Non-con, Implied/Referenced Self-Harm, Implied/Referenced Suicide, Implied/Referenced Sexual Assault, Past Child Abuse, Child Neglect, Dreamtale Nightmare Sans (Undertale), Error Sans (Undertale) - Freeform, _____tale Sans | Ink (Undertale), Killer Sans (Undertale) - Freeform, Xtale Sans | Cross (Undertale), Mommy Issues, No Smut, Hurt No Comfort, Maybe - Freeform, it may have comfort at some point tho, idk yet, Cute Dreamtale Sans | Dream (Undertale), Dreamtale Sans | Dream (Undertale) Centric, Dreamtale Sans | Dream (Undertale) Uses They/Them, Nonbinary Character, Nonbinary Dreamtale Sans | Dream (Undertale), Bad Sanses | Nightmare's Gang (Undertale), Sad Ending, Dreamtale Sans | Dream (Undertale) Has Mommy Issues, Diary/Journal, Chapters are short, cuz i wanna upload atleast once a week, Tags May Change, Tags Are Hard, Underswap Sans (Undertale), Dreamtale Sans | Dream/XTale Sans | Cross (Undertale), Dreamtale Sans | Dream/_____tale Sans | Ink (Undertale), Dreamtale Sans | Dream/Error Sans (Undertale), Dreamtale Sans | Dream/Killer Sans (Undertale), Dreamtale Sans | Dream/Underswap Sans (Undertale), dream isnt a sans, thats why it says 'sans/og' not 'sans/sans', i put both tags but, i js wanna explain, How Do I Tag, I'm Bad At Tagging read it on AO3 at https://archiveofourown.org/works/51638359
1 note
·
View note
Text
all your friends are so cool you go out every night.
by tuvwxyzfics yeah. life was great for miya sakurayashiki. so great he almost forgot the main reason his summer had become such a drag. but the universe felt the need to remind him exactly what the problem was in the first place. a tuft of brown hair came strolling into his peripheral. normally he’d ignore this on any day but currently he had nothing but time to do whatever caught his eye so when the patch of hair came close enough to pass the gate and make his face visible it was when miya froze up. there stood takashi. his friends kenchi and soutaro were close behind, all three with skateboards in hand clearly ready to enjoy themselves, probably here to relearn how to skate. who was miya to care? takashi made it clear he didn’t want to be associated with a delinquent or whatever his new vision of miya was after that dreaded night at s. - part 2 of 'Jealousy' Words: 2780, Chapters: 1/1, Language: English Series: Part 2 of miya and takashi are both horrible at feelings Fandoms: SK8 the Infinity (Anime) Rating: General Audiences Warnings: Creator Chose Not To Use Archive Warnings, No Archive Warnings Apply Categories: M/M Characters: Chinen Miya, Takashi (SK8 the Infinity), Original Characters, Kyan Reki, Hasegawa Langa, Nanjo Kojiro | Joe, Sakurayashiki Kaoru | Cherry Blossom, Higa Hiromi | Shadow Relationships: Chinen Miya/Takashi, Chinen Miya & Takashi, Takashi & Original Characters, Chinen Miya & Kyan Reki, Chinen Miya & Hasegawa Langa & Higa Hiromi & Kyan Reki & Nanjo Kojiro & Sakurayashiki Kaoru, Minor or Background Relationship(s), Nanjo Kojiro | Joe/Sakurayashiki Kaoru | Cherry Blossom, Hasegawa Langa/Kyan Reki Additional Tags: Developing Friendships, Takashi is bad at feelings, miya is bad at feelings, on the other hand reki langa and joe are great at them, Skateboarding, Fluff, Jealousy, Song: jealousy jealousy (Olivia Rodrigo), continuation fic, u don't haveee to read the first one to understand this one, but it wont rlly make sense, Not Beta Read, lowercase is intentional, Author Is Sleep Deprived, The Author Regrets Everything, The Author Regrets Nothing, btw cherry and joe adopted miya, did his parents die or divorce and js abandon their kid u can decide, ooc takashi, Maybe - Freeform, how are we supposed to know what he acts like, hes a BACKGROUND CHARACTER, he's characterized as I want, slice of life turned into police chase, slice of life wins source https://archiveofourown.org/works/64133683
#IFTT#fanfic#ao3feed#matcha blossom#matchablossom#ao3feed-matchablossom#sk8 the infinity#sk8 joe#sk8 cherry
0 notes
Text
Until time is up
read it on AO3 at https://ift.tt/5Gz4r3E by Crybaby_Miyoko Lol this is my first book I work on its probably going to be little bad but it's ok so js enjoy!┆︴ it's about how time won't tell them have there happy ending, he loves him but it's to the same, every time he go back, the other person fell like he get deja vu and slowly falls in love with him, but every time something is happening to him and make time go back, before it happens. Words: 823, Chapters: 1/1, Language: English Fandoms: Alien Stage (Web Series) Rating: Not Rated Warnings: Graphic Depictions Of Violence Categories: Gen Characters: Ivan (Alien Stage), Till (Alien Stage), Sua (Alien Stage), Mizi (Alien Stage), Hyuna (Alien Stage), Hyun-Woo (Alien Stage), Luka (Alien Stage) Relationships: Ivan/Till (Alien Stage), Mizi/Sua (Alien Stage), Hyuna & Hyun-Woo (Alien Stage), Hyuna & Hyun-Woo & Luka (Alien Stage), Hyuna/Luka (Alien Stage), Ivan & Sua (Alien Stage), Sua & Till (Alien Stage), Hyuna & Till (Alien Stage), Ivan & Luka (Alien Stage) Additional Tags: Original Character(s), Angst with a Happy Ending, Smut, Fluff and Smut, Everybody Lives, Everyone Needs A Hug, Time Travel, Time Travel Fix-It, Sad with a Happy Ending, Top Ivan (Alien Stage), Bottom Till (Alien Stage), Ivan and Sua are Siblings (Alien Stage), Mentioned Sua (Alien Stage), Till Realizes Feelings For Ivan (Alien Stage), Omega Till (Alien Stage), Alpha/Beta/Omega Dynamics, Alpha/Omega, Alpha/Beta, Alpha Ivan (Alien Stage), Ivan Has a Big Dick (Alien Stage), Alpha Mizi (Alien Stage), Mentioned Mizi (Alien Stage), Top Hyuna (Alien Stage), Mentioned Hyuna (Alien Stage), Bottom Luka (Alien Stage), Top Luka (Alien Stage), Bottom Hyun-Woo (Alien Stage), Mentioned Hyun-Woo (Alien Stage) read it on AO3 at https://ift.tt/5Gz4r3E
0 notes
Text
Damn you vestige see-er!
damn you vestige see-er! by anarex
In which Banjo figures out he can move things, he and the rest of the vestiges take this as an opportunity to haunt Class 1A. They're having fun until someone with a ghost seeing quirk appears. Which makes them make up a story to prevent One for All spilling out! But even so, they'll try to have fun anyways!
or
Vestiges haunt Class 1A and chaos ensues.
Words: 1415, Chapters: 1/1, Language: English
Fandoms: 僕のヒーローアカデミア | Boku no Hero Academia | My Hero Academia (Anime & Manga)
Rating: Teen And Up Audiences
Warnings: No Archive Warnings Apply
Categories: Gen
Characters: Midoriya Izuku, Past One For All Users, Class 1-A, Aizawa Shouta | Eraserhead, Original Characters
Relationships: Midoriya Izuku & Past One For All Users, Class 1-A & Past One For All Users, Class 1-A & Original Character(s)
Additional Tags: One For All Quirk Haunted by Past One For All Users' Ghosts, Haunting, Crack Treated Seriously, Fluff and Crack, Found Family, Past One For All Users as Family, Paranormal Liberation War Arc Never Happened, Rated T for swearing, third user has beef with katsuki bakugo, Let Midoriya Izuku Swear, ofa users hauntings get ruined by someone who can see ghosts & make other people see the ghosts, ofa users make up a story to prevent ofa being revealed, second user and yoichi r boyfriends but that isnt mentioned in the story i js need to say it, I'm Bad At Tagging, ill get better someday, out of character maybe
Read Here: https://archiveofourown.org/works/44989672
5 notes
·
View notes
Text
There's Monsters Behind Every Corner
read it on the AO3 at https://ift.tt/3vpvNOg
by hellamybellamy
There are two sides to every coin, every story, and every face. Tooru Oikawa never imagined two sides to a world he thought he knew intimately.
21-year-old Tooru lives a boring, routined life, or so he has since he left home to attend college. Now a college junior, he vows to avoid his father for the rest of his life, but his father's sudden disappearance prompts Tooru to ignore his grudge, just this once. Tooru assumes there's a rational explanation for Daiki Oikawa's three-week absence, but he soon discovers everything he thought he knew about himself, his father, and the world were lies. Nothing is as it seems- and Daiki Oikawa was hiding an entire closet of secrets.
Tooru is abruptly tossed into a new world called the Outside, a mirroring universe of Tooru's hometown. Here, society is dominated by supernatural creatures ranging from second-rate shifters to graveyard-loitering ghouls. And for some reason, his father is here somewhere running amuck. Tooru is to find his father, escape the notice of the Outside's cutthroat, tyrannical government, and uncover a way to seal the gate between the Outside and Tooru's home once and for all before a lunatic werewolf named Iwaizumi manages to jump worlds.
Words: 6878, Chapters: 1/35, Language: English
Fandoms: Haikyuu!!
Rating: Mature
Warnings: Graphic Depictions Of Violence, Rape/Non-Con
Categories: M/M
Characters: Oikawa Tooru, Iwaizumi Hajime, Kuroo Tetsurou, Bokuto Koutarou, Akaashi Keiji, Kozume Kenma, Daishou Suguru, Hinata Shouyou, Kageyama Tobio, Sawamura Daichi, Sugawara Koushi, Azumane Asahi, Shimizu Kiyoko, Yachi Hitoka, Nishinoya Yuu, Tanaka Ryuunosuke, Miya Atsumu, Miya Osamu, Sakusa Kiyoomi, Ushijima Wakatoshi, Matsukawa Issei, Hanamaki Takahiro, Kunimi Akira, Kindaichi Yuutarou, Basically every character shows up at one point but these are the ones important to the plot :P
Relationships: Iwaizumi Hajime/Oikawa Tooru, Kuroo Tetsurou & Oikawa Tooru, Akaashi Keiji/Kuroo Tetsurou, Sawamura Daichi/Sugawara Koushi, Daishou Suguru & Oikawa Tooru, Miya Atsumu & Oikawa Tooru
Additional Tags: Alternate Universe - Urban Fantasy, Alternate Universe - Canon Divergence, Alternate Universe - Vampire, Alternate Universe - Werewolf, Blood and Violence, Minor Character Death, Aged-Up Character(s), Blood, Blood and Injury, Blood and Gore, Blood Drinking, Threats of Violence, Angst and Hurt/Comfort, Enemies to Friends to Lovers, Hate Sex, Parallel Universes, Crossing Parallels, Supernatural Elements, Ghouls, Fist Fights, Romance, Some characters might be a little freeform js, also this is my first haikyuu fanfic so pls be gentle, Not Beta Read, we die like fucking men, I'm bad at summaries so pls don't judge me :(, I had this idea originally for ocs only so the setting is in America
read it on the AO3 at https://ift.tt/3vpvNOg
2 notes
·
View notes
Text
Kindly Myers Lives Up To Her ‘Professional Smokeshow’ Status In Revealing White Bikini
Kindly Myers showed off her killer figure for her loyal Instagram followers in a sexy, white-knit bikini. As fans of the model know, Myers has been putting on a sexy display in recent weeks while showing off her sculpted figure in a variety of different bikinis. Earlier today, the smokeshow added another revealing shot to her feed while clad in some seriously sexy swimwear.
In the shot, the model struck a pose in profile, leaning against a big, wooden beam under what looked like a tiki hut. The “Professional Smokeshow” looked down to the ground, showing off a beautiful application of makeup that included purple eyeshadow, mascara, blush, highlighter, and light pink lipgloss. She wore her long, highlighted locks down and slightly messy, wearing the part off to the side.
The model showed off her world-famous figure in a sexy knit top that dipped low into her chest, offering generous views of sideboob. The scandalous bottoms featured floss-like sides and tucked into her derriere, showing off her round booty as well as her tanned stems. In the caption of the post, she tagged her photographer while also tagging Swimsuit USA, crediting them for the swimwear. The photo has only been live on her page for four short hours but it’s already earning her a ton of attention from fans.
So far, the photo has garnered over 13,000 likes in addition to well over 200 comments and that number only continues to climb. Many of Myers’ fans took to the shot to rave over her gorgeous figure while countless others were left speechless and opted to use emoji instead of words. A few more simply dropped a line to let her know that they are big fans of hers.
“Wow you look so delicious amazingly delicious sexy sexy lady I love you honey,” one Instgrammer raved.
“Never a bad pic. Always beautiful Kindly. Happy Hump Day,” a second social media user added in addition to a few red heart emoji.
“Wow this girl number one,” another commented, adding a number of flame emoji to the end of their post.
This is not the first time in recent days that the model sported some skimpy swimwear. Previously, The Inquisitr shared that the bombshell sizzled in a fiery red swimsuit. She wore the outfit unzipped in the middle, showcasing plenty of cleavage for the camera. The outfit was also high-cut to expose her killer stems and like her most recent post, that one garnered ton of attention from her loyal fans.
(function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "https://connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, "script", "facebook-jssdk")); Source link
The post Kindly Myers Lives Up To Her ‘Professional Smokeshow’ Status In Revealing White Bikini appeared first on Trends Dress.
from Trends Dress https://trendsdress.com/2020/02/19/kindly-myers-lives-up-to-her-professional-smokeshow-status-in-revealing-white-bikini/
0 notes
Text
The Apple Watch Series 5 Finally Makes The Smartwatch Feel Like A Bona Fide Timepiece
BuzzFeed News
The Apple Watch Series 5 has an always-on display that stays dim — but readable — at all times, until the wrist is raised.
I’ve been living with various models of the Apple Watch for the last four years, and with this year’s new Series 5 for the last four days. What I’ve gleaned from testing the Series 5 is that its new features — an always-on display, increased storage capacity, faster processor, free emergency calling around the world (for the cellular model only), and compass (lol) — all make the Apple Watch a more capable, independent smartwatch.
But by far the most impactful change to the Apple Watch this year has nothing to do with the Series 5 at all. Alongside the debut of the new watch, Apple dropped the price of the perfectly capable Series 3 to a more accessible $199. For people who have always considered the $400–$500 price tag prohibitively expensive, this might be a good time to finally consider getting an Apple Watch. Just not the newest one.
If you are interested in the Series 5, there’s really only one feature worth discussing: the always-on display that finally makes the Apple Watch a bona fide timepiece. Previous models required a twist or raise of the wrist to wake the device’s screen, but the display on the Series 5 always shows the time, like a watch is supposed to. While you’re typing or exercising, the display is dim but still readable. When you raise your wrist, the screen brightens.
BuzzFeed News
The Apple Watch Series 5 has an always-on display that brightens when you twist or raise your wrist.
Being able to glance at the Series 5 meant that I spent less time gesticulating my arms.
Another (positive) side effect of the always-on display is that, when the feature is turned off, there are significant battery gains. Apple claims its latest watch’s battery life is 18 hours, which my testing found to be true. With always-on disabled, the battery lasted over 21 hours (with sleep tracking!) and was still at 43% when I woke up the next day.
Despite the much-improved battery, the Apple Watch Series 5 is still not a device you can take on a multiday hiking trip, given that it needs to be charged at least every 1.5 days.
I’m sold on the Apple Watch — but not necessarily on the Series 5. Unless you prefer (and can afford) the newest model, it doesn’t make sense to pay a premium on a device that’s still very much in progress.
I got my first smartwatch, a first-generation Apple Watch, as a gift in May 2015. There was so much not to like about the Apple Watch then. The battery life barely lasted a day, the watch needed an iPhone nearby to do just about anything, and the third-party apps were an absolute mess.
Every year since, Apple has incrementally added new features to its watch: waterproofness and swim-tracking in the Series 2, cellular connectivity and a stair-tracking altimeter in the Series 3, and a built-in ECG heart rate monitor and an ever-so-slightly larger screen in the Series 4.
As someone who has patiently waited on a smartwatch — any smartwatch — to deliver on the future Inspector Gadget’s Penny promised, the Apple Watch still hasn’t quite met the mark. As my former colleague Charlie Warzel noted last year, it feels like a luxury device for a future that isn’t quite here yet.
Being able to leave my phone behind and stay connected has long been a pipe dream. But cellular plans for wearables are costly and complicated. Most carriers charge an activation fee and a monthly recurring fee for the watch — around $10, not including additional service fees, just for being able to use the mobile data you’re already paying for. Even with that added cost, streaming media over cellular data on the watch is currently limited to Apple’s own apps: Apple Music, Apple Books, and Apple Podcasts. However, Apple recently made streaming functionality for music, radio, and podcasts available to third-party developers in its latest software update, watchOS 6, so there may be more on that front soon (here’s looking at you, Spotify).
The Apple Watch’s battery is where the device needs to improve most. The Fitbit Ionic smartwatch can last up to five days — yes, DAYS — or 10 hours with GPS tracking on a single charge. The Garmin Fenix 5 lasts up to nine days or 15 hours in GPS mode. The Apple Watch’s battery can last up to merely 18 hours, and just six hours (or five hours with LTE I’m on) with GPS tracking.
And yet, despite its shortcomings, I’ve worn an Apple Watch almost every day for the past four years. It is, in my opinion, the best smartwatch for people with iPhones. There’s no doubt that the Apple Watch allows me to interact with my phone less (again, a good thing). I listen to podcasts every morning during my bike or bus ride to work, and being able to control the volume or pause/play the audio without taking out my phone is wonderful. As someone who is constantly running a little late, the ability to add custom messages as one-tap replies is killer. (Mine is: “Running behind! Be right there.”) One of my watch’s most frequently tapped features is pinging my iPhone when I can’t find it.
BuzzFeed News
An Apple Watch Series 3 with cellular service can make and receive calls when your iPhone isn’t nearby.
But the primary reason why, after rigorously testing various Garmins and Fitbits, I prefer the Apple Watch is because it meets the very specific tracking needs of someone who works out outdoors and it doesn’t look like a clunky black box in the way other fitness wearables often do. The Apple Watch is surprisingly elegant for a GPS watch that can track biking, running, and open water swimming. Devices that can track all three of those activities typically look like they’re made for Men Who Do Triathlons. Not a bad thing! But not great if you have tiny wrists and want to wear the watch with regular clothes too, not just aerodynamic sportswear.
In fact, the Apple Watch is a pretty decent fitness tracker and training tool. One of my favorite (free!) apps is Nike Run Club, which has a number of guided runs available to download offline on the watch. You can leave your phone at home, connect Bluetooth headphones to the watch, and listen as a coach helps you work through different running distances. I also like to use Strava to record my bike rides and MySwimPro for pool and open water swims, but the GPS tracking for the watch’s built-in Workout app is far superior to its third-party counterparts. The default maps come out smooth, while routes recorded using Strava and MySwimPro occasionally go haywire. I recently discovered a $2 app called HealthFit, which can export the Apple Watch’s smooth GPS maps from the native Workout app to services like Strava or MapMyRun.
The best part of all of the above is that you don’t need the newest Apple Watch to experience the best the watch has to offer. The perfectly good Apple Watch Series 3, first released in 2017, is getting a big price drop with the arrival of the Series 5 — and, for most people, it is a fantastic smartwatch.
Apple is offering the Series 3 for $199 for the noncellular model, the same price as Fitbit’s Alexa-enabled Versa 2 and less expensive than Garmin’s Vivoactive 3 series (both pool swim tracking wearables that don’t offer open water tracking). You could opt for slightly less expensive, used Series 3 watches on Swappa, an electronics marketplace, but, unless you buy a device in mint condition, you won’t benefit from Apple’s limited warranty and a new device’s fresh lithium-ion battery, which degrades over time.
At $199, the Series 3 has a compelling price, and, thanks to annual software upgrades, it feels just as capable as a fitness tracker and smartwatch as the newer models. Plus, people who are not at risk for atrial fibrillation, or an irregular heartbeat, don’t need the electronic cardiogram feature designed to detect arrhythmia on the Series 4 and 5. The Series 3 is pool- and ocean-proof, and also offers high/low heart rate detection a GPS. It’ll get watchOS 6’s new Noise app for hearing health and the Cycle Tracking app for gaining period and fertility insights. The biggest difference between the older and newer models is the screen size, below, which is a nice-to-have, but not a must. You can compare the two for yourself here.
And if you already have a Series 3, this is great news for you, and the environment. As Lisa Jackson, Apple’s vice president of environmental initiatives, said during a 2018 presentation: “We also make sure to design durable products that last as long as possible. That means long-lasting hardware, coupled with our amazing software. Because they last longer, you can keep using them. And keeping using them is the best thing for the planet.” (If you’re starting to see your battery life dwindle on an older Apple Watch, you can get a replacement for $79.)
The Apple Watch Series 5, which starts at $399 for the aluminum case model, is available Sept. 20 in stores, and can be preordered online now. Apple’s new Studio lets you create any variation of watch and band you want. The Apple Watch Series 3, available now, is $199 for the aluminum GPS-only model and $299 for the aluminum cellular model.
Sahred From Source link Technology
from WordPress http://bit.ly/307eE0v via IFTTT
0 notes
Link
On March 27, the development team behind the privacy-centric protocol Cashshuffle announced the official launch of the platform using the Electron Cash wallet. Anyone can use the latest Electron Cash version 4.0 with Cashshuffle and the implementation will also be added to the Bitcoin.com wallet and Badger client soon.
Also read: Examine the Token Universe Built on BCH With the New SLP Explorer
Cashshuffle Launched on Electron Cash Version 4.0
Bitcoin Cash (BCH) supporters who appreciate privacy rejoiced on Wednesday when Electron Cash (EC) lead developer Jonald Fyookball announced the official Cashshuffle release implemented in EC version 4.0. The Cashshuffle version is available for Mac, Windows, and Linux users and is disabled by default for better privacy. Moreover, the development team behind Cashshuffle have had the project’s process and code audited by the firm Kudelski Security.
The security researchers diligently studied Cashshuffle’s implementation, error handling, interaction with the blockchain network, and more. Kudelski also looked at general code safety and susceptibility to known vulnerabilities, any bad coding practices, and whether there was any leakage of secrets or other sensitive data through memory mismanagement.
The Kudelski Security report concluded:
We believe that the Cashshuffle codebase that we reviewed is implementing the Coinshuffle protocol with no significant deviations, and we did not find any evidence of malicious intent, flawed logic or potential backdoor in the codebase.
Cashshuffle is disabled by default and has to be manually toggled on.
Shuffling Coins
News.Bitcoin.com also tested out the new EC 4.0 version with the Cashshuffle extension to gain an insight into how the shuffling operation works. In order to get the new wallet, go to the official Electron Cash website and download the EC 4.0 release for any of the three desktop operating systems. After the download is complete, installation only takes a minute and you’ll then be directed toward creating or importing a wallet. After this process is finished, the default wallet will be open with the ability to send, receive and store BCH like any normal wallet.
To turn on Cashshuffle, go to the ‘tools’ section and press the ‘optional features’ tab.
In order to toggle the Cashshuffle feature and connect to the server, go to the Tools tab and select Optional Features. Inside this window, connect the Cashshuffle protocol but initially the settings will keep the program off by default in order to ensure privacy. At the very bottom of the wallet, next to the lock symbol, is an orange Cashshuffle icon that allows you to enable and disable the service at will.
What the wallet looks like with Cashshuffle enabled.
After loading some BCH into the wallet, simply turn the Cashshuffle feature on and the protocol will start the queue process, whereupon you will have to wait for five players to shuffle coins. When Cashshuffle is enabled, the program will be set so only shuffled UTXOs can be spent, but you can toggle this setting off so unshuffled coins can be spent. However, the wallet will warn you that spending unshuffled UTXOs could tie the address to a set of mixed transactions.
After waiting for about 20 minutes, 0.02621118 BCH was shuffled in the Electron Cash wallet. In order for shuffling to begin there has to be five players involved in the shuffle.
It’s probably best to use this specific wallet for mixed BCH only, in order to ensure a much stronger anonymity set. The protocol will also explain when the software is “busy shuffling” and how much is being shuffled at the time. In the section labeled Coins you can get a glimpse at the queue process and how many players have joined. Waiting for a group of players to shuffle with you can take a few minutes to a few hours, depending on how many players are looking to shuffle coins.
In the Coins section, you can see the coins that have been shuffled and UTXOs that are waiting to be shuffled.
The BCH community, in general, on social media channels and dedicated forums were pretty thrilled to hear about a privacy-centric feature that’s available right now. In addition to Cashshuffle addition on Electron Cash, the protocol’s website states that it will be implemented into the Badger and Bitcoin.com light clients in the near future. Moreover, Bitcoin Cash might start being known for many powerful privacy techniques with the recent release of Neutrino and Schnorr signature schemes coming in May.
What do you think about the Cashshuffle launch? Let us know what you think about this subject in the comments section below.
Disclaimer: Walkthrough editorials are intended for informational purposes only. There are multiple security risks and methods that are ultimately made by the decisions of the user. There are various steps mentioned in reviews and guides and some of them are optional. Neither Bitcoin.com nor the author is responsible for any losses, mistakes, skipped steps or security measures not taken, as the ultimate decision-making process to do any of these things is solely the reader’s responsibility. For good measure always cross-reference guides with other walkthroughs found online.
Image credits: Shutterstock, Cashshuffle, Electron Cash, and Pixabay.
Verify and track bitcoin cash transactions on our BCH Block Explorer, the best of its kind anywhere in the world. Also, keep up with your holdings, BCH, and other coins, on our market charts at Satoshi’s Pulse, another original and free service from Bitcoin.com.
Tags in this story
Anonymity, BCH, bitcoin cash, Bitcoin Fungibility, Cashshuffle, Cryptocurrency, Electron Cash, Fungibility, Mixing Coins, N-Featured, Outputs, Privacy, program, Software, utxos
Jamie Redman
Jamie Redman is a financial tech journalist living in Florida. Redman has been an active member of the cryptocurrency community since 2011. He has a passion for Bitcoin, open source code, and decentralized applications. Redman has written thousands of articles for news.Bitcoin.com about the disruptive protocols emerging today.
(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v3.2'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));
0 notes
Text
all your friends are so cool you go out every night.
by tuvwxyzfics yeah. life was great for miya sakurayashiki. so great he almost forgot the main reason his summer had become such a drag. but the universe felt the need to remind him exactly what the problem was in the first place. a tuft of brown hair came strolling into his peripheral. normally he’d ignore this on any day but currently he had nothing but time to do whatever caught his eye so when the patch of hair came close enough to pass the gate and make his face visible it was when miya froze up. there stood takashi. his friends kenchi and soutaro were close behind, all three with skateboards in hand clearly ready to enjoy themselves, probably here to relearn how to skate. who was miya to care? takashi made it clear he didn’t want to be associated with a delinquent or whatever his new vision of miya was after that dreaded night at s. - part 2 of 'Jealousy' Words: 2780, Chapters: 1/1, Language: English Series: Part 2 of miya and takashi are both horrible at feelings Fandoms: SK8 the Infinity (Anime) Rating: General Audiences Warnings: Creator Chose Not To Use Archive Warnings, No Archive Warnings Apply Categories: M/M Characters: Chinen Miya, Takashi (SK8 the Infinity), Original Characters, Kyan Reki, Hasegawa Langa, Nanjo Kojiro | Joe, Sakurayashiki Kaoru | Cherry Blossom, Higa Hiromi | Shadow Relationships: Chinen Miya/Takashi, Chinen Miya & Takashi, Takashi & Original Characters, Chinen Miya & Kyan Reki, Chinen Miya & Hasegawa Langa & Higa Hiromi & Kyan Reki & Nanjo Kojiro & Sakurayashiki Kaoru, Minor or Background Relationship(s), Nanjo Kojiro | Joe/Sakurayashiki Kaoru | Cherry Blossom, Hasegawa Langa/Kyan Reki Additional Tags: Developing Friendships, Takashi is bad at feelings, miya is bad at feelings, on the other hand reki langa and joe are great at them, Skateboarding, Fluff, Jealousy, Song: jealousy jealousy (Olivia Rodrigo), continuation fic, u don't haveee to read the first one to understand this one, but it wont rlly make sense, Not Beta Read, lowercase is intentional, Author Is Sleep Deprived, The Author Regrets Everything, The Author Regrets Nothing, btw cherry and joe adopted miya, did his parents die or divorce and js abandon their kid u can decide, ooc takashi, Maybe - Freeform, how are we supposed to know what he acts like, hes a BACKGROUND CHARACTER, he's characterized as I want, slice of life turned into police chase, slice of life wins source https://archiveofourown.org/works/64133683
#IFTT#fanfic#ao3feed#matcha blossom#matchablossom#ao3feed-matchablossom#sk8 the infinity#sk8 joe#sk8 cherry
0 notes
Link
Ivanka Trump addressed family separation at the border again in an interview on Thursday, this time placing the blame for families being ripped apart on immigrant parents.
“I am a daughter of an immigrant, my mother grew up in Communist Czech Republic, but we are a country of laws. … We have to be very careful about incentivizing behavior that puts children at risk of being trafficked, at risk of entering this country with coyotes or making an incredibly dangerous journey alone,” President Donald Trump’s daughter said at an Axios event in Washington, D.C.
.@IvankaTrump: “That was a low point for me as well. I feel very strongly about that. I am very vehemently against family separation and the separation of parents and children…immigration is incredibly complex as a topic.” #axios360 pic.twitter.com/shU32wprwu
— CSPAN (@cspan) August 2, 2018
The White House senior adviser said that the family separation policy was “a low point” for her.
“I feel very strongly about that, and I am very vehemently against family separation and the separation of parents and children … I think immigration is incredibly complex as a topic, illegal immigration is incredibly complicated,” Ivanka Trump said, adding later that these aren’t “easy issues.”
“These are incredibly difficult issues and like the rest of the country, I experience them in a very emotional way,” she said.
Ivanka Trump’s remarks on family separation are convoluted in several ways. For one, by saying that the policy “was a low point” intimates that family separation at the border is a thing of the past. The administration is still actively working on reuniting families after Donald Trump’s “zero-tolerance” policy spurred the separation of thousands of children from their families.
The policy was not only a creation made entirely by the Trump administration, but one that the president continued to go ahead with even after members of his team warned that it would be a bad idea.
The Washington Post via Getty Images
Sisters Ashly, 3, and Sol, 8, both from Honduras, eat donated sandwiches as their family camps next to a U.S. Customs checkpoint on the Gateway International Bridge on Saturday, June 23, 2018, in Matamoros, Mexico.
Though the president backtracked on his own policy and issued an executive order in June to stop the separations, many families aren’t being reunited unless the parent agrees to deportation or a family member within the country takes the child into their care. There are hundreds of kids who remain apart from their parents.
Ivanka Trump hadn’t commented on the policy at all until after the executive order was issued. Even then, her remarks weren’t on the practice’s problems, but rather a thank-you for her father’s order.
Thank you @POTUS for taking critical action ending family separation at our border. Congress must now act + find a lasting solution that is consistent with our shared values;the same values that so many come here seeking as they endeavor to create a better life for their families
— Ivanka Trump (@IvankaTrump) June 20, 2018
In addition to addressing the family separation policy, Ivanka Trump was asked on Thursday about whether she’s spoken with Robert Mueller or knew about the 2016 Trump Tower meeting attended by her brother Donald Trump Jr. She said “no” to both.
http://platform.twitter.com/widgets.js(function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.async = true; js.src = “http://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.10&appId=238320442863988”; fjs.parentNode.insertBefore(js, fjs); }(document, ‘script’, ‘facebook-jssdk’));
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version=’2.0′;n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window,document,’script’,’https://ift.tt/2EUDMIP);
fbq(‘init’, ‘1112906175403201’); // Edition specific fbq(‘track’, “PageView”);// custom event(s) for bpages fbq(‘trackCustom’, ‘EntryPage’, { “section_name”: “Politics”, “tags”: [ “donald-trump”, “immigration”, “ivanka-trump”, “family-separation”, “trump-administration-family-separation-policy” ], “ncid”: “” });fbq(‘init’, ‘10153394098876130’); // Partner Studio fbq(‘track’, “PageView”);
(function () { ‘use strict’;
document.addEventListener(‘DOMContentLoaded’, function () { $(‘body’).on(‘click’, function(event) { fbq(‘track’, “Click”, data); }); }); }) (); Source link
The post Ivanka Trump Blames Family Separation At Border On Parents appeared first on MySourceSpot.
0 notes
Text
How Math Works
You may have noticed that mathematical formulas on this blog look kinda nice. They depend on a multitude of modern technologies generally referred to as "The World Wide Web".
There are two main technologies involved: protocols and documents. Protocols make sure you can send and receive documents. The documents contain some content and instructions what to do with that content in computer readable language.
Over the past years, protocols have gotten more and more sophisticated. Quite recently, a lot of effort went into encrypting all these protocols better. But they also get faster, integrate new algorithms more efficiently and generally move forward at an impressive pace. There are some problems, but generally speaking humanity has protocols figured out.
Documents are a bit more problematic. When you look at a web-page, you use a browser (Firefox, Chrome, Safari, Opera and some unimportant ones) to do all the heavy lifting for you. The browser figures out what protocols to use, who to talk to and what documents to request. Once it got all the documents, it reads all the computer languages in the document to figure out how to display the content.
There are three main languages we use to make web-pages pretty:
Hyper Text Markup Language or HTML describes the structure of a document. Where does a paragraph start and end? What text should link somewhere else? Is that text for the user or the computer?
Cascading Style Sheets or CSS tell the browser what the document should look like. Text color, size, where to position text and what text should be hidden is defined using CSS. It's probably the most difficult to learn language of these three.
[Javascript or JS](https://en.wikipedia.org/wiki/JavaScript "Wikipedia on JS"] is the only programming language here. It can change a documents layout, evaluate input and is nothing short of the brain of a web-page.
That's the good part. Let's start with the bad part at a point you bare some responsibility for: bad browser support.
Superficially, all browsers agree on how the internet should look like. Over some time, we got all browser-suppliers to listen to the World Wide Web Consortium, an organisation that defines how HTML and CSS should work and how JavaScript interfaces with both. In detail however, many browsers speak there own, specific "slang" instead of what the W3C defined.[1] Sometimes browsers charge ahead and implement features the W3C didn't have time to define yet. Other times they don't implement something for various reasons. And then again some browsers understand words differently.
For everybody caring about their web page, that meant to write different documents for different browsers. Most of the time, only tiny bits and pieces need to be different. Though there is not much work involved, it's a plethora of annoyance to test every detail in every browser. So much so that it's big business to help people with cross-browser-testing.
That's where the math breaks.
There is a great standard embedded in HTML, the Math Markup Language or MathML. Though it's part of HTML, part of the web and well defined by W3C[2], most browsers don't understand MathML.
JavaScript To The "Rescue"
It's such a pain to test different browsers, sometimes only to find out that what worked nicely in one doesn't work at all in the other, that developers started to use frameworks. Frameworks teach a browser some new language, usually as an extension of JavaScript. Most are written in JavaScript, but all promise to look the same across all browsers. It's a lot easier to write a page nearly exclusively in JavaScript than using HTML and CSS, both possibly failing in one browser or the other. Furthermore, CSS tends to have unexpected results. It's a quite old language that pales in comparison to newer ones. CSS' complexity is partly to blame for the popularity of frameworks.
Here the math came in. Since MathML is badly supported, a framework exists to display mathematical formulas. I used MathJax because it allows formulas to be written in LaTex, a language used in scientific literature.
E.g. this LaTex code:
\gamma ={\frac {1}{\sqrt {1-{\frac {v^{2}}{c^{2}}}}}}={\frac {1}{\sqrt {1-\beta ^{2}}}}=(1-{\frac {v^{2}}{c^{2}}})^{-{\frac {1}{2}}}={\frac {dt}{d\tau}}
ideally renders as:
People are lazy. Web developers especially. If there is a tool out there fixing a problem[3], people will use it. The additional cost is conveniently hidden. But there is plenty!
Your browser is a tool to display HTML and CSS. It's well optimised to do that quickly, neatly and securely. JavaScript on the other hand is designed to be able to do everything. And it's actually quite hard to do that quickly, not to mention securely.
JavaScript is awesome. Used correctly, it allows a more fluent user experience. And smoothing over browser differences is possible as well. There seems to be no limit to what JavaScript can do.
But when it's used for everything, web-pages require a lot more code to be transferred, slowing users down. JavaScript, though fast, can't come close to a browsers native ability to read HTML and CSS.
More recently, JavaScript is used for user surveillance. Tracking your device, your click-behavior, and of course what pages you visit is all possible with JavaScript.
JavaScript used at the scale it's used today excludes slow connections and slow computers and enables user surveillance by big companies. That's why I try to reduce JavaScript to an absolute minimum in all my projects.[4]
How That Works
HTML tells the browser about a documents structure. Browsers expect everything in a document to be embedded in HTML. Documents are generally structured as follows:
- tells the browser this document may contain HTML - Everything between and is html-code. </p> All document properties go here. The head is never displayed, but used to tell the browser how to handle the document. <title>The Documents title goes here</title><style> Cascading _Style_ Sheet language goes here </style><script> JavaScript code would go here, use sparingly! </script><link href="Here%20we%20could%20write%20some%20link%20to%20load%20additional%20CSS-files" the> - tag is used for very basic document descriptions, like if the document contains emoticons: <meta charset="utf-8"> Content goes here. Ideally, we don't need any more property-definitions here, though it would be possible to enter them here as well.
tumblr allows quite substantial manipulation of a blog's HTML. But they insert some extra HTML without asking any blogger. By inserting some <script>-tags, they can add some JavaScript. That is mostly for surveillance purposes, but some is to show e.g. that tumblr-bar at the top of the page.
By adding some JavaScript to display nice formulas I contribute to the jungle of JavaScript. Then again, removing MathJax would change little. However, I could actually add some JavaScript to protect my visitors from surveillance. Even better, I can use HTML itself.
There is a lot more to HTML than most people, even web-developers[5], realise. For example, there is a way to define what sources the browser should trust, and discard all others. That way, a browser will block any JavaScript[6] which is not allowed.
These restrictions are actually part of the protocol, not the document. But HTML has a way to tell the browser about things the protocol might have forgotten to mention. This extra information is of course valid for the whole document, so they go in the <head> element. On this blog, this line keeps you safe from surveillance JavaScript:
<meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-eval' 'nonce-optica_setup' 'nonce-disqus' 'nonce-mathjax' https://*.tumblr.com">
This line introduces itself to the browser as meta-information about the document. http-equiv tells the browser it's supposed to treat the line as equivalent to an HTTP[7] statement, which is specified in quotation marks. The content specifies what the statement is evaluated as. Suffice to say, this content tells the browser to ignore all JavaScript not from tumblr.
Safe From Math As Well
You may have noticed that I said pretty formulas needed JavaScript because browsers don't all support MathML. Well, there are ways around this shortcoming. MathJax is one way, browser specific CSS is another.
Assume a browser doesn't understand MathML. It's still HTML, but uses tags the browser has no use for. Since it's HTML, the browser would understand CSS styling it's content perfectly well. That allows to as a browser to please draw e.g. a square root in pure CSS. Or to define the style of how fractions are written. And how the typesetting of a formula differs from that of text.
This method is called a "CSS-fallback". Your browser doesn't understand MathML? Well, you can fall back to how we did it in the old days. It won't be as pretty and there won't be the same functionality, but it covers you for the most part.
There is a catch, though. Say a browser understands MathML perfectly fine and reads the CSS-fallback. MathML tells it to draw a square root. CSS tells it to draw a square root as well. Now you have two square roots on the screen. Ugly.
What needs to happen is that the browser reads the CSS if it doesn't understand MathML and ignores it otherwise. However, there is no way to ask a browser if it understands MathML. The only way to reliably test weather a browser does requires JavaScript.
Trying to reduce JavaScript, there is only one way: browser specific hacks. Browsers implement HTML and CSS differently. That's generally an annoyance. But, once you know how exactly they differ, it's possible to write code one browser will understand and others won't. Once we know [what browser actually understand MathML](https://caniuse.com/mathml “caniuse.com is a helpful page that documents what which browser understands”), all we need to figure out is how to talk specifically with those who don't.
I failed. There is nothing that exclusively browsers that don't speak MathML understand.[8] The frustration is real.
The Demise of The Web (Page)
On the modern web, fewer and fewer documents contain static content. Most web pages rightfully call themselves "web apps", since they more closely resemble a dedicated application than any form of document. But by using browsers, they need to work with the minimum set of features every browser supports. Electron to the rescue!
Electron is a tool that solves many problems. Using Electron on a page returns a stripped-down version of Chromium that runs only that page. The web-developers are happy, because there is only one browser looking at their page. Chromium is happy, because there are much more people using Chromium now. And app-developers are happy, because Chromium works on any computer so their app will work on any computer.
There is a bunch of problems with Electron, specifically security wise, but it's better these projects are turned into apps than pages. That's because your program is your problem. How much work you invest vs. how bad it turns out is your decision.
A web-page is everybodie's problem. Because of browser economoics.
The Politics of Browser Economics
Browsers and web-developers are in a weird dance with users. Every browser wants to be the most popular and lure users with features. Web-developers depend on browser support, so they tend to use features all browsers support. Users generally want a page to work before caring about what nice features it offers. And ideally, the W3C finds common ground and writes that down which we then call a standard.
To be the most popular, every browser found something it’s particularly good at. Firefox has the most experimental features, Chromium is super fast, Opera is pretty and Edge is good at downloading Firefox.
Faster browsers are easier to sell. The moment a user installs a faster browser he feels improvement. But it takes a document including e.g. MathML for a user to see the benefits of beautiful formulas. At the same time, every user with browsers not supporting MathML will leave the page because it looks ugly to them. That's why fallbacks are important. And that's why JavaScript frameworks are so convenient. But JavaScript is slow, so users would see a real improvement by switching to faster browsers. It's a vicious circle.
If we all could get faster browsers, that would be awesome. But we can't. There are people with old computers that don't have the power to run fast browsers. There are countries with slow connections and every byte JavaScript they need to download counts. And though JavaScript has it's applications, extensive use of JavaScript comes with many ramifications.
JavaScript takes time to load. A lot of companies use JavaScript for surveillance. Since JavaScript is so powerful, it's easier to hack. And since JavaScript is everywhere, it is used to grab your attention.
The Ad-Epidemic
The availability and prevalence of JavaScript everywhere has enabled new exploitation. Annoyingly blinking ads have existed since the very early days of the internet, but it took a lot of ~surveillance~ behavioral science to turn that into a business.
In the early days, to advertise you had to find a page that attracted users who might buy your stuff. Then you needed to actively reach out to that page and ask it to put some paid ads up. It was your responsibility to guess what users visit what pages and it was the pages responsibility to guess weather this or that ad might scare users away.
Today ads work like this: If you want to advertise, you hire an ad-network to show your ads to specific users. The ad-network has access to many thousand pages and will show your ad whenever a user you specified visits.[9] At the same time, all pages contributing to the ad-network can set what ads shouldn't be displayed on the page. There is no more guessing involved.
It's crucial to this process that the ad-network knows what user is currently visiting the page. Surveillance is a key element of modern advertising. The better an ad-network knows a user, the better it can show ads the user will actually click on and thereby earn money. Therefore, the best at this game are Google and Facebook. Google, because it knows what you search. Facebook, because you told them everything about you. And of course JavaScript based surveillance of user behavior.
Web-developers are lazy. Selling users attention and privacy is a super simple and reliable way to get enough money to keep a page running. Of course there are other concepts out there, ranging from plain paid subscriptions to more creative concepts! All of them require some thought into how a page adds value to a users life, though.
Plain And Simple
I'm lazy. I want a fast web. I'm easily distracted. And I don't know anybody who doesn't hate ads.
You are responsible for the browser you use. Could I convince you to switch to a browser with MathML support to make my life a little easier? If not, how about a fast browser with decent HTML support?
If you still have time, think about installing an ad blocker. You will experience faster pages, because the JavaScript trying to load ads is blocked. And if enough people block ads, web-developers will have to think of new ways to get money.
Another part to this story is mass surveillance. Surveillance is a lot easier with a lot of JavaScript and advertising requires surveillance to be efficient. Making surveillance more difficult is simple:
Privacy Possum disables surveillance a page does on it's own.
TorBrowser disables surveillance based on protocols
It's a bit more tricky to disable JavaScript based surveillance. The best way is to disable JavaScript. Some tools allow you to disable specific sources of JavaScript. uBlock has this functionality integrated. However, these tools require a bit more substantial understanding of how HTML documents work.
Most of this measures don't have an immediate benefit to you. Quite the opposite! TorBrowser is slow. Disabling JavaScript will break most pages because they rely so heavily on it.[10] But we shape the web by the way we use it. Using these tools shapes the web away from specific, slow, surveilled user experiences towards a common experience equal to all users.
EDIT: All of this was for nought, since tumblr filter MathML content from blog posts. They do that because they need to display posts on the dashboard, where a blog's layout isn't used. So any "invalid" HTML (i.e. HTML most browsers don't support) needs to be filtred. So for the sake of math on tumblr, please, PLESE use browsers that support the full HTML-syntax!
0 notes
Text
tvOS Tutorial: Using TVML Templates
This is an abridged chapter from our book tvOS Apprentice, which has been completely updated for Swift 4 and tvOS 11. This tutorial is presented as part of our iOS 11 Launch Party — enjoy!
In this tutorial, you’ll learn how to use the plethora of TVML templates that Apple has provided to make some stunning interfaces. You’ll use these templates to build a comprehensive screen for RWDevCon 2015 videos, which will include a wide range of information about the video and display it in an appealing and recognizable manner.
Getting Started
You can download the starter project for this tutorial here.
The sample app for this tutorial is wenderTV; it lets you browse and watch raywenderlich.com video content on your Apple TV, so you can enjoy a vast quantity of knowledge – and bad jokes – from the comfort of your sofa. Right now, wenderTV is quite empty.
wenderTV includes a lot of resources you’ll use during this tutorial; we’ve also reorganized some of the code to make it easier to understand.
Build and run the wenderTV starter project from Xcode; you’ll notice the screen is completely blank. This is because there aren’t any TVML documents in wenderTV yet. Before you can turn your attention to creating some TVML documents, you have a little housekeeping to do.
Note: Although you can use Xcode to write all the code you need for a TVML-based app, it can be quite a painful experience. Xcode is good for editing Swift or Objective-C, but has only rudimentary support for XML and JavaScript. It’s definitely worth using Xcode when you need to, and then switching to a more capable editor such as Sublime Text, Atom, Visual Studio Code or MacVim to work with TVML documents and JavaScript files.
Loading Scripts
The project for wenderTV already has ResourceLoaderJS split out into its own file, so you need to discover how to import it into main.js.
TVJS provides the evaluateScripts() function which takes an array of URLs of JavaScript files and a callback. The function reads each URL in turn, attempts to parse it and adds any contained functions and object definitions to the context’s global object. Finally, it invokes the supplied callback with a Boolean denoting success or failure.
The AppDelegate contains code that provides the JavaScript application with a list of URLs to the required JavaScript files as part of the launch options object. Open main.js and add the following code to the App.onLaunch() function:
// 1: evaluateScripts(options.initialJSDependencies, function(success){ if (success) { // 2: resourceLoader = new ResourceLoaderJS(NativeResourceLoader.create()); var initialDoc = loadInitialDocument(resourceLoader); navigationDocument.pushDocument(initialDoc); } else { // 3: var alert = _createAlert("Evaluate Scripts Error", "Error attempting to evaluate the external JS files."); navigationDocument.presentModal(alert); throw ("Playback Example: unable to evaluate scripts."); } });
Taking this new function body step-by-step:
The options object is prepared in Swift and then passed to the JavaScript app in the app delegate, while the initialJSDependencies property is an array of URLs for the different JavaScript files that need to be loaded as the app starts. evaluateScript() performs this action and then invokes the callback indicating whether it was successful.
If the JavaScript sources evaluated successfully, create a ResourceLoaderJS object before using it to load the initial document and then pushing this TVML document onto the navigation stack. loadInitialDocument() is currently a stub method you’ll populate in a bit.
If the JavaScript files failed to load, there is nothing more that the app can do. Therefore it uses _createAlert(), defined at the bottom of main.js to build and present an alert document and then throw an error.
Add the following to loadInitialDocument():
return resourceLoader.getDocument("video.tvml");
This uses the resource loader to get the TVML file from the app’s resource bundle and return it as a DOM object.
Next up, you’ll need to create the file your app is trying to load: video.tvml.
Head into Xcode, and right-click on the layouts group in the project navigator. Select New File…:
Navigate to tvOS\Other\Empty and hit Next. Name the file video.tvml and ensure that the wenderTV target is checked:
Open the new file in either your favorite XML editor (or Xcode, if you insist) and add the following lines:
<?xml version="1.0" encoding="UTF-8" ?> <document> <productTemplate> </productTemplate> </document>
This defines a simple TVML document using a new type of template: productTemplate.
Build and run the app to see how things look so far:
Hmm. The screen is still blank. Although you’ve created the file and provided the template, you haven’t provided any content. You’ll fix that shortly, but first you need to cover a bit of background on TVML templates.
TVML Templates
A TVML document is just an XML (eXtentible Markup Language) document with a specific schema defined by Apple. If you’ve used HTML in the past, XML will look familiar. HTML isn’t actually XML (despite some failed efforts with XHTML), but the syntax and structure is fairly similar.
Since TVML documents are XML they should start with the following line:
<?xml version="1.0" encoding="UTF-8" ?>
This is known as the XML prologue; it notes this file is an XML document and which character encoding it uses.
The TVML document has a root element, which is a single element at the top level of the document and the parent (or ancestor) of all other elements. The element has a single direct descendant, which can be one of 18 possible template tags.
A template tag specifies the top-level layout tvOS should use to render the document on screen. In addition to specifying the appearance onscreen, template tags also convey some semantic information about the content they contain. Templates might look similar, but have entirely different purposes.
TVML templates can be divided into the following categories:
Informational: Shows a small amount of information to the user, and optionally requests input from the user. It’s not designed for browsable content. Includes alertTemplate and loadingTemplate.
Data Entry: The user experience of entering data on TVs is pretty horrendous, and Apple TV is no different. However, there are a few templates for requesting data from the user, including searchTemplate and ratingTemplate.
Single Item: Displays information or content about a single product or item, such as a film or episode in a TV series. Includes productTemplate, oneupTemplate, compilationTemplate and showcaseTemplate.
Collections: Displays a collection of products, such as a TV series, a genre of films or tracks on an album. Includes stackTemplate, listTemplate and productBundle.
Other: Includes menuBarTemplate, which hosts a set of other templates, and divTemplate, which is a completely clean slate upon which you draw.
Note: Rather than go into detail here about each and every template, the Apple reference is a great resource for getting the low-down on the different templates, their capabilities and layouts: apple.co/1PJuOAV.
The Product Template
The first document you’ll create uses , which is designed to display all information relating to a specific product — in this case, a video.
Open video.tvml and add the following code between the tags:
<banner> <infoList> <info> <header> <title>Presenter</title> </header> <text>Ray Wenderlich</text> </info> <info> <header> <title>Tags</title> </header> <text>development</text> <text>teams</text> <text>business</text> </info> </infoList> </banner>
This code snippet introduces a lot of new element types. Taking them one-by-one:
<banner>: Displays content across the top of a page.
<infoList>: Displays a list of elements, arranged in a vertical list.
<info>: Acts as a container forthis s the content to appear as an item in an or an .
<header>: Serves as a description of the content of the section in which it resides.
<title>: Contains the text of a short title.
<text>: Displays text.
Build and run the app to see what your new TVML looks like:
This page represents a video, but it currently lacks a title. Time to change that.
Add the following inside the <banner> tags, just after the closing tag:
<stack> <title>Teamwork</title> <row> <text>17m 54s</text> <text>Inspiration</text> <text>2015</text> <badge src="resource://nr" />is <badge src="resource://cc" /> <badge src="resource://hd" /> </row> </stack>
This section introduces more TVML elements:
<stack>: Stacks lay out their content vertically down the screen in a manner similar to . There’s a wider range of tags that can be in a Stack.
<row>: A row is like a stack, but with a horizontal orientation instead of vertical.
<badge>: Badges display a small inline image. The URL is provided by the src attribute.
Notice that the URL of the two badge images begin with resource://. This is a special URL scheme that points to images that exist within tvOS itself. These images include common action icons, such as “play”, rating images for different countries and video information such as HD.
Note: For a full list of the resource images available within tvOS, check out Apple’s documentation at apple.co/1T930o9.
Build and run again to see how the page is shaping up:
It’s starting to look good, but there’s still a long way to go. Before continuing with the template coding, you first need to consider the separation of the data and the view.
Data Injection
As your video document currently stands, all the data is hard-coded. To show information about a different video, you’d have to create a whole new page. If you wanted to reformat the video page once you’ve created all the pages, you’d have to go back through and edit every single one of them.
A much better approach is to use a templating engine, where you build the video page as a template and specify where the data should be injected. At runtime, the template engine takes the page template along with the data and generates the TVML page for tvOS to display.
Note: The word “template” is now being used for two different purposes: TVML templates are the layouts provided by tvOS that render your documents on the screen, whereas a templating engine uses template documents combined with data to generate complete TVML documents. Don’t worry too much about the distinction; it’ll be much more clear once you’ve used them both.
Mustache.js is a popular simple templating engine for JavaScript. You might recognize the templating syntax which is based around curly-braces:
The Mustache.js library is already part of wenderTV, but you need to build the mechanisms to use it. This presents you with several tasks to accomplish:
The data is stored as JSON files in the app bundle. The JavaScript app needs the ability to request them.
When a document is loaded, it now requires data, and this should be combined with the document string using Mustache.js.
Images that are present in the app bundle need their complete URL substituted.
The video document should be updated to turn it into a templated document.
You’ll address each of these in order.
Note: As of tvOS 11, TVML supports the concept of prototypes in TVML that leverage data binding to link data elements to the TVML. This reduces code redundancy and improves performance when paginating large content sets, such as a huge list of YouTube videos in a grid view format.
However, prototyping is only available at the <section> level, while you’re using it in this tutorial for much more, such as in the <header> section of your TVML. You’ll continue to use Mustache.js as a templating engine for this section of the book, but if you end up having to handle large content sets in your tvOS apps, read up on prototyping and data binding at apple.co/2utDXXm.
Reading JSON From the App Bundle
Open ResourceLoader.js and add the following method to ResourceLoaderJS:
getJSON(name) { var jsonString = this.nativeResourceLoader .loadBundleResource(name); var json = JSON.parse(jsonString); return json; }
This function uses the native resource loader to pull the JSON file from the app bundle before parsing it into a JavaScript object.
Note: It would be relatively simple to replace this functionality with a method that calls a remote server for data instead of finding static data inside the app bundle. The rest of this templating approach would continue to work as it stands.
Injecting Data Into the Document String
Now that you can obtain the data for a given page, you need to combine it with the document template itself. Update getDocument() in ResourceLoaderJS to match the following:
getDocument(name, data) { data = data || {}; var docString = this.nativeResourceLoader .loadBundleResource(name); var rendered = Mustache.render(docString, data); return this.domParser.parseFromString(rendered, "application/xml"); }
Here you’ve added an additional data argument to the method and used render on Mustache to convert the template and data to a completed document. As before, you use a DOMParser to convert the document string to a DOM object.
Resolving Image URLs
For simplicity’s sake, your sample data stores images as the names of files in the app bundle, which need to be converted to URLs before you can display them. The utility functions to do this are already in the resource loader, so you just need to call them. You’ll do this at the same time as you update the initial document loading to use the templating engine.
Open main.js and update loadInitialDocument() to match the following:
function loadInitialDocument(resourceLoader) { var data = resourceLoader.getJSON("teamwork.json"); data["images"] = resourceLoader .convertNamesToURLs(data["images"]); data = resourceLoader .recursivelyConvertFieldsToURLs(data, "image"); data["sharedImages"] = _sharedImageResources(resourceLoader); return resourceLoader.getDocument("video.tvml", data); }
First, you load the data using the new getJSON() method. Then you use the utility functions to perform the image name-to-URL conversion. These convert three different image name sources:
Each value in the images object on the data array.
Every value associated with a key of image anywhere within the JSON data structure.
A set of shared images that are useful for all documents in wenderTV.
That takes care of the plumbing underneath; you’re ready to use this powerful new functionality.
Using the Mustache.js Templates
Open teamwork.json and take a look at the data you’ll use to populate the video page. There’s quite a lot of data, but it’s a standard JSON object and fairly easy to understand. You should spot some fields such as title, presenter and duration that you’ve already hard-coded into video.tvml. You’re now going to swap these out.
Open video.tvml and find the title tag that contains Ray Wenderlich. Replace the name with , so that the first section now looks like this:
<info> <header> <title>Presenter</title> </header> <text></text> </info>
The syntax for Mustache.js is really simple; it will replace with the value of presenter in the data object supplied to it.
Now that you’ve got the hang of that, you can replace the following content with the respective template tags:
Teamwork →
17m 54s →
Inspiration →
2015 →
resource://nr → resource://
Build and run; you shouldn’t see any difference, which is exactly what you want. The page is now data-driven, and even better, you didn’t break anything. Bonus! :]
There are still some parts of the template you haven’t touched: closed-captions, HD and tags. These use some slightly more advanced parts of the Mustache.js templating engine.
Template Sections
Remove the three tags in the Tags section and add the following in their place:
<text></text>
This new syntax defines a template section. Look at teamwork.json and you’ll see that tags is an array of strings. The Mustache.js syntax here loops through the array, with rendering the content of the current index.
Finally, you need to handle the two Boolean badges. Replace the cc and hd badges with the following:
<badge src="resource://cc" /> <badge src="resource://hd" />
Once again you’re using sections, but this time they’re structured like an if statement. If the specified property exists and has a true value, then render this section; otherwise, ignore it.
Build and run again; check out your newly templated video page.
To confirm that the data injection is actually working, open main.js and change the data file loaded in loadInitialDocument() from teamwork.json to identity.json. Build and run again to see the data change.
You can now see details of Vicki’s talk on identity — sweet!
on
Filling out the TVML Template
The video page is still looking a little barren. It’s time to double-down on adding some content.
Open video.tvml and add the following inside the <stack>, just below the existing <row>:
<description allowsZooming="true" moreLabel="more"></description> <text></text> <row> <buttonLockup type="play"> <badge src="http://resourcebutton-play" /> <title>Play</title> </buttonLockup> <buttonLockup type="buy"> <text>$9.99</text> <title>Buy</title> </buttonLockup> </row>
Once again, this introduces some new TVML elements:
<description>: Displays a larger amount of text that’s used to describe content. If the text is too long for the display area then a label will be displayed with a title defined by the moreLabel attribute.
<buttonLockup>: A lockup is a class of element that joins its children together as a single element. A button lockup can contain text and a badge and will appear as a button.
Remember that these elements are all contained within a <stack>, so they’ll appear on top of each other.
Before checking your work, you need to add one more element to the top banner. Add the following line immediately after the </stack> closing tag:
<heroImg src="" />
A heroImg element is a large image that defines the content of this document. It appears inside the <banner> and tvOS uses it to define the blurred page background.
Build and run to see the completed top banner:
It’s starting to look really cool – But wait! You may now have noticed that the text color has changed from black to white. How did that happen?
tvOS has decided that because the background image you specified is darker than a certain threshold, it needed to increase the contrast of your text, so it changed the default text color.
Update the <productTemplate> tag to match the following:
<productTemplate theme="light">
Build and run to see the difference:
The visual effect on the background has changed along with the foreground font colors. You can change the theme attribute to dark if you wish to force the previous look if you prefer it.
Note: The default behavior has changed since the previous version of tvOS, so you may need to explicitly define the theme to get the effect you’re used to. Also, please don’t get this behavior confused with the new dark mode introduced by Apple in tvOS 10. That will be covered in more detail later in the book.
Adding Shelves
The remainder of the productTemplate is made up of “shelves”. A shelf is a horizontal section of the page with content elements scrolling on and off the screen.
Add the following below the closing </banner> tag, towards the bottom of video.tvml:
<shelf> <header> <title>You might also like</title> </header> <section> <lockup> <img src="" width="402" height="226" /> <title></title> </lockup> </section> </shelf>
This shelf displays a set of other videos that the user might enjoy as defined in the recommendations property of the data model. Each recommendation has an image and a title, each of which you use in the code above.
There are two other elements introduced in this code segment:
<section>: Defines a set of related content that should all be laid out together. A section can contain a title and multiple lockup elements.
<lockup>: You saw <buttonLockup> before; lockup is a more general type of lockup. It provides layout for an image, a title, a badge and a description.
Now add another shelf below the one you just created:
<shelf> <header> <title>Production</title> </header> <section> <monogramLockup> <monogram firstName="" lastName=""/> <title> </title> <subtitle></subtitle> </monogramLockup> </section> </shelf>
This shelf displays a list of people associated with the production; it’s stored in the people property in the data model.
This introduces the and elements, which let you represent a person when an avatar isn’t available. Like the other lockup elements, a monogram lockup simply locks its content together.
A monogram has firstName and lastName attributes, from which it generates a monogram (initials) and places it in a large circle.
Build and run to see how your shelves are taking shape. You will have to scroll down to reveal the lower shelf:
Take a look at the description for the “Identity” talk. Notice that the more label has appeared, because there is too much text to display in the available space. Navigate to the label and you’ll see you can focus on the description and press select to trigger an action. This action doesn’t currently do anything, but wouldn’t it be nice if it would display the full text?
Time for another TVML template.
Handling Text Overflow
The descriptive alert template provides space for an extended area of text and buttons. It sounds ideal for this purpose. You’ll use this template and a spot of JavaScript to wire it up.
In the Xcode project, right-click on the layouts group and select New File…. Choose tvOS\Other\Empty and name the file expandedDetailText.tvml.
Open the new file and add the following:
<?xml version="1.0" encoding="UTF-8" ?> <document> <descriptiveAlertTemplate> <title></title> <description></description> <button action="dismiss"> <text>Dismiss</text> </button> </descriptiveAlertTemplate> </document>
This should be quite straightforward to understand. There’s the usual XML prologue, the tag and some elements you’ve used before. Notice that the button tag has an action attribute; this is a user-defined attribute that’s not part of the TVML specification.
You can define any attributes that you want (provided they don’t clash with existing attributes) and then read them from your JavaScript app. You’ll write some code to handle this dismiss action in just a bit.
Open video.tvml and find the tag. Update the element to match the following:
<description allowsZooming="true" moreLabel="more" action="showOverflow" title=""></description>
You’ve added two new attributes: action and title. You’ll use both of these in the event handler to create the expanded detail text document.
Event Handling
Now that the document templates are ready to go you can turn your attention to the JavaScript that wires everything up.
Open main.js and add the following function:
function _handleEvent(event) { // 1: var sender = event.target; var action = sender.getAttribute("action"); // 2: switch(action) { case "showOverflow": // 3: var data = { text: sender.textContent, title: sender.getAttribute("title") }; // 4: var expandedText = resourceLoader .getDocument("expandedDetailText.tvml", data); expandedText.addEventListener("select", _handleEvent); navigationDocument.presentModal(expandedText); break; case "dismiss": // 5: navigationDocument.dismissModal(); break; } }
Taking this piece-by-piece:
The target property of the event argument represents the DOM object that fired the event. getAttribute() of a DOM object will return the value for the specified attribute. Here you’re using it to find the value of the action attribute you added above.
Switch on the action attribute to invoke the appropriate code.
If the action is showOverflow, then you have a description field with too much content. Construct an object with the data required by the expanded detail text document. Once again you’re using getAttribute() along with textContent, which returns the content of the tag itself.
Load the expandedDetailText.tvml document in the usual way, add an event listener and use presentModal() on NavigationDocument to display the new document on top of the current document.
If the action is set to dismiss, use dismissModal() on NavigationDocument to perform the dismissal.
Now that you’ve created this event handler, you need to wire it up to the initial document. Add the following line to App.onLaunch, just after you call loadInitialDocument():
initialDoc.addEventListener("select", _handleEvent);
This registers _handleEvent as a listener for the select event, and uses event bubbling to handle all events triggered within the document.
Build and run the app, navigate down to the over-full description and hit the select button. You’ll see your new expanded detail text page:
You can use the dismiss button to return to the video screen.
Viewer Ratings
In the final part of this tutorial, you’ll add a new ratings section to the video page and let the user select a rating using a new template.
Open video.tvml and add the following new shelf underneath the Production shelf:
<shelf> <header> <title>What other people thought</title> </header> <section> <ratingCard action="addRating"> <title> / 5</title> <ratingBadge value=""></ratingBadge> <description>Mean of ratings.</description> </ratingCard> <reviewCard> <title></title> <description></description> <text> </text> </reviewCard> </section> </shelf>
By now, you’ll recognize most of the TVML elements, but there are still a few new ones:
<ratingCard>: Displays a small card suitable for showing the ratings of a product.
<ratingBadge>: A specialized badge for showing a star-rating. The value attribute should be a value between 0 and 1, which will be converted to a proportion of five stars.
<reviewCard>: A card for displaying user or critic reviews.
Notice that the element has the custom action attribute again. You’ll use this later to display the rating page.
Build and run to see what the new shelf looks like:
When the user selects the rating card, you want to let them choose a rating for the current video. This is exactly what the ratings TVML template is for.
Collecting Ratings
In Xcode, right-click on the layouts group and select New File…. Choose tvOS\Other\Empty and name the file videoRating.tvml.
Open the new file and add the following:
<?xml version="1.0" encoding="UTF-8" ?> <document> <ratingTemplate> <title></title> <ratingBadge /> </ratingTemplate> </document>
This new file uses the which simply displays and collects ratings. It contains a <title> and a <ratingBadge>, both of which you’ve already seen.
The template is ready; you just need to display it. Open main.js and add the following case to the switch statement in _handleEvent():
case "addRating": var ratingDoc = resourceLoader.getDocument("videoRating.tvml", {title: "Rate Video"}); navigationDocument.presentModal(ratingDoc); break;
These few lines load the new document you created and provide the title to the templating engine. It then displays the document modally.
Build and run, navigate to the rating card and hit select to see the new ratings page:
Now that is one swell-looking – and extensible – interface.
Where to Go From Here?
You can download the final project from this tutorial here.
In this tutorial you’ve created a great-looking TVML app and used three of the built-in templates along with a vast array of TVML-specific elements. You also integrated a JavaScript templating engine to separate the UI from the data. Adopting great development techniques right from the start is a win in anyone’s book.
You can check out Apple’s documentation (apple.co/1PJuOAV) for specifics about the templates and elements covered in this tutorial.
If you enjoyed what you learned in this tutorial, why not check out the complete tvOS Apprentice book, available in our store?
Here’s a taste of what’s in the book:
Section I: Architecture
This section is designed to give you a birds-eye view of how tvOS works and help you decide what to read next.
Section II: TVML Apps
This section covers the basics for creating an app via the TVML approach. From the basics of Hello World through a real world example, by the end of this section you’ll know everything you need to create client / server apps for Apple TV.
Section III: Traditional Apps
This section covers the basics for creating apps via the traditional approach. You’ll learn the new libraries created for Apple TV, and how the ported libraries from iOS can be used.
Section IV: Advanced Frameworks
This section covers some of the more advanced frameworks you’ll need for many TV app use cases. Whether you took the TVML approach or the Traditional approach, these frameworks will be important to understand to make your app stand out.
Section V: Design
This section covers design concepts important for tvOS. For your app to stand apart from the rest, you’ll need to understand these design concepts well.
Bonus Chapter
And that’s not all — on top of the above, we have a bonus chapter for you that gives you a crash course in JavaScript!
By the end of this book, you’ll have some great hands-on experience with building exciting, good-looking apps for the Apple TV!
And to help sweeten the deal, the digital edition of the book is on sale for $49.99! But don’t wait — this sale price is only available for a limited time.
Speaking of sweet deals, be sure to check out the great prizes we’re giving away this year with the iOS 11 Launch Party, including over $9,000 in giveaways!
To enter, simply retweet this post using the #ios11launchparty hashtag by using the button below:
Tweet !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');
We hope you enjoy this update, and stay tuned for more book releases and updates!
The post tvOS Tutorial: Using TVML Templates appeared first on Ray Wenderlich.
tvOS Tutorial: Using TVML Templates published first on http://ift.tt/2fA8nUr
0 notes
Quote
Let's define a CSS utility library as a stylesheet with many classes available to do small little one-off things. Like classes to adjust margin or padding. Classes to set colors. Classes to set specific layout properties. Classes for sizing. Utility libraries may approach these things in different ways, but seem to share that idea. Which, in essence, brings styling to the HTML level rather than the CSS level. The stylesheet becomes a dev dependency that you don't really touch. Using ONLY a utility library vs. sprinkling in utilities One of the ways you can use a utility library like the ones to follow as an add-on to whatever else you're doing with CSS. These projects tend to have different philosophies, and perhaps don't always encourage that, but of course, you can do whatever you want. You could call that sprinkling in a utility library, and you might end up with HTML like: Tweener :( Forgive a little opinion-having here, but to me, this seems like something that will feel good in the moment, and then be regrettable later. Instead of having all styling done by your own named classes, styling information is now scattered. Some styling information applied directly in the HTML via the utility classes, and some styling is applied through your own naming conventions and CSS. The other option is to go all in on a utility library, that way you've moved all styling information away from CSS and into HTML entirely. It's not a scattered system anymore. I can't tell you if you'll love working with an all in utility library approach like this or not, but long-term, I imagine you'll be happier picking either all-in or not-at-all than a tweener approach. This is one of the definitions of Atomic CSS You can read about that here. You could call using a utility library to do all your styling a form of "static" atomic CSS. That's different from a "programatic" version, where you'd process markup like this: Lorem ipsum And out would come CSS that accommodates that. Utility Libraries Lemme just list a bunch of them that I've come across, pick out some quotes of what they have to say about themselves, and a code sample. Shed.css Shed.css came about after I got tired of writing CSS. All of the CSS in the world has already been written, and there's no need to rewrite it in every one of our projects. Goal: To eliminate distraction for developers and designers by creating a set of options rather than encouraging bikeshedding, where shed gets its name. Log In Tachyons Create fast loading, highly readable, and 100% responsive interfaces with as little CSS as possible. 27 July, 2015 Too many tools and frameworks The definitive guide to the JavaScript tooling landscape in 2015. Basscss Using clear, humanized naming conventions, Basscss is quick to internalize and easy to reason about while speeding up development time with more scalable, more readable code. Basscss v8.0.2 Low-Level CSS Toolkit 2.13 KB Beard A CSS framework for people with better things to do Beard's most popular and polarizing feature is its helper classes. Many people feel utility classes like the ones that Beard generates for you leads to bloat and are just as bad as using inline styles. We've found that having a rich set of helper classes makes your projects easier to build, easier to reason, and more bulletproof. Tools Beard isn't packed full of every feature you might need, but it does come with a small set of mixins to make life easier. appearance() turretcss Developed for design, turretcss is a styles and browser behaviour normalisation framework for rapid development of responsive and accessible websites. Elements A guide to the use of HTML elements and turretcss's default styling definitions including buttons, figure, media, nav, and tables. Expressive CSS Classes are for visual styling. Tags are for semantics. Start from a good foundation of base html element styles. Use utility classes for DRY CSS. Class names should be understandable at a glance. Responsive layout styling should be easy (fun even). Principles Do classes need to be ‘semantic’? Easy to understand + Easy to add/remove = Expressive Tailwind CSS A Utility-First CSS Framework for Rapid UI Development This thing doesn't even exist yet and they have more than 700 Twitter followers. That kind of thing convinces me there is a real desire for this stuff that shouldn't be ignored. We can get a peak at their promo site though: Utility Libraries as Style Guides Marvel As Marvel continues to grow, both as a product and a company, one challenge we are faced with is learning how to refine the Marvel brand identity and apply it cohesively to each of our products. We created this styleguide to act as a central location where we house a live inventory of UI components, brand guidelines, brand assets, code snippets, developer guidelines and more. Aspect Ratio Solid Solid is BuzzFeed's CSS style guide. Influenced by frameworks like Basscss, Solid uses immutable, atomic CSS classes to rapidly prototype and develop features, providing consistent styling options along with the flexibility to create new layouts and designs without the need to write additional CSS. WTF is Solid? What is Solid? Installation npm install --save bf-solid Download Source Files This is separate-but-related to the idea of CSS-in-JS The tide in JavaScript has headed strongly toward components. Combining HTML and JavaScript has felt good to a lot of folks, so it's not terribly surprising to see styling start to come along for the ride. And it's not entirely just for the sake of it. There are understandable arguments for it, including things like the global nature of CSS leading toward conflicts and unintended side effects. If you can style things in such a way that never happens (which doesn't mean you need to give up on CSS entirely), I admit I can see the appeal. This idea of styling components at the JavaScript level does seem to largely negate the need for utility libraries. Probably largely a one or the other kind of thing. So you need a CSS utility library? is a post from CSS-Tricks
https://css-tricks.com/need-css-utility-library/
0 notes
Link
http://ift.tt/2dg51zb
At the SMX Advanced conference in Seattle this year, Ranna Zhou from Google, Scott Sala from iProspect and Paul Shapiro from Catalyst all took deep dives into Accelerated Mobile Pages (AMP). In today’s post, I’m going to share some of the great information that they provided on the topic.
AMP’s expanding ad coverage
Ranna Zhou, Google product manager for AMP, was the first to speak. She talked about AMP ads. This is an important topic because the monetization of AMP has been one of the big concerns about it from the very beginning. She shared some interesting data about AMP ads.
First up was some market data. There are already more than 2 billion AMP pages that have been implemented across more than 900 domains. More and more companies are coming on board, too. Some new partners include Yahoo Japan, Baidu, Sogou, Tencent Qzone (640 million active monthly users) and Weibo (313 million active monthly users). Zhou also shared one case study, for Ali Express, which reported a 10.5 percent increase in conversions and a 27 percent increase in conversion rate on their site.
She then went on to discuss AMP ads. Google’s display ad network, DoubleClick, reports that 90 percent of the publishers using AMP ads are seeing higher CTR, and 70 percent of them experience higher eCPM with AMP ads over regular ads. Google AdSense has implemented AMP Auto Ads:
AMP has also began to implement support for video ads. You can read more about AMP support for video ads here.
Another key in AMP advertising is crypto-signing and validation. This allows the handshaking to take place to show that an ad response is a valid AMP ad by sending a cryptographic signature for the ad along with the response. In the process, the ad gets validated and signed before serving it.
AMP ads are far more lightweight and faster, and Zhou shared some data to back that up:
She also told us that AMP ads use 80 percent less battery than non-AMP ads. Zhou also shared that native programmatic display advertising provider TripleLift is supporting AMP — and is showing some great results:
There is now the ability to select the AMP version in DoubleClick by simply clicking a radio button. Google is also working with MOAT to offer real-time multiplatform measurement. This will make the results of AMP campaigns easier to measure, allowing marketers to quantify how consumers interact with AMP advertisements.
Creative platform Celtra is also jumping on board with supporting AMP. They are one of many companies making that leap:
Innovation is continuing in the AMP format. Form support is now available with <amp-form>. Here are two examples illustrating that in action:
Last but not least, she spoke about <amp-bind>. Using this, you can add custom interactivity to your pages beyond using AMP’s prebuilt components. It’s a fast way to do that using a safe subset of JavaScript.
Motor Trends case study
Next up was Scott Sala from iProspect. He shared a case study for Motor Trends, based on their launch of AMP in July 2016. They initially launched AMP on half of the site’s content. After about one year, the growth of mobile traffic is outpacing that of the site overall:
Organic traffic increase: 85 percent
Mobile organic traffic increase: 124 percent
AMP’s share of mobile grew dramatically as well:
The details of this traffic growth, and the rise of AMP as a portion of that traffic, makes for an interesting chart:
Sala also provided a really interesting look at the promises of the AMP platform and the actual results they obtained. Here is a quick view of that:
However, they dug into the causes for some of the negatives shown above. For example, as most publishers do initially, Motor Trends built AMP pages like classic landing pages, without an optimized funnel.
As for the lower CTR (click-through rate)? You might think that their presence in the AMP carousel should make CTR go up. But what happened is that with the carousel placement, they got 6.5x the impressions, and the SERP often showed two impressions at a time, and that drove lower CTR.
Then there is the question of how bad the bounce rates were. They were up to double the rate at times. Sala’s sense was that this was partly because they did not design an experience to help users go deeper. Still, their visitors were in fact reading the content, so the visits they were getting were not useless visits.
It took some effort to figure out how to best monetize the AMP traffic. In the first four months, AMP eCPMs were 11 percent lower than their regular ads, but in the time since November, they are now 4 percent higher than regular ads.
Next up, Sala shared some of the speed bumps they encountered. For example, at one point their Ads failed validation, and they lost AMP visibility for two weeks. It also took awhile to sort out implementation of content add-ons. They ended up hacking to precheck all image slideshows, awards inserts, spec charts, videos and callouts before they were implemented in content.
It also took awhile for them to sort out their priorities. The lesson in all this is that you need to treat your journey into AMP as an iterative process. You’ll learn to adjust over time.
Deep dive into AMP coding
Last but not least was Paul Shapiro of Catalyst. He went through AMP coding practices in some detail. It was only a few months back when AMP support for forms was quite weak, but great strides have been made in this area recently. For that reason, I’m going to discuss AMP forms in some detail here.
To start, you’ll need to include the amp-form-0-1.js file in the <head> section of your web page as follows:
Not all tags are permitted in AMP forms, as illustrated here:
Next up is deciding if you are going to use the “Get” method or the “Post” method for your form. Currently, it’s much easier if you use the Get method as shown here:
The user’s input is captured in the variable “s,” and this is passed on to the search function to execute. This particular form uses the standard “action” attribute, which can only be used with the Get method. In addition, the “target” attribute must be set to either “_blank” (which opens a new window) or “_top” (which renders the results on the same page).
Implementing a Post method form in AMP is far more complex. For it to work, your request must be an XMLHttpRequest request, and it must follow the AMP CORS spec.
This requires a custom endpoint, and the code for that is quite complex. You can see a snapshot of that here:
By the way, if you’re into understanding the coding in detail, do go to the link shown or click here, and you can get the full source code.
Now that you’ve done this, you can finally put together your form code, as follows:
Note that we did not use the standard “action” attribute, and instead used “action-xhr” and the script was set to mailchimp-post.php.
We also specified the “amp-mustache” template type, and this includes a tag called which gets sent back by our endpoint as a JSON object.
Once the form is submitted successfully, the email address gets embedded into the thank-you message shown above.
Shapiro also dug into many other areas of AMP coding, which you can see by diving into his excellent presentation (see below). These included:
Amp Analytics
amp-list
amp-bind – adds more interactivity to AMP pages, for stuff you want to use JS for, but can’t
amp-live-list, pulls live content in at certain time intervals via external endpoint
amp-accordion, for menu elements
amp-iframe, used as a hack to insert anything that does not otherwise work with AMP
amp-lightbox, for pop-ups
Validation
Some opinions expressed in this article may be those of a guest author and not necessarily Search Engine Land. Staff authors are listed here.
via Search Engine Land: News About Search Engines & Search Marketing
0 notes