#They're like a dark web(store edition)
Explore tagged Tumblr posts
Text
The Slytherin trio(Barty, Evan, Reg) after running away from their rich families and living together at an apartment Reg got under his name not used to not having moneys so they made a plan and use their expertises to hustle in Hogwarts:
Reg being a god at potions and herbology, money maker, with a businessman's mind, with good manipulation tactics to make his products the 'it' factor😌 selling anti-sleeping potions (ravenclaws are his no.1 costumer with this), anti-nighmare(Slytherins, this is also why no one at the greenhouse messes with them), prank goos and other pranksy stuff(surprisedly this is a hit at the Huplepuffs), and anti-talking(the Gryffindors adored him for this one, I wonder why?👀) and other good stuff and convinces you to buy and agree to shit like he's Ursula and Dr. Facilier at the same time.
Barty selling his notes (he's got 12 owls, this bitch is smart), making his assignment duplicates and altering them with and altering spell he somehow knows, tutoring shit, making his mind open with answers at the exam and letting people enter, matchmaking king, he's Hogwarts cupid, he also does extra background checks for your crushes to see if they have red flags😌
Evan master at conviction and charm, he is rented for breakups because he can somehow make bad things sound like a dream, master at reasoning people need him when they want to win a fight, the messenger god, here to bring message from people are too cowardly to tell someone, sometimes people go to him to help the confess and barty is bitter because 'that's supposed to be his costumers Ev'.
They also have other deals, and can deal with your shit, so if you have a problem go to the trio for help, need to humiliate ur ex cuz he cheated? they've got you!!! Need your parents to never know the shit you do at school??? they'll cover!!!Need to kill someone but torture them brutally first???well...*looks to cannon* sorry not today
They also sell tea about people, they know shit, they know her ex's boyfriend's secret mistress, AND BLACKMAIL!!! Don't forget that they'll sell it at a high price!!! but if you need it, you know where to go!!! They can also get you out of trouble, no one knows how they'll do it but whatever they do works!!! They can prank someone you hate at a reasonable price (and they don't get caught unlike some people 🙄)
Regulus also got their business legalized(idk how he did it he's just that awesome) and have documents and does all thing legally (loopholes baby) with processes of contracts before agreeing with a client so something can't go wrong (and the teacher can't do about it) HAHSHSHAH
Pandora and Dorcas fully support them They're the managers and handles a lot of shit we don't talk about😌😏
Imagine Sirius' reaction when he finds out not only his brother run away but he also runs a sketchy yet legal(?) business with his friends and they're thriving JAjsjajajaHAJAHAHAH Remus at the background impressed about the whole thing and James drooling at Regulus' business suit atire AHAHSHAHAGHAAH Peter is a honorary member for being an investor with secrets, blackmails, and gossip that he adds
#They're like a dark web(store edition)#imagine themhaving a throne room at their store#looking gloomy dark witch academia style#Jajsjahaj#love them#regulus black#hp marauders#jegulus#regulus headcanon#james potter#marauders#harry potter#sirus black#hp#slytherin skittles#evan rosier#rosekiller#bartylus#dorcas meadowes#pandora lovegood#emerard 5#slytherin#slytherpride#starchaser#sunseeker#sirius and regulus#sirius orion black#sirius black#remus lupin#regulus x james
464 notes
·
View notes
Text
New Recruit? (Miguel O'Hara)
pairings: Miguel O'Hara x Filipino F!reader
summary: You're the Spider-woman in your universe and you recall the day when you met Miguel.
edit: I've added an accurate translation so you guys wouldn't google it anymore!!
Part 1 - Part 2 - Part 3 - Part 4 (COMING SOON)
————————————————————————————————————————————
You could remember how you met him, how you met Miguel O'Hara. It was the usual day for you except it wasn't because it was your little cousin's birthday.
.
.
.
You were helping your tita's with cooking because they were throwing a big party that could pass into a charity program. The house is full of people who was switching between cooking and setting up the house for the party.
With a sigh, you chopped your 10th carrot of the day, shouting at your male older cousin to tone down the karaoke. It's nothing new to you, except last night you were fighting a villain who drained all your energy for today's celebration.
"Hoy! Ang aga aga pa ah! Marami pang tulog!!" You exclaimed, glaring at the young man before continuing your chopping. (Hey! It's early in the morning! There are a lot of people who are still sleeping!)
"Ay nako, ineng. Ang aga aga high blood ka." One of your tita's chirped, the one who was peeling the carrots beside you. (Oh my, child. It's early in the morning and your blood pressure is high already.)
"Ay nako, tita. Tottoo naman kasi. Ba't nga pala ang gara ng handaan netong pinsan ko eh 2 years old pa lang naman yan." You scoffed, chopping the carrots faster. (Oh my, Auntie. It's true, no lies. Anyways, why is my little cousin's birthday party so much when they're literally 2 years old.)
One of your older Tita's looked at your state, you look like you haven't had any sleep yet, dark circles around your eyes. "Ineng, halika ka nga dito." She ushered you, making a come here motion with her arms. (Child, come here.)
"Bili ka nga muna ng juice dun sa baba, kay na aling Bebang." She ordered, getting her coin purse in her pocket and giving you 50 pesos. (Buy some juice down the street, in the store of Bebang.)
"Tita naman, ako pa talaga uutusan, bakit ako?" You scratched your head before heading out, making sure you have your necklace with you. (Auntie, why am I always the one running errands?)
You passed by the karaoke and glared at your cousin before warning him. "Pag-alis ko dapat hindi ko maririnig yang boses mo na nakakabwiset ha." (When I leave I shouldn't hear that annoying voice of yours.)
You put on your slippers and exited the gate, walking towards where the sari-sari store is. You were halfway there when a string of loud shouting filled your ears. Your spider senses went crazy and you searched for a place to settle.
You went to the alleyway filled with garbage and tons of cartons before checking if there were any CCTV cameras. You smiled when you saw nothing and pressed your necklace, creating a holographic suit over you.
It was the one you used when an emergency happens like this. You shot a web from your wrist and swung away, finding the source of the screams. Your spider sense tingled when you saw a weird-colored guy who seemed to be glitching, he resembles one of your enemies but you can't get your mind to remember.
You swung your way there and began examining the area. You squinted your eyes at the sight and began evacuating people. "Hoy!" You shouted, shooting a web at the guy, your eyes widened when he turned around.
He looks like your tito, and it looks like he was the one causing the commotion. You gulped before you fixed your stance, readying yourself for a fight.
Your mind raced with questions, your tito was dead- why is there a carbon copy of him in front of you? You watched him die in front of you- you watched him get shot.
You pushed away your thoughts and remembered your job, swinging by the buildings and shooting webs at him. The man looked at you before he aimed at you with his fingers, lightning coming out of it.
You easily dodged it at first, swinging by trying to get him stuck. He continued shooting lightning toward you, dodging your webs.
You clicked your tongue in annoyance before you noticed that the electric post was hit by the lightning he shot. You quickly shot webs at the post and steadied it, saving the people near the post.
"Ano bayan?! Alam mo ba kung gaano katagal ayusin ni Meralco 'tong mga to?!" You huffed, looking at the damaged wirings. (What is that?! Don't you know how long it takes for Meralco to fix these things?!)
"Ilang araw na naman kami walang kuryente neto." You shook your head, shooting at the near building and lifting yourself up. (We won't have electricity for the incoming days.)
You thought twice about the situation, he seems to have the same ability as your enemy Electra but for some reason, has the same face as your uncle.
You watched as he started flying, you knew what to do when it comes to flying enemies. You smirked before swinging towards him, pouncing at him mid-air as he lost his balance.
"Hey! Get off me!" Your eyes widened when you heard him speak English. He shot lightning bolts everywhere, wrecking most of the building insight. You huffed and webbed his hands, only for him to zap you with the other.
You flinched at the lightning, making your whole body fall to the ground from the damage. Your fingertips were quite burned and most of the part holographic suit where he shot you was missing.
You grit your teeth together and tried to stand up, "Tangina naman." You swore, getting up from the ground, the missing suit was now materializing once again. (You son of a bitch.)
Just as you were about to stand up, a weird portal opened up, you furrowed your brows together as a person came out of it, he rushed towards your enemy and began fighting him.
The portal closed leaving you stunned, you watched as they wreck more of the buildings. Sighing you started evacuating the people whose houses were getting disintegrated. "Tangina! Ayusin n'yo naman!!" You shouted, swinging and dodging the falling cement. You saved all the people and decided to help the masked man. (Son of a bitch! At least be careful!!)
"Hell-O!!" Your voice screeched when a bolt of lightning was almost shot at your head, luckily you ducked just in time. "Focus on the fight." He groaned, hitting his back at the building.
Your ears perked up at his voice, "What?" You asked, your voice full of Tagalog accent. "What do you mean what? Don't you speak English?" He retorted, getting up and dusting his back.
'Aba, tangina neto ah.' you thought, "I can speakining in dollars just fine." You scoffed, rolling your eyes at him. "Doesn't look like it." (Tsk, this son of a bitch.)
You shot him an irritated glare but decided to play along. "You are right. No habla engles." You said with a broken English and Spanish accent. (I don't speak English.)
"Tu hable español?" He asked, sounding amused at your broken Spanish accent. "Ah, eh, ih, oh, uh... Sí?" You replied, understanding his words. (You speak Spanish?) (Yes?)
"Maiintindihan mo talaga syempre, ikaw ba naman, sakupin yung bansa mo ng espania ng 333 na taon." You scoffed, joking to yourself. "What was that?" (Of course you will, imagine getting your country colonized by Spain for 333 years.)
"Mga Español nga naman. Nothing, I said nothing." You replied, shooting a web at your uncle look-alike's face. (Spanish people, am I right?)
Now that he was distracted by your web, you used the opportunity to start webbing him up, putting him in a cocoon-like web. You shot webs from the buildings and stuck him in the air.
Now that the both of you are side by side, you noticed how much taller he is than you, given that most Filipino has short genetics. "Tangkad mo naman..." You whispered to yourself, rolling your eyes. (You're so tall...)
"Okay, now that the fight is finished. Care to tell me who are you?" You asked, knowing that he isn't from here. "Isn't it obvious?" He asked back.
"Luh." You replied to his sassiness. "You're not from here, are you? I mean come on..." You squinted your eyes as he threw something at the enemy.
"Miguel, Miguel O'Hara." His voice scratched that part of your brain, making your guts flip. "Uhh- I'm Y/n, Y/n L/n." You introduced yourself with a smile.
"Hey! I was talking to you!" You glared at him, "I'm from another universe." He replied as a red screen like started forming around the enemy. "No shit." You scoffed, crossing your arms at him.
"You know, I was planning on recruiting you," He started "Recruit me?" You asked. "It's better if I just show you." He then clicked on his watch and a portal appeared.
You stayed silent, "I got trust issues." You simply stated, looking at the portal in front of you. "But... I don't want to prepare for my little cousin's birthday so I'm gonna go."
He hummed at your words, "Let's go then." He walked towards the portal, you following him behind. As soon as you entered the portal, it felt like you were sliding, your heart almost fell.
"PUTANGINA!" You shouted, traveling between the multiverse, shutting your eyes close as you tried to calm yourself. Repeating cursing and praying. "Lord, alam ko na masama akong tao pero wag n'yo pa po ako patayin." (SON OF A BITCH!) (Lord, I know that I'm a bad person but please don't kill me yet.)
"Lord, magsisimba na po ako araw-araw hindi na po ako mangbabackstab ng mga kapitbahay, hindi na ren po ako makikipag chismisan sa mga tita ko, Lord wag muna." You repeatedly prayed, doing the sign of the cross a lot. (Lord, I will attend mass everyday, I won't talk shit behind people's backs anymore, I won't gossip with my aunties anymore, Lord please just don't kill me yet.)
You fell with a thud, breaking you from the trance you are in. You slowly opened your eyes and immediately clasped your hand together. "Lord, salamat po Lord, kahit ilang beses na kita sinabihan na patayin n'yo nalang ako dati." (Lord, thank you so much Lord, even after many times of asking you to just kill me in the past.)
You nodded your head and raised your clasped hands. "Are you done now?" Miguel asked, amused by your antics. Your eyes trailed up at his, his mask long gone.
"Gago, gwapo ka pala." You covered your mouth instantly, getting up and patting your backside. "Did you just call me handsome?" (Oh, you're handsome, asshole.)
"Whaat??" You turned to him, "I didn't, you wish." You replied, making your mask disappear too. "So, where are-"
You stopped mid-sentence and were surprised at the number of spider people hanging around everywhere. "Wow." You muttered.
Miguel started at you, he knew how you looked way before he met you but this time you looked different, you looked way more tired than originally and your hair looks like you haven't taken a bath for weeks. He cleared his throat as spoke.
"I know you know about the multiverse, given that you have an experience with it, I decided to recruit you." He explained, his accent giving you chills. "How'd you know?" You raised an eyebrow at him. "I just do." He shrugged, "Oh, and welcome to Spider Society."
He started walking and you immediately followed, catching up to him. "I was creating a portal to the multiverse by the way, if I didn't meet you I'm sure I'll be finishing it in 4 months or more." You stated.
"Your suit. What is it made of?" He asked, seeing how you just made your mask disappear. "It's holographic, I use it for emergencies." You answered with a beam.
"I see." He kept his answers short, "What about yours?" You asked before you glitched, falling into the ground with a thud. "Aray ko." You muttered, putting a hand on your head. (Ouch, that hurt.)
Miguel looked back and realized he hadn't given you a day pass yet. He threw one at you before saying something. "That would keep you from glitching." You picked it up and wore it. "Thanks." You thanked him, standing up.
"My suit is also holographic." He answered your question before you glitched.
"There's a lot of spider people in here, huh?" You asked, in awe at the view. "Sure is. I'm sure you know a lot when it comes to the multiverse, I'm looking forward to working with you."
The way his voice sounds makes you feel weird, "Oh, uh- I don't know what you're talking about?" You felt unsure, "You graduated with flying colors, someone who has experience on and off the field, you'll be a perfect recruit for this." He said, walking towards the elevator.
"Thank you, really. I'll think about it." You said, walking upside down now because of the elevator. "So uhm... " You tried to talk but nothing came into your mind. "Who was he? You know, the man who came to my universe? He looks just like my uncle."
He looked at you, pressing the top floor. "As I said earlier, you have a fair share of knowledge about the multiverse. I know you know the answer." He answered, looking at your eyes that seemed to be darting everywhere.
"What universe is he from?" You asked, fiddling your fingers. "Earth - 36910," he answered as the elevator stopped. The both of you walked away from the elevator, a ton of spider people greeting Miguel and he just grunts or nods in reply.
As Miguel toured you in his universe, he explained and educated you more about what's happening in the multiverse, hours passed and you remembered the celebration.
"Shit, it's been 4 hours already?" You clicked your tongue as you made a part of your wrist into a holographic watch. Miguel looked at you before you spoke once again.
"It's been great and all, Miguel, and I really do appreciate the offer, but right now, I need to go back to my universe before my tita unleashes hell on everyone." Miguel nodded, getting something from his table and giving it to you.
"Come back to us when you're ready, we'll be waiting for you." He simply said, the warm tone of his voice makes your heart speed up.
"I will," you smiled, putting on the watch and typing your universe, opening up a portal. Walking towards the portal, you turned back at him last time. A smirk spreads on your face.
"Don't miss me too much, Gwapo!" You laughed, winking at him before the hologram covered your face. Running into the portal with a wide smile. (Handsome.)
Miguel was left in his office, a small smile forming on his lips as he recalled everything that happened. "Lyla." He called his AI.
"What now?" Lyla materialized in front of him, crossed arms and a small teasing smile on her face.
"When will her canon event happen?"
.
.
.
a/n: I'm accepting requests and so far I got one request and it's ongoing!!
#atsv miguel#marvel#miguel ohara#miguel ohara x reader#miguel ohara x you#spiderman 2099#spiderman marvel#astv miguel#spiderman#atsv#miguel x reader#spider man#across the spiderverse#oscar isaac#miguel ohara fanart#miguel ohara imagine#oscar isaac imagine#miguel ohara fanfiction#oscar isaac fanfiction#into the spiderverse#atsv x reader#atsv x you#astv fic#miguel x you#spiderman across the spiderverse
221 notes
·
View notes
Text
I made an @ellipsus-writes account yesterday and with one day under my belt here are my first impressions.
It's basically Google Docs, but without being associated with Google. You're able to edit documents from any device with a web browser, which is a lot more convenient than the WebDav server I'm currently using.
Things that are less than ideal:
There aren't a lot of customization options. You can switch between light and dark mode, but I would like to be able to set my document backgrounds to a color. Also it would be better if you could change your view layout. Right now it looks like this:
and I would prefer to have these documents in a list, rather than these big bubbles. The bubbles might be cool if you could change their color or add an image background to them, but as is they're just boring white and taking up a lot of space. I have only 12 documents in this folder and it's a bit silly that I can't see them all at once.
2. You might also notice that these documents appear to be in a completely random order. They're actually in the order I last edited them in. I prefer my documents to be in alphabetical order, and this is an option that exists, but a) when switching to this view it for some reason defaults to reverse alphabetical order and I then have to manually select regular alphabetical order, and b) this setting will not be remembered between sessions.
3. I can't seem to get rid of the, "Need help? Chat with us" popup at the bottom of the page. It takes up an annoying amount of space, and I wish it was collapsible.
Things that worry me:
Instead of having a password system, Ellipsus sends you an email link every time you go to log in. There's nothing wrong with doing it this way I guess, since you can access the link from the same device you're accessing the website from, but it kind of just smacks of being different for the sake of being different. Makes me worry about security. Not that I write anything worth stealing.
Instead of having a normal profile system, Ellipsus uses Gravatar, which is some "universal internet account" nonsense that I will absolutely not be using. This probably won't be a huge issue, though, as I don't really plan on using the collaboration tools, so I won't need to make a profile. I wish I could change my email address, though, as I accidentally used the wrong one to make the account. I might make a new account.
I don't understand how all this is being paid for. There are no ads, the account is free, but the hosting is all done by Ellipsus. While text does not take up a ton of space to host, it does take up some space, and that costs money. Are the creators doing it out of their own pockets? Do they have a donor? Will there be donation drives to support it later? Or will they adopt advertisements in the future or introduce a "premium" option where you can pay for additional features? The last one normally wouldn't worry me, but since it is currently so bare-bones I'm a bit antsy. What if you have to pay for the option to have your documents in alphabetical order by default?
Their advertising is. Vague. I put this off for a long time because looking around on their website there was a lot of talk about how you're a writer and super creative and also they'll never steal your data to train AIs, but it was really hard to find a place where it outright said what the product was. This concerns me because it makes me feel like the company has something to hide.
Good things:
It's a platform that does the same thing as Google Docs without actually being Google Docs. This is a powerful pro. I'll probably keep using it for now.
Oh yeah and they don't have an app. A few years ago this would have gone in the less-than-ideal section for me but these days with the way app stores are about user generated content it's probably best to avoid the whole thing. I followed their suggestion to set a link on my homescreen (through Firefox) and it works very well. I was worried it might be laggy (Tumblr was laggy when I used it through Firefox) but it's been very responsive. No server access if you're not connected to the internet, but if you have the document already open then you can keep typing into it and it will update when you reconnect. This is the same way I used Google Docs back in the day and perfectly serviceable in my opinion.
#idk if the team will read this but if theres one thing they take from it its clean up your advertising#its all over the place#what service are you offering. say it in plain language
8 notes
·
View notes
Text
I turned The Cat-Man as seen on the first page of his first comic into transparent art.
You can download the HD version here from the web archive, Cat-Man is public domain, and I hate capitalism, so all art I make of him will also be public domain! The link also has all the other variations of this I made in the process (Currently 23 files total lol)
And you can buy it from my Threadless store.
In the original comic panel the blue part of his outfit are like, pale blue, but in the rest of the panel its dark teal, so I made it teal to match. also I had to fix his other foot since it was cut off partly in the original image.
(Edit: Actually, it's possible the blue is meant to be black? in the second story in his first comic, they're using blue in place of black...)
The Cat-Man is public domain, and you can read his comics for free here! If anyone buys the design from my Threadless store, I'll donate part of the money to the website so they can afford to keep hosting the comics :)
[ID: A tranparent image of The Cat-Man with a thick white outline. The Cat-Man is a vintage superhero with a long-sleeved leotard with an orange torso and red gloves, a red belt with a yellow buckle with a black cat face on it, and a dark teal bottom section that ends at the upper thighs, with matching teal boots. He has a teal mask that covers his face except for his mouth and nose, with pointed ears, and a teal and red cape. On his chest is a ceam colored letter C with a black cat head inside it. Behind him is bold block text that says, "The Cat-Man". End ID.]
#free art#art you can buy#Threadless#The Cat-Man#Cat-Man#The cat man#cat man#vintage superheroes#public domain characters#public domain art#Rjalker does art#it counts
4 notes
·
View notes
Text
A Spelljammer Buyer's Guide
"Spelljammer's confirmed! Great! But," you say, "what does that mean, exactly? What is Spelljammer?" Here is a list of the core TTRPG products in the Spelljammer line, so you can get in some reading ahead of the slipcased set dropping in August.
All of these boxed sets and books were written for 2nd Edition AD&D, so they come with the caveat that most of their rules are outdated, and a lot of the material hasn't aged well.
Where can you get these things? The DM's Guild is having a Spelljammer sale until May 30 at 10:00 a.m. Eastern. The boxed sets look like they're priced at $6, and the saddlebound softcovers at $3 each, with the exception of the core set ($10) and the War Captain's Companion ($8). If you're looking to lay out quite a bit more money for an original print, you could check eBay or Amazon, or trot down to your Friendly Local Game Store. If you don't want to spend any money at all, I am sure you can find pirated copies on the Web with a little effort, but I'm sure I don't know where.
The list below is organized in original print order.
Without further ado, I Have Opinions!
Spelljammer: AD&D Adventures in Space is the core box set. I consider it essential for the chapters on creating planets and star systems. It also outlines a wide variety of spelljamming engines, describes many ships, and introduces a few core monsters such as the arcane and the neogi. The character rules are obsolete and both the spells and the monsters are going to need revision.
SJA1: Wildspace is an introductory adventure. Groundling adventurers sign on to a ship to find and destroy a superweapon developed by the beholders. Twists and turns and swarms of beholders await. Fun, but not essential. Adaptation could be tricky because beholders are way more powerful these days.
SJR1: Lost Ships contains a chapter clarifying rules for adventures in space, including drifting, messing about with ropes, and tethering items to you. It also includes some new equipment and a few proficiencies. The bulk of the book is a few loosely-connected adventures which can be easily adapted. The new ships and monsters were reprinted in later products. I recommend picking this up for the expanded rules, equipment and adventures.
SJA2: Skull & Crossbows is a collection of a few adventures. You may find the quality is irregular. Not essential.
MC7: Monstrous Compendium Spelljammer Appendix (I) is the first of two monster books. This is where the giant space hamster is found. It also contains a lot of beholder-kin and more asteroids with giant jaws than I can shake a stick at. I would recommend this book, but it's not essential.
SJA3: Crystal Spheres details four new crystal spheres. The heir to the throne of Thesalys hires the PCs to foil the plot of the vampire T'Laan to snuff out Thesalys' sun. Metal.
SJR2: Realmspace details Toril's sister planets. The best part of this book is the Batship, illustrated on the cover, which can swing its hind parts forward to ram other ships. It's probably of interest to Realms campaigns, not so much to others.
MC9: Monstrous Compendium Spelljammer Appendix (II) is the second book of monsters. It reprints a few monsters from the books above, and adds a lot more. The business-oriented penguin creatures called dohwar appear here, together with the scro and their megaweapons, the witchlight marauders. The aperusa are pretty stereotypical Travellers, telling fortunes and picking pockets, so they haven't aged well. Like the first volume, generally very useful but not essential.
SJA4: Under the Dark Fist is the first real effort to write a Spelljammer setting without any prior settings getting involved. The Vodoni, a group of interstellar wolfmen, are getting set to expand their empire. Useful for the lore, but perhaps a bit derivative.
SJR4: Practical Planetology is a collection of planets and new monsters to live there. They're intended to be placed into a Spelljammer game as the DM desires. Pretty useful, pick it up if you can.
The Legend of Spelljammer is the second boxed set, and finally details the giant ship, the Spelljammer, which is teased in the core set with a few paragraphs and a large-scale map. Perhaps nothing they could have written would have lived up to the hype, but the actual content still feels like a let-down. Get it for the new maps, but consider rejecting its reality and substituting your own.
SJS1: Goblin's Return details the Unhuman War and establishes that it took place centuries ago, and ended when the elven Imperial Navy nearly wiped out the goblins. It reprints some monsters from MC9, above. Get it for the Unhuman War meta-plot lore, but your mileage may vary on the rest of it, although the adventure is essentially an espionage mission, which feels like a change of pace.
SJQ1: Heart of the Enemy follows on from SJS1, above, and is a whopping 96 pages long. The scro are preparing to unleash a second Unhuman War, and they have their own planet-destroying superweapon... yep. They only lack the key that turns it on, which the party has to race to find while trying to ferret out a spy in their midst. This one's up to you. I could do without it.
War Captain's Companion is the third box set. It includes new spelljamming rules, including a set of proficiencies that contradicts those that came before, 64 pages reprinting every spelljamming vessel from the products above and adding a few new ones, and a tactical combat game. I would get it for the ships.
SJR5: Rock of Bral is essential, in my opinion. It details a city in the stars, which can serve as a home base for the party and a site to play politics in, as Prince Andru is suspected of doing in his family to seize the throne. Some parts of it have not aged well, because it includes a neighborhood of Shou, from the Forgotten Realms, and they have a branch of Yakuza that vies with the other thieves' guilds in the city for dominance. But they can be omitted without harm to the overall book, I think.
CGR1: The Complete Spacefarer's Handbook is also essential for its advice on the day-to-day running of a spelljamming vessel and on developing a Spelljammer campaign. Its character rules are obsolete, and its set of proficiencies again contradicts what has come before.
SJR6: Greyspace is Greyhawk's turn in the spotlight. Greyspace is notable because it is geocentric; Oerth is stationary and everything orbits around it. Useful for a Greyhawk campaign, not so much besides.
SJR7: Krynnspace is the system book for Krynn and Ansalon. It is much like Realmspace and Greyspace.
SJR8: Space Lairs is cooking with propane, again. It has a large number of useful locations, each with a small adventure attached, which the DM can drop onto their map as they see fit. I strongly urge you to consider picking this up.
The Astromundi Cluster is the fourth and final box set for Spelljammer. It uses three booklets to detail an entire crystal sphere, in a level of detail not seen before. I was disappointed that the booklet Adventures in the Shattered Sphere did not reveal that the crystal sphere itself was broken, a thing long established as impossible but which would have been so awesome. I would pick this up, especially if you skipped Under the Dark Fist and/or Goblin's Return/Heart of the Enemy, because it has some great lore.
And that's it! Go forth and have fun!
18 notes
·
View notes
Text
JPG Compression
"I've heard a lot of confusing stuff about JPGs. Some people tell me they're perfect for online photography, and other people warn me that when I convert my pictures to JPG, I'm going to throw away most of the quality of my picture! I don't want to ruin my pictures, so should I be using JPG?" There's a grain of truth in both sides of this question, actually. Yes, JPG Compression does throw out information in your picture. The good news is, most of the time, you're not going to be able to tell the difference. JPG Compression works under the assumption that if two areas are almost exactly the same color, the average viewer is going to see them as the same color. If the entire area can be saved as one color, that's a lot less data to be stored in the file, and the compressed version becomes a lot smaller. Smaller images are important for both emailing and loading web sites. As an example, JPG compression might take a black shadow thrown against a very dark grey background, and remove the shadow, so that the entire area is roughly the same color. This is over-simplifying, of course. The end result is that fewer individual colors translate to a much smaller file. The danger with JPG is when a picture is compressed multiple times. One of the worst things you can do to a picture is to save it as JPG three or four times in a row, because each save will compound the quality lost. Just like a fax that gets forwarded or a photocopy of a photocopy, the quality of the picture will suffer. After a couple of rounds through the JPG program, it will be obvious where it decided to save space. For this reason, when you're editing your photos, always start with a lossless format (like PNG or TIFF), and don't convert your image to JPG until the editing is done.
0 notes
Text
Build Simple Authentication in Express in 15 Minutes
Building web pages with user authentication can be a huge pain. You typically need to set up some sort of database to manage users even if you're not using the database for anything else. You would then need to store their password hashes, and you almost need a degree on internet security to know the safest ways to do that.
What if I told you it didn't have to be so complicated? Using Okta and Express, I'll show you how to really quickly set up a website that has secure user authentication, without the need for a separate database. Everything you need you could deploy anywhere that you can run Node.
Creating a new app in Express doesn't take a lot of code. You'll need to set up your project structure and install some dependencies, which you can do with just a few commands:
mkdir new-project cd new-project npm init -y npm install [email protected] [email protected] npm install --save-dev [email protected] [email protected]
Edit the "scripts" section of your package.json to look like this:
"scripts": { "start": "nodemon .", "test": "standard" },
Now create a new file index.js :
index.js
const express = require('express') const path = require('path') const app = express() app.set('views', path.join(__dirname, 'views')) app.set('view engine', 'hbs') app.use(express.urlencoded({ extended: true })) app.use('/static', express.static('public')) // @TODO add auth middleware // @TODO add registration page // @TODO add logout route app.use('/', require('./routes/index')) const port = process.env.PORT || 3000 app.listen(port, () => console.log(`App listening on port ${port}`))
Make a few new folders as well:
mkdir -p public/images routes views
Put a fun greeting image in `public/images/greeting.jpg` that you will use to greet users.
Express allows for a templating engine. You already set up Handlebars (hbs) above, so now you can create a couple of views. One will be the HTML skeleton that contains the basic markup, and the other will be your homepage (the index view).
views/layout.hbs
<!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> <title>Simple Auth in 15 Minutes</title> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container"> <a class="navbar-brand" href="/">Navbar</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavAltMarkup"> <div class="navbar-nav"> </div> </div> </div> </nav> <main class="container pt-4">}</main> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> </body> </html>
This layout will get rendered for each view, with the specific view replacing the } tag.
Now you can create the indexview. This will just display the image you put in public/images/greeting.jpg :
views/index.hbs
<div class="d-flex justify-content-center"> <img class="rounded img-fluid" src="/static/images/greeting.jpg" /> </div>
To tell the homepage to use that file when rendering, you'll also need to create a router. You already required routes/index.jsin the index.js file of your app, so now you just need to create that file:
routes/index.js
const express = require('express') const router = express.Router() router.get('/', (req, res) => { res.render('index') }) module.exports = router
The call to res.render('index') tells Express to use the render the index.hbs view and respond with the results back to the client. You can also pass in some context, but it's not needed here just yet.
Now you can run your server with the following command (as you make changes, the server will reload and you'll just need to refresh the page):
npm start
Go to http://localhost:3000 to see your greeting.
You now have a simple web server with a homepage and a lovely greeting image. The next step I promised to show you is to add secure user authentication. This is where Okta comes in to play. Okta is a cloud service that allows developers to create, edit, and securely store user accounts and user account data, and connect them with one or multiple applications. Our API enables you to:
If you don't already have one, sign up for a forever-free developer account.
You're going to need to save some information to use in the app. Create a new file named .env in the root of your application. In it, enter your organization URL.
HOST_URL=http://localhost:3000 OKTA_ORG_URL=https://{yourOktaOrgUrl}
You will also need a random string to use as an App Secret for sessions. You can generate this with the following command:
npm install -g uuid-cli echo "APP_SECRET=`uuid`" >> .env
Next, log in to your Okta developer console, navigate to Applications, then click Add Application. Select Web, then click Next.
The page you come to after creating an application has some more information you need to save to your .env file. Copy in the client ID and client secret.
OKTA_CLIENT_ID={yourClientId} OKTA_CLIENT_SECRET={yourClientSecret}
At the time of this writing, the default application creation page does not allow you to add a Logout redirect URI, but you can add one after creating the application. After creating the application, click Edit, then next to Logout redirect URIs click Add URI. Add a logout redirect URI of http://localhost:3000 and click Save.
The last piece of information you need from Okta is an API token. In your developer console, navigate to API -> Tokens, then click on Create Token. You can have many tokens, so just give this one a name that reminds you what it's for, like "15 Minute Auth". You'll be given a token that you can only see right now. If you lose the token, you'll have to create another one. Add this to .env also.
OKTA_TOKEN={yourOktaAPIToken}
Add Auth Middleware to Your Express App
Okta provides some middleware that will give you information about whether the user is registered or not. It also gives you a login page by default at /login . Add the following dependencies:
In your index.js page, replace the // @TODO add auth middleware comment with the following code:
app.use(require('express-session')({ secret: process.env.APP_SECRET, resave: true, saveUninitialized: false })) const { ExpressOIDC } = require('@okta/oidc-middleware') const oidc = new ExpressOIDC({ issuer: `${process.env.OKTA_ORG_URL}/oauth2/default`, client_id: process.env.OKTA_CLIENT_ID, client_secret: process.env.OKTA_CLIENT_SECRET, redirect_uri: `${process.env.HOST_URL}/authorization-code/callback`, scope: 'openid profile' }) app.use(oidc.router)
Also, make sure to add the following to the very top of index.js . This needs to be there before any other code in order to load your environment variables, so it should be the very first line of the file:
require('dotenv').config()
Create a Registration Page
You should now be able to login by going to /login . This will redirect you to your Okta developer page, and after you sign in you'll be redirected back to the homepage.
For people who aren't registered yet, they'll need a registration page. At the time of this writing, Okta doesn't provide a registration page out of the box, but you can build one pretty quickly. Create a new view for your route:
views/register.hbs
<form method="post"> {{#each fields}} <div class="form-group"> <label>{{this.label}}</label> <input required name="" type="" class="form-control is-invalid" value="" /> <div class="invalid-feedback">{{this.error}}</div> </div> {{/each}} <button type="submit" class="btn btn-primary">Register</button> </form>
You'll also need a new route:
routes/register.js
const okta = require('@okta/okta-sdk-nodejs') const express = require('express') const router = express.Router() const client = new okta.Client({ orgUrl: process.env.OKTA_ORG_URL, token: process.env.OKTA_TOKEN }) // Take the user to the homepage if they're already logged in router.use('/', (req, res, next) => { if (req.userContext) { return res.redirect('/') } next() }) const fields = [ { name: 'firstName', label: 'First Name' }, { name: 'lastName', label: 'Last Name' }, { name: 'email', label: 'Email', type: 'email' }, { name: 'password', label: 'Password', type: 'password' } ] router.get('/', (req, res) => { res.render('register', { fields }) }) router.post('/', async (req, res) => { const { body } = req try { await client.createUser({ profile: { firstName: body.firstName, lastName: body.lastName, email: body.email, login: body.email }, credentials: { password: { value: body.password } } }) res.redirect('/') } catch ({ errorCauses }) { const errors = {} errorCauses.forEach(({ errorSummary }) => { const [, field, error] = /^(.+?): (.+)$/.exec(errorSummary) errors[field] = error }) res.render('register', { errors, fields: fields.map(field => ({ ...field, error: errors[field.name], value: body[field.name] })) }) } }) module.exports = router
To tie this all together, in your root index.js file, make sure to replace the // @TODO add registration page comment with the following:
app.use('/register', require('./routes/register'))
You can now have users register. If they run into an error, it will be displayed with the field that caused the error.
Add a Logout Route
At the time of this writing, Okta's middleware doesn't provide a default /logout route. Luckily, adding one is fairly simple. In your index.js file, replace the // @TODO add logout route comment with:
app.get('/logout', (req, res) => { if (req.userContext) { const idToken = req.userContext.tokens.id_token const to = encodeURI(process.env.HOST_URL) const params = id_token_hint=${idToken}&post_logout_redirect_uri=${to} req.logout() res.redirect(${process.env.OKTA_ORG_URL}/oauth2/default/v1/logout?${params}) } else { res.redirect('/') } })
If you're logged in, this will invalidate the token and delete the user's session. It will then redirect you back to the homepage. If you're not logged in, it just takes you back to the homepage.
Add Links to the New Routes in Your Express App
To more easily expose these routes to the user, you can add some buttons. You'll need to expose the user context to the view to know if a user is logged in or not so you know which buttons to display, and potentially greet the user.
In routes/index.js replace the res.render('index') line with the following:
routes/index.js
const { userContext } = req res.render('index', { userContext })
While you're at it, you can also prevent the user from seeing your greeting unless they're logged in. Change your views/index.hbs file to the following:
views/index.hbs
{{#if userContext}} <h1 class="text-center">Hi {{userContext.userinfo.given_name}}!</h1> <div class="d-flex justify-content-center"> <img class="rounded img-fluid" src="/static/images/greeting.jpg" /> </div> {{else}} <h1 class="text-center">Please log in</h1> {{/if}}
Now to add the buttons. In views/layout.hbs, replace the comment with the following:
views/layout.hbs
<a class="nav-item nav-link" href="/logout">Log out</a> <a class="nav-item nav-link" href="/login">Log in</a> <a class="nav-item nav-link" href="/register">Register</a>
Check out the final product to make sure it works
That's it! In just a few minutes, you went from an empty folder to a secure website with user registration and login. You didn't even have to set up a database! If you want to see the final code sample for reference, you can find it on GitHub.
If you'd like to learn more about Node and Express check out some of these other posts on the Okta developer blog:
If you have any questions about this post, please add a comment below. For more awesome content, follow @oktadev on Twitter, like us on Facebook, or subscribe to our YouTube channel.
via Scotch.io https://ift.tt/2AqUzm1
0 notes