#only text files on descs
Explore tagged Tumblr posts
Text
Week challenge with friends from the server
First prompt: Calendar Pin-Up
Starring Varnah! :D
Version without the calendar below:
#hordraomin#art#drawing#hordraomin oc#varnah#varnah g#varnah g.#oc art#krita#digital art#my art#anthro shark#digital drawing#I have not yet created a solid ref for her#only text files on descs#so i am not so sure about the butt-coloring seen here - the angle is too sharp compared to how all other ones look (hexagon vibe)
25 notes
·
View notes
Text
THE SIMS 3 TUTORIAL
HOW TO CREATE DEFAULT REPLACEMENT MOD USING CUSTOM MESH & TEXTURE FOR SIMPLE OBJECT
⚠️ Tumblr has 30 pictures limit, so I cannot include too many pictures. If you want to zoom in the pictures, click the pictures to enlarge, or save the pictures into your PC, zoom the pictures on picture viewer or zoom in the pictures on your mobile phone. ⚠️
----------------------------------------------------
I create this tutorial to make easier to follow because there are older tutorials available before but scattered on internet and usually only say "Export to replace s3asc" without explaining how to export the edited object properly.
My method is using TSR Workshop instead of exporting the object using Sims 3 Object Export/Import plug in because exporting to replace the s3asc using that plug in always giving error notification "ERR: Model has 1 groups; original had 0" and cannot be exported.
For beginners who are very new using s3pe and haven't created default replacement mod before, better start from simple object first.
Simple objects I mean in-game object that has single MODL and single texture with no morphs, no GeoStates, no presets, no CAS colour channels, and easily cloned from OBJD on catalogue. Usually as utensils that Sims holding in their hand, not buy/build objects. For example: Pencil, pan, fork, spoon.
----------------------------------------------------
Tools to prepare:
s3oc
s3pe
Milkshape 3D for bone assignment (Version I use 1.8.5 beta, discontinued by its developer, therefore feel free to download the full version with its license key provided).
Sims 3 Object Export/Import 1.01 by Wesley Howe (Milkshape plug-in. Download msS3ObjPluginsV101.rar )
TSR Workshop (Older version for TS3 only version 2.0.88)
TSR Workshop plug-ins for export.import TSRW Object.
3D Program (Blender/Maya/3dsMax)
Editing images software (Photoshop, make sure you have to install .dds plugin by Nvidia. For free software alternative, you can use GIMP with its .dds plugin)
This tutorial will not teach you how to:
Meshing object ❌
Create alpha texture ❌
Change thumbnails in-game ❌
Install programs and plug-ins ❌
This is how I created Chinese chopsticks replacement mod using custom mesh and texture.
In summary, this tutorial has 10 steps:
Step 1. Clone the Object using s3oc
Step 2. Open S3PE to Copy the Original Resource Code and Export the Files
Step 3. Export the Original Mesh as Base Mesh to .obj format
Step 4. Create Your Custom Mesh
Step 5. Bone Assignment & Create Group
Step 6. Create custom Texture
Step 7. Import the .wso of Edited Mesh on TSR Workshop & Export the package
Step 8. Export MODL file from Package saved from TSR Workshop
Step 9. Finalizing in s3pe & Replacing the Original file with Edited File & Correcting the Code As Same As Default Code
Step 10. Test the CC in your game.
-----------------------------------
✳️ Step 1. Clone the Object using s3oc
Before cloning the object, check the Game Folder for in-game object file location. Settings > Game Folders...
Take a look if the Base Game or Expansion Pack for object file you want to clone is in the right folder. For example, my The Sims 3 game are all bought from Steam, so the location is D:\SteamLibrary\steamapps\common\The Sims 3
If you want to clone object from Expansion Pack, make sure input the folder location. For example, the location for World Adventures EP is D:\SteamLibrary\steamapps\common\The Sims 3\EP1
If you are done, close the pop-up box. You can continue click Cloning then choose Normal Object...
Wait until you get the whole catalogue. Click Search...
For example, I clone object from World Adventures Expansion Pack. You can clone object from Base Game or other Expansion Packs as long it is considered as "utensil" that Sim holding on hand. For example: "Pencil" or "Pan"
Search for text: chopsticks
or if you want to clone object from Base Game, search: utensil
Tick check marks for Resource Name, Object Name, Object Desc then click "Search button"
Search result gives you results with name "chopsticks". Here is the object we are looking for: UtensilChopsticks
We need the OBJD file to clone. OBJD = Object Data.
Click "Clone or Fix" at the right bottom. Then you see the next page to determine if you want to clone with renumber or not. If you want to make default replacement, then do not check the Renumber box. Keep it blank.
Tick check box means the s3oc will generate new resource code for new item. Not tick the check means the s3oc will overwrite the same resource code, it is to replace object you cloned in-game.
I am personally a detailed person, so I usually tick as many as I want: tick "Deep clone" "Missing String Tables" and "Include Thumbnail" to include more details. Then click "Start" to proceed.
It will give you file name [CreatorName]_ObjectName_Number
Then save your package file in "DBPF Package" format in your project folder. Always make folder for any file to make everything organized.
✳️ Step 2. Open S3PE to Copy the Original Resource Code and Export the Files
Open S3pe, locate your package file you cloned from s3oc. Find the MODL of Utensil Chopsticks, Right-Click, "Details..."
On Resource Details, click "Copy TGI" to copy the Resource Code. Type, Group, and Instance will automatically be copied on clipboard. Then open Notepad, Right-Click to "Paste".
Click GRID on bottom of the s3pe (I mark it red on picture), it will give you pop-up box with Data Grid. Click "Resources", it will be highlight blue and there's 3 dots button appeared on the right side. Click the 3 dots button. It will give you TGI Block List Editor.
Inside MODL's TGI Block List Editor only has IMG. You may wondering why, but that's how the game coded. Type, Group, Instance of _IMG inside TGI Block List Editor should be the same as _IMG on the package.
Copy the TGI, Group, Instance to your Notepad.
After you copied code of MODL, do the same for the texture image (_IMG), but only copy the code from Resource Details. You cannot edit TGI Block List Editor for _IMG as the Grid button for _IMG is greyed out.
The main task is the code of your edited mesh and texture should be the same as the code you copied now from original package you cloned with s3oc.
Keep the code on notepad. You will need this code later.
Export the MODL file. Right-Click, "Export to s3asc". The file appears in long string such with name for example: S3_01661233_08000001_B619DB2238C3430B%%+MODL_filebase
Do not rename the file. Save.
Export the texture file. Right-Click "Export > To File..." The file will be saved in .dds format. Do not rename the file. Save.
✳️ Step 3. Export the Original Mesh as Base Mesh to .obj format
Open Milkshape. Import the s3asc file you saved before.
More steps click spoiler tag "Read More / Keep Reading" below
File > Import > Sims 3 Object Import v 1.01 by Wesley Howe
Locate the s3asc file, then the original chopsticks mesh appears.
Click the "Joints" tab. It has 4 codes. Check box "Draw vertices with bone colors" It will show Bone Assignment colors on the original mesh. Yellow on top chopstick and light blue on bottom chopstick. The colours are to make the object has rig and movement following the Sim's interaction.
Take a look at the 4 codes on Joints Tab. You can play around to see which colour of the code will appear, after that copy paste the code to Notepad to make it easier to comprehend.
Click Select from Tools menu, Select Options: Face. On "Right/Left/Top/Bottom 2D View", Left-click make selection of one part of chopsticks. While the part of object being selected (Red), click Joints then Choose "Assign".
0x96239247 --> Yellow 0xFEAE6981 --> Purple 0xCD68F001 --> Light Blue 0xD0DECA8E --> Red
Your edited mesh must have the exact same Bone Assignment colour later. Check again if the code and colour are correct.
You can save object mesh as .obj to other 3D software such as Blender or any other 3D software.
✳️ Step 4. Create Your Custom Mesh
Use the original .obj as base model. While you can create longer mesh or any edited version as you wish.
Make sure the scale and position of the edited mesh is same as base original mesh, because the edited mesh will be used on Sim's hand.
If you are done editing the mesh, export the UVmap.
You can export the uvmap in higher resolution, as long as it is Power of 2. 64x64, 128x128, 256x256, 512x512, 1024x1024, 2048x2048, 4096x4096. I export in 1024x1024 pixels to make the size of texture larger and have more details.
Then export the mesh object in .obj format.
✳️ Step 5. Bone Assignment & Create Group
Open Milkshape. Import the original mesh.
Check the Groups Tab. Original mesh has 1 group, "group 00". Group 00 means it is the main mesh. There is no shadow beneath the object.
Import the edited mesh as .obj file.
My edited mesh has one single name "default" name on the Group Tab. While edited mesh may have a lot of file name scattered on Group Tab. Regroup the file name to simplify your edited mesh into one single name. Select > Regroup.
The main task is replacing the EA's original mesh with your edited mesh.
Before you delete anything, you must do Bone Assignment first to the edited mesh you created.
Your edited mesh does not have Bone Assignment, so it appears white.
Remember the 4 codes you copied earlier in Notepad.
Copy Bone Assignment from original mesh to your edited mesh.
This case, your want to Bone Assign Yellow colour.
Select > Face to select one part of chopsticks of your edited mesh. On Joints Tab, double click the appropriate code 0x96239247 in blue highlight then the code box on the right side of "Rename" will appear 0x96239247. Make sure the code is correct. Then you can click "Assign".
Your edited mesh will appear in Yellow colour. Then do the same for another part of chopsticks.
Select another part of chopsticks of your edited mesh. On Joints Tab, double click the appropriate code 0xCD68F001 in blue highlight then the code box on the right side of "Rename" will appear 0xCD68F001. Click "Assign".
Your edited mesh will appear in Light Blue colour.
Then what's the other code for? With colour purple and red?
Leave them. Let the codes have the same exact codes as appear in original mesh and let the colours only assigned Yellow and Light Blue. The colours are to determine rig for interaction in-game, which only use Yellow as upper part of chopstick and Light Blue as bottom part of chopstick.
You can safely delete the original mesh with name group00 until it remains your only your edited mesh.
Rename your edited mesh to group00. Type group00 on the box then click "Rename" on the left side.
Export to TSRW Object in .wso format. .wso is format with bone assignment on object attached.
Save your .wso in your project folder.
✳️ Step 6. Create custom Texture
Import original texture you exported from s3pe to your editing image software.
Look at the original texture made by EA. 32x64 pixels. It is very low resolution, blurry and stretched, because the texture should be compressed as low as possible by game designer. As player you want it has higher detail to look realistic as possible and your PC of course can handle high resolution content, sure you can make the resolution much higher than EA's.
Import the UVMap you saved from 3D software. For example, UVmap I imported has 1024x1024 resolution. Add your custom texture. Then save it to .dds format in the same name as original texture. Save in separate folder, name it "Edited Texture" to keep it separated from original texture.
✳️ Step 7. Import the .wso of Edited Mesh on TSR Workshop & Export the package
Open your TSR Workshop.
Create New Project > New Import >Next...
Then Browse original mesh by EA in package format in your project folder.
On Open file box, you cannot see .package file because the filter is .wrk (TSR Workshop Project). Choose the .package dropdown.
Then you can see .package file.
Open the .package. After the file is located, then Next. On Project Details I usually skip without giving name of Project Name and Title. Next.
You must have seen green land with white blank sky.
Where's the mesh? It is actually there... just being zoomed in too close. You need to zoom out by scrolling down mouse.
You can see the original chopsticks mesh by EA. You can save the project file in .wrk format. After you save the file, import the .wso of your edited mesh. Mesh tab > High Level detail. Click green arrow folder icon to import. Then your edited mesh will appear replacing the original EA mesh.
As you see, the texture is messed up because the texture is still using original EA's texture. But then you check Textures tab and it has blank dropdown...
I cannot change the texture on this TSR Workshop!
Don't worry, we can replace the texture on s3pe later.
No need to change anything other than importing mesh. Click Edit > Project Contents to save as package.
You will see pop up box with number or files DDS, FTPT, LITE, MODL, OBJD, OBJK, etc. Export > To. package. Give name such as "EditedChopsticks_TSRW"
✳️ Step 8. Export MODL file from Package saved from TSR Workshop
Open S3PE, File > Open package "EditedChopticks_TSRW" that you saved from TSR Workshop.
Export MODL. Right-Click, export. It gives you file name with [StringOfNumber] .model .
Save it on project folder. Keep it organized and separated from original MODL. Name the folder "Edited MODL". Do not rename the file.
✳️ Step 9. Finalizing in s3pe & Replacing the Original file with Edited File & Correcting the Code As Same As Default Code
Open s3pe, File > Open original package that you cloned from s3oc. [CreatorName]_ObjectName_Number
Find the MODL. Right-Click > Replace...
Locate to your edited MODL with filename .model .
Then click Open.
The original MODL of the package should be replaced with your edited mesh.
Do the same for the texture.
Locate to your edited texture with filename .dds
Then click Open.
The original texture of the package should be replaced with your edited texture.
Take a look at MODL's Type, Group, Instance. It has the same code as original MODL in the original package cloned with s3oc (because it has been replaced)
Don't forget to see the code inside TGI Block List Editor.
Repeat step 2 how to check the code. Right-Click on MODL/IMG > Details... and click GRID > Resources > TGI Block List Editor.
The Type, Group, Instance of the _IMG are different compared from IMG from original package clone, which means that is the evidence of edited mesh replaced the original.
Rename the Instance with default/original Instance you copied on notepad from Step 2. Type, Group, Instance should be the same as default/original Type, Group, Instance.
Open notepad with resource code you copied from Step 2. Make sure the Type, Group, and Instance are all the same.
If the codes are the same, then your edited mesh and texture will overwrite the default mesh and texture with the same code in the game. Save, Commit, Save the package.
Check again if the texture is replaced properly. Right-Click on _IMG > ViewDDS.
ALTERNATIVES!
Yes, you can delete unwanted files in your edited package, to keep the package clean. Simply Right-Click>Deleted.
The only files needed in package are: MODL, _IMG, _KEY
They are the only files with your edited mesh/texture including codes to overwrite the default codes.
You can Start new fresh blank s3pe. Right-Click>Import from file...
Locate your edited MODL and _IMG (texture) file.
On Resource Details box, tick mark "Use resource name" > OK.
Make sure all the Type, Group, and Instance of MODL and _IMG including in the TGI Block List Editor are all the same as the code in original package.
Save the package.
✳️ Step 10. Test the CC in your game.
Put the package to your CC folder in your The Sims 3 document folder to see if the CC is working or not.
If the CC is working as your intended, with your custom mesh and texture, then test the animation. Are the chopsticks animation working as the same as original EA's? If the animation are working well too, then congratulations!
Your default replacement are working. Give applause to yourself. 👏
-------------------------------------
QUESTIONS!
Q:
Can I use this tutorial for making default replacement for buy/build object?
A: This tutorial covers basic method of using TSR Workshop and replacing the default codes (Type, Group, Instance), so you will understand the basic principle of doing default replacement mod.
Keep in mind that different object has different case. Buy / build object has MLOD (not just MODL) more than one, texture images more than one, has presets, and CAStable colour channels.
The TGI Block List Editor for buy/build object has a lot of codes, so have to spend a lot of time to do trial-and-error to make the default replacement working properly, because a lot of times the texture doesn't work (still using default EA's texture), or when the object appears right with your edited mesh and texture, after you choose the presets, the object reverts back to your edited mesh with default EA's texture.
Q:
Help! The texture is black! / still using same EA's texture when tested in the game!
A: The texture codes must be not the same. Check the Type, Group, Instance of _IMG. Do the codes are the same like codes in original package? Check the TGI Block List Editor for MODL, is the _IMG inside has the same Type, Group, Instance as in original package.
Q:
Help! The object disappears when tested in the game!
A: You must be replacing OBJD in your package. Do not replace OBJD. Just MODL and texture only.
#tutorial#the sims 3#the sims 3 tutorial#thebleedingwoodland#the sims 3 default replacement mod#modding#s3pe#s30c#TSR Workshop
84 notes
·
View notes
Text
Two... Night Stand?
a/n: uh... i had a rush of adrenaline and I realized i haven't written for oda yet in a full fic... this is almost 4k words. for context: i was listening to "bad idea right?" by olivia rodrigo. enjoy :D [this is on A03]
pairing: Oda Sakunosuke X Mafia Exec!GN!Reader cw: NSFW 18+ (DNI if you are a minor. you will be blocked), possibly ooc, half-proofread, SB spoilers (just a character) desc: (takes place after the dragon head conflict, before dark era) it's been a couple weeks since you and your boyfriend have broken up. however, ever since then, you've been texting him back and forth ever since then. he moved into a new apartment and invited you over. ;)
You were currently in the middle of a job, when your phone vibrated from your side pocket. You were near to done and so you just let your fellow subordinates and coworkers handle it. You traveled out of the makeshift war zone with a bloody metal bat over your shoulder as you picked out your phone from your side pocket. Usually, you weren’t one to answer texts, especially in the middle of a job, but recently you’ve been really antsy the past couple of weeks…
That mean reason being your ex-boyfriend.
It’d only been a couple of weeks since you’ve both broken up, and you’ve been nothing but anxious.
Most of your time during work was spent reading over a file and then every few minutes or so checking your phone.
You had wanted him to answer you… for some reason, despite you both breaking up.
Every now and then you’d text him, and he’d text back, but the last two days (in counting) you haven’t heard back from him.
To say the least, this breakup wasn’t doing you any justice and the moment you heard the vibrations from your phone, you walked out. However, being a respected executive, no one would really bat an eye, less look at your direction. Needless to say, you picked up your phone, leaning against the wall and placing your bat aside.
Odasaku: Hey, sorry I haven’t been texting, I’ve been busy. I moved into a new place.
Odasaku: [attached: 1 pin]
Odasku: Here’s my new address. You should come by tonight. I managed to clean up the place.
You blushed at his invitation, swiping a lock of hair behind your ear. You quickly texted him back.
(Y/N): Yeah! Sure, sounds good! I’m off at 5.
Odasaku: Great. I’ll leave the door unlocked. :)
“ Oi! (Y/N)!!!,” a fellow redhead let out a loud exasperated sigh,” The hell are you doing running out like that?”
“ He texted me,” you responded.
“ No way,” Chuuya’s tone turned serious as he quickly gathered next to you, peaking over your shoulder. He was silent for a second as he read the line of messages. “ Did you say ‘yes’?!,” he yelled out as he pointed at your reply back. You leaned away, as he was practically yelling in your ear.
“ Y-yeah…,” you shuttered, hiding into yourself” Listen! It’s fine! We’re just going to hang out for a bit. Nothing more…”
“ (Y/N), you know that ‘texting your ex’ means that you’re both going to hook up, right?,” Chuuya seemed rather unamused as he joined you, leaning against the wall and crossing his arms.
“ It’s… not a bad… idea…?,” you sounded unsure as you continued on,” Yeah- Nothing bad, we’re just going to talk… like old friends.”
“ I do not believe you for one bit, (Y/N),” Chuuya replied sharply,” Are you kidding? That man was everything to you! I remember you practically sprinting out the door after executive meetings just because of him.”
“ We can be friends!,” you tried to convince Chuuya, but he seemed to not be taking any of it.
“ You’ve been texting each other ever since you broke up! He only stopped because he moved into a new place! He wants you to be the first one to be there!!!,” Chuuya was waving his arms about, pacing back and forth as he tried to point out the obvious to you.
“ You don’t know that,” you frowned,” Maybe he invited Dazai to see it first…”
“ Dazai’s been in Nagasaki…! For the past three days!!!,” he yelled back, before letting out another sigh, adjusting his hat,” You really stopped paying attention in the executive meetings, haven’t you?”
“ They’re boring! You know that too!,” you yelled back at him.
“ They are, but aren’t you supposed to be around Ane-san’s level of authority?!”
“ That’s Verlaine’s job! I’m doing like half of his goddamn work!”
“ Verlaine won’t leave the fucking basement!!!”
Chuuya let out another sigh, but this time, the tension seemed to leave his shoulders,” Anyways, regardless… If your head is full of rocks, he’s trying to hook up with you, idiot.” Before you could speak back, he placed a hand on your shoulder,” Don’t act like you’re not thinking that too! I just don’t like seeing you get hurt! It doesn’t look good on you…! Just tell him you have a change of plans.”
Normally anyone would feel a little bit upset at his words, but Chuuya’s intentions and what he was saying was right. He just had an awful habit of replacing that way that he cares with anger. You sighed,” Fine… I’ll tell him.”
“ Good. I mean- I don’t care!,” Chuuya crossed his arms,” Let’s go get ramen, I’m hungry!”
…
It was past lunch now and you were typing up a report on your computer. You hadn’t actually texted Oda… if at all. If anything, according to him, your plans were still on. As you were about to hit submit on a PDF, your phone rang again, and as if planned, you picked it up.
Odasaku: Don’t worry about bringing anything. I’ll take care of all of that, so you can just show up. How does 7 sound?
Yet again, you felt your heart beat fast… What did he mean by “bringing things”? Was he really going to hook up with you? Ah, fuck it, you thought.
(Y/N): I’ll be there!
“ (Y/N),” It was Chuuya… again,” Did you get that report so I can read over it?”
You quickly slammed your phone down,” Y-yup! I was just about to send it right now!”
You were hiding behind a pick monitor, so all Chuuya could see was your head from behind the large screen. However, it was pretty obvious to him that you were on your phone.
“ Have you been texting him?,” Chuuya frowned once more, leaning on one hip and crossing his arms.
“ Nope… All good. Mori called,” you made up a quick excuse, pressing down on your mouse to hit send.
“ I just saw Mori,” he raised a brow.
“ God! Stop being so good at figuring things out, Chuuya!!!,” you slammed your hands on your desk and stood up with an angry expression.
“ Hey, I’m just saying the facts here,” Chuuya sung,” I guess I can’t really tell you what to do, so here…”
Chuuya walked up to you, digging into his pocket to pull out his wallet. His fingers slipped in between the pockets and as he pulled them out, there was a condom in between his fingers. He handed it to you. A blush crept up on your face as you almost looked at it with disgust.
“ Hey, stop looking it like you’ve never seen one before,” Chuuya commented, shoving his hand more forwards for you to take it,” Take it.”
You did so, taking it front his hands and putting it in your front pocket,” I’m just surprised you have one… in your wallet.”
“ I just have it… just in case,” a blush also seemed to creep up on his face.
“ In case for what?,” you frowned.
Chuuya seemed not to answer you, as he quickly stammered out the door.
…
God this was such a bad idea…
Such a bad idea…
You really shouldn’t be here…
You were clutching the collar of your sweater nervously. You weren’t wearing anything different, though at least a little bit more casual. You had a white button up, tucked into some slacks and a black cardigan that was buttoned on top of that. It seemed casual, but underneath you made it a point to wear underwear that looked nice… and matched. Just as you were about to knock, Oda opened his door.
“ Oh- hey!,” you smiled shyly.
“ Sorry, my ability told me that you were here… I guess I’ve just been wanting to see you,” Oda greeted, running a hand through his hair. You missed his face… the deadpan expression that he always had, yet his eyes were always telling of what he was really feeling.
“ Yeah… I’ve missed you too,” you said, feeling happy that your feelings were being reciprocated. At least you weren’t the only one who was lying alone in bed, feeling lonely.
“ Come inside,” he opened the door wider for you to walk in. You looked around, seeing the nice fairy lights that were hung on the ceiling. They seemed to be the main source of light. The apartment was well furbished: instead of tatami, there was nice wooded flooring. The kitchen looked brand new, and most is not everything looked really clean. You looked over at a couch: there were two beer bottles there, though not pre-opened. Oda always made it a point to be respectful, and so you were thankful for that. You were glad this was all he meant by “bringing things”.
“ Sorry, it’s not much,” he sighed from behind you as you took your seat on the couch. He handed you a bottle opener and you corked open the bottle with a satisfying pop. He took a seat on the couch as well, across from you, but leaving distance.
“ No, don’t worry,” you reassured him,” This was pretty much all I was hoping for.”
Oda hummed, looking over at you with a rare smile. Although it wasn’t a very big smile, he usually never showed that to just anyone. You took a swig of your beer.
“ How’s work been?,” he spoke up.
“ It’s been good. Nothing too interesting I guess. You?”
“ Same as usual.”
It got quiet again, as the two of you were just watching whatever was going on the TV. Despite not talking, you didn’t feel the slightest bit uncomfortable. Maybe he just wanted to offer a calm space for you after work… nothing mo-
“ (Y/N)… ,” Oda’s voice seemed to boom in your ears, completely interrupting your thoughts. You turned over to see that he had scooted closer and was now leaning over you with a rather desperate expression. However, you let it happen as he leaned closer to you, his hot breathe fanning over your mouth.
“ I’ve missed you…,” he groaned. His beer was out of his hands, as his fingers gently traced past your arm to place yours on the coffee table. You leaned back, letting him do what he wanted.
“ I-I’ve… I’ve missed you too,” you responded shyly. Though, you couldn’t help but want to close the gap between the two of you, placing your lips gently on his. He returned the kiss, though not before letting out a groan in return. He kissed back passionately, taking in your scent as he leaned on top of you. You let out a moan as you felt his stubble scratch you. It was a familiar feeling, one that you often found comfort in, as you body started to relax.
Oda quickly pulled back, his face going red,” S-sorry… I’ve just been desperate.”
“ I’ve been desperate for you too,” you wrapped your arms around his neck, pulling him in once again,” I mean… I’ve been checking my phone all the time. I can’t get you off my mind.”
“ You… have…?,” he asked, a little breathless. You nodded,” Yeah… Just kiss me already, Odasaku.”
He quickly smashed his lips into yours, a lot more rougher than before. His tongue prodded at your mouth, and you gladly let him intertwine his own with you. You couldn’t help but moan again, your hips bucking to meet his. He pulled away from the kiss, a trail of saliva coming from both of your mouths. He gently trailed kisses on your jaw to your neck. You whined, leaning your head back to give him more access to your neck.
“ F-fuck…,” you had felt overly sensitive after not being touched in a while. His kisses felt so soft… so warm as he started on your neck. He sucked in, earning a moan from you. You felt his lips curl into a soft grin as he pulled away slightly, prodding his nose to the other side of your neck,” Let me mark you up, baby.”
“ Please…!,” you whined as he sunk his teeth into the other side. His biting was harsh, yet he seemed to be please as he watched the mark bruise into your skin. He kept marking you up until you were a moaning mess. The heat between your thighs getting hotter. Oda gripped under your lower back, as he left another mark, your chest being pushed into his as he placed a leg in between yours. He’d left a couple more before sitting up.
“ Let’s move to the bedroom?,” he asked, looking at you as you nodded. “ Are you… ok with that?,” he asked, seemingly unsure. You nodded again, but he shook his head, silently asking for your spoken consent.
“ Yes, I consent to this, ‘Saku,” you smiled. He couldn’t tell if it was from the way you looked so beautiful in your disheveled state: shirt slightly unbuttoned and untucked, hair a mess and a red flush on your face, but he couldn’t help but feel himself want even more of you.
He stood up, taking your hand and guiding you to his bedroom.
…
That was about an hour now… and it seemed as though the time before had been a blur as you were drooling, face pushing into the sheets as he was ramming his cock into you. His hands were roughly pushing into your hips as he pushing you further into the mattress.
“ Fuck… I missed your body,” he leaned down, his hips rolling as he stayed inside. He was so thick… and warm. You felt yourself feeling like you were being split open.
“ So pretty…,” Oda kissed your shoulder, his stubble leaving a a lovely sting to you,” So pliable and soft.”
“ O-oda… ‘saku- Ngh..!,” you moaned out,” A-ah!”
You felt… so full, and you couldn’t help but only feel yourself get more wet at the lewd sounds of skin slapping. His dick was pounding into you at this point, and you’d started to feel your sore spot being hit. That only increased the lewd moans that you let out as he slammed his hips into yours again. You felt fingers tilt your chin upwards, you were now looking up.
“ Open your mouth,” he demanded. You did so, sticking your tongue out. He spat into it, making you instantly swallow. You couldn’t help but only feel turned on from that. Soon enough, as he continued to desperately rut into you, your heat started to build up in your stomach. You racked your brain trying to think of words to say, but all you could let out was desperate syllables. Oda groaned at how cock-drunk he’s made you, speaking was so hard, and all you could think about was being a good cock sleeve for him.
“ ‘Saku…! Mm! Gonna cum…!,” you moaned, you hips bucking into his hips more, feeling his thick cock hit your sore spot once again.
“ Cum f’me…,” he demanded, reaching his high as much as you were. You were a complete mess as you reached your orgasm, your release leading you to shake under him. You whined as you finished cumming together, as you felt him pull out. He let out a soft breathe, as he took off the condom, tied it, and threw it in the trash. He rolled over next to you, pulling you into his chest.
You blushed as you felt his fast heartbeat thud against your hear. You gently pet your hair, calming you down from your high. You did so, taking deep breathes as you curled into his chest. He was warm…
“ You ok?,” Oda gently asked, taking a hand under your chin to look at you.
“ Yes. I’m alright,” you replied. You leaned up to kiss his chin, something you did often after intimate times like these. Oda hummed gently,” Ok, tell me if you need anything… Or if you want a round two.”
You chuckled, pushing his chest away jokingly,” I’m way too sensitive right now.”
“ Joking joking,” Oda’s voiced, as he pulled you closer to him once again. You leaned your ear back on his chest, closing your eyes for a moment.
…
The next day, you showed up to work in a turtleneck, which wasn’t in your usual work attire. You thought it’d be normal: considering that most mafioso wore heavy layers with dark colors. A turtleneck was nothing to bat an eye about, so it would’ve been fine.
Well… it would’ve been fine…
If you didn’t have an executive meeting this morning… and guess who so happened to come out of the basement.
… and it just so happened to be on this day.
You actually had no real qualms with Verlaine. You’d been away from most of the crises that involved him to even join the Port Mafia in the first place. All you knew was that you were given most of his work load considering that he never left the basement. Though, one things for sure, he had a rather stern stare. One that almost made you want to hide away forever: to put short, he intimidated you.
You were trailing behind Verlaine as you were crouched down next to Chuuya, practically hiding behind his shoulder.
“ Did he hear us back-talking him from all the way at the Port,” you muttered. “ Oooh~ someone’s in trouble~,” It was Dazai, who’d finally made his return from Nagasaki. He was creeping over you from your other shoulder.
Chuuya placed a hand on Dazai’s head, hitting him with some amount of force,” Can it, Dazai! He’s only here because we need him for something. It’s not like that.”
“ Eh…? I was talking about (Y/N) over here,” Dazai reached over to your turtleneck, pulling at the tall collar and taking a glance.
“ Hey!,” you slapped his hand away.
“ Oh…?,” Dazai’s smile seemed to turn into almost a cat-like grin,” So I see, (Y/N)’s been gettin’ around.”
“ Don’t look!,” you swiped Dazai away with an arm,” It’s none of your business anyways.”
Soon enough, the door opened, revealing Mori who’d had a long meeting table set up. Kouyou was already seated on Mori’s right side, and you and the others followed through.
“ It’s good to see you all,” Mori smiled, looking around as everyone had been seated. The doors closed behind them all and an ambient light shown above the table,” Verlaine, it’s good to see you come out to get some fresh air for once.”
“ I’m only here for information’s sake, nothing more.”
Mori nodded, about to continue, but before he did, his eyes scanned towards you.
“ Ah, (Y/N), a turtleneck? That’s new,” Mori seemed to intentionally say it as a compliment, but that didn’t stop Dazai from letting out a soft snicker under his breathe. Chuuya kicked him under the table however, the bandaged man letting out a yelp.
It’s times like this where you wish you weren’t here, being an executive… with this room of people… and these specific people…
God, maybe I’m not fit for being an executive, you thought, sinking further into your chair.
…
…
…
Well, if there was anything to make all of those stressful thoughts go up in smoke, it was Oda who was currently breathing heavily in between your legs. You were laying down into the comforter, the plush pillows supporting your back as you looked down at him. Oda’s lips gently kisses at your thighs. His warm lips continued to kiss up your thighs and eventually met at your entrance. He gently kissed there, looking up at your flustered expression.
His hot breathe pulled away before licking up your clothed entrance. You moaned,” Ngh.. Ah- ‘Saku please…” Oda seemed to grin a little bit as he licked a thick stripe once again. You shuttered under his hold, and he hummed, seemingly pleased at your reaction. Soon enough, his calloused but gently hands trailed up you legs, pulling down your underwear and leaving you naked from underneath.
“ So wet and pretty for me, already?,” he teased. You were about to respond before you let out a loud moan as he dived his tongue onto you. He licked you up and down, making you moan once more. One of your hands reached to grip onto the sheets as he proceeded to eat you out like a starved man. You couldn’t help but roll your eyes back further as you sunk into the mattress.
As he lapped at your lower half, you were slowly started to loose consistency in your breathe. Eventually he’d grown more desperate, the vibrations of his throat making you whine. His hand reached out to your empty one, and you took it as he intertwined his fingers with yours.
Your other hand that was gripping at the sheets covered your face as you moaned louder,” I-I’m gonna cum. F-fuck…!”
Oda only seemed to want more, licking up you even more desperately than before. Soon enough, you reached your orgasm. He groaned in response, taking in all of your juices as you squirted. He finished up, wiping his chin as he sat back up.
“ Already…?,” he grinned at you.
…
It was the end of another session, and you were pulled into Oda’s chest once more. The two of you were rather exhausted as you’d gone more than one round, and so you both fully relaxed into the sheets. You were now drawing patterns on his chest as he was slowly drifting in and out of sleep. He tried to keep himself up however, only wanting to shut his eyes when you were sound asleep.
“ Say ‘Saku,” you pouted, continuing to draw patterns,” What are we?”
“ What do you mean?,” he raised a brow, the sleepiness seeming to fall away from his mind.
“ Are we together… or are we just friends,” you seemed to be rather melancholy as you asked.
“ I thought we were together, already,” he answered honestly,” Didn’t I ask you?” “ Eh…?”
“ I asked you when I was on top of you just a couple minutes ago.”
“ I wouldn’t remember that when you’re ramming me into your own bed!!!,” you sat up, frowning.
Oda sat up as well, placing his hands up in defense,” I thought we’d made up already.”
You looked at him questionably. However, after a moment, you realized it was Oda Sakunosuke you were talking to. A question was a question… and if he happened to ask it at an odd time, well… his intentions were genuine.
“ Well- we did, but- Do you love me?”
“ Of course I love you,” he answered with no hesitation.
“ Oh, whatever,” you sighed, flopping onto him with no though. He fell back down on the bed, wrapping his arms around you. Once again, he was warm… and you started to feel sleepy.
“ Sorry if I asked at a weird time.”
“ You’re always like that, Odasaku… but, that’s what I love about you.”
#bsd x reader#bungou stray dogs x reader#bungo stray dogs x reader#bsd#bungou stray dogs#bungo stray dogs#odasaku#bsd odasaku#sakunosuke oda#oda sakunosuke#oda x reader#odasaku x reader#oda sakunosuke x reader#bsd smut#bungou stray dogs smut#oda smut#odasaku smut#too many tags#mono writes#*dies cutely*
286 notes
·
View notes
Text
Friends to Accomplices Chapter 1
Brief desc: It's a murder mystery with fantasy elements centering around some unusual high school students. Featuring a tea witch, a supposedly cursed amateur detective, the token green-haired anime bisexual, her himbo weed dealer boyfriend, and more <3
Trigger warnings: In general: this is a murder mystery with descriptions of corpses and deaths. In this chapter: reference to self-harm, small instance of transphobia
(Leaving main text black for eye-strain purposes.) (Will figure out a more graceful way to indicate POV later, for now, it's just (name in parentheses))
Actual chapter start:
(POV Josie)
My father was away again, starting today. This had no impact on me, save for that I had to take the bus to school. The mist concealed the world such that I could only tell anything was coming by headlights feebly peering through the fog, the extra pair of little red lights on the top my only sign that it was the bus. It screeched to a stop in front of my driveway, another wrong-sounding noise accompanying the opening of the door. I climbed on as the bus lurched to a start again and was making my way to the seat I usually sat in on my rides home, but paused. There was a boy here I’d never seen before. Perhaps because I never took the morning bus. But that wasn’t what was important. The boy had the darkest aura I’d ever seen. Interesting. I stopped next to his seat. “Hello. May I sit here?” I asked.
He looked up at me, surprised. “I guess,” he said and went back to reading something on his phone.
His aura had looked black at first glance but the longer you stared at it the more you wondered if it was actually a dark red.
“My name’s Josie. What’s yours?”
“Philip.”
He started to read again, but only a second later looked back up.
“Why did you want to sit next to me?”
“You seemed interesting.”
“So, you think someone staring at their phone just like half the other kids on this bus is interesting?”
“No. It wasn’t what you were doing.”
“Then what was it?” He asked.
I couldn’t exactly say his aura without sounding completely crazy. I gave him a quick glance up and down.
“Mostly the scars,” I said.
He paled and tugged his sleeves down.
“No, the ones on your neck that you try to hide with the choker,” I said.
“You’re observant. I don’t think anyone’s ever noticed those before. Though it’s not like I didn’t notice yours.”
He hesitated momentarily, and I felt his eyes scan me in more detail.
“That’s odd. Those were defensive wounds,” he said.
I flinched. “How could you tell?”
“Wrong angle for self-inflicted. Low odds of being accidental because they all appear to be from blades. Why don’t you cover them?”
“I thought they were faded enough. I was right until today. You’re pretty observant too. So what were you reading about?”
"Researching how much force exactly it takes to decapitate someone depending on the type of weapon," Philip answered as if it was the most normal thing in the world.
"Forensics class assignment?" I asked. I doubted it was a forensics assignment. Maybe he wrote mystery?
"I'm a 9th grader," he said.
"Same. I thought maybe you just looked young. So, are you writing a mystery?"
He shook his head and went back to reading. I decided not to bother him for the rest of the bus ride. I had a French test to study for anyways.
************************************************************************
(POV Philip)
I looked around. I was in world history. My tablet was out, and a notes file was open, full of notes on the French Revolution. The teacher was explaining all the known details of what Maximilien Robespierre did after he developed a God complex as if it was juicy school gossip. I was bored. Time to see some dismembered bodies. We were supposed to have our tablets out to take notes anyways. I wanted to see what they identified as the weapon in each case and notice the differences in how the finished work looked. Specifically, I was interested in how to tell the difference in victims dismembered with different types of swords, but I hadn't come across any who were dismembered with a sword yet. I smiled at one especially gruesome picture, where someone appeared to have removed the head, arms, and legs with a paring knife. I wondered how long that must have taken. Imagine someone showing up at your door in the middle of that. Desperately trying to saw away at the corpse while someone waited outside, completely oblivious. The thought almost made me laugh. They couldn't think of anything better to use? The next image was far more promising. "Man arrested after killing wife with sword," the description read. It didn't say what type of sword, but I screenshotted it anyways. Maybe it would give more detail in the article. It didn't. Apparently, they hadn't actually found the weapon yet. Well, it was posted today, the same day the body was found and the arrest was made, so there was hope yet.
"Philip Jensen, please come to the office, Philip Jensen, please come to the office" a school office employee droned over the PA system.
************************************************************************
(POV Josie)
I opened one side of the heavy double doors to the green wing stairwell. The ones at the end of the hallways were always empty during classes, well, unless you were trying to skip them. For this reason, I took a moment to walk down from the third-floor landing I started on to the first, making sure to be careful so as to not join the other three accidents this month.
An energy almost as dingy as the shade of blue the old school staircase was painted in walked through me on its perpetual journey up down the spiral of steps that still squeaked from the morning’s damp sneakers as I spun around at the bottom to start my way back up. Only to the second landing though, Lindsey was in English right now and should be coming through those doors any minute. We had to do this quickly if we wanted to return to our classes with the pretense of the restroom still intact. Although, I suspected even this much smoke will trigger the sprinklers and fire alarms and get us in trouble.
I started pulling materials out of my backpack. A large glass bowl, a sage smudge stick, and a lighter. It wasn’t our first resort, but I doubt our second resort was going to be as effective as we hoped. (The first resort had been attempting to negotiate.) The doors slammed shut and I looked up to see my friend, already pulling her backpack off her shoulders. She plopped it down next to mine, unzipped it, and withdrew our second resort. A rather life-hack-ish idea if it were to work. She held up a spray bottle of water lightly tinted from the rosemary, basil, thistle, and oak she’d boiled in it the night before. It was just barely clouded with salt, and two crystals – lepidolite and black tourmaline – were visible sitting in the bottom. I would have done this myself if it weren’t for the honors French oral exam I had to study for. Plus, Lindsey had wanted to be helpful. It is certainly better to get in trouble with someone else rather than alone, at least.
The lights flickered. The spirit must suspect what’s about to happen and is not happy about it. Lindsey took this opportunity to start down the stairs. I saw the energy change location and go towards her. She slipped, or more seemed thrown off the step, but caught herself on the railing with her free hand. With the other, she sprayed the infusion all around her. The energy faded, flickered, and disappeared in an instant, only for me to sense something behind me an instant later.
I lit my lighter, and a force tried to push it from my hand, but I was stronger. I worried about the sage staying alight. I got it lit, and it was blown out like a birthday candle before it could even smoke.
Lindsey’s heavy but careful footsteps approached. “Light it again,” she said and began to spray the infusion, not over the bowl but all around.
“Thank you.” I was thankful that I hadn’t tried to do this myself.
The smell of the sage was strong and floated up and around, almost seeming to fill the huge space.
“With this smoke, I banish you, spirit whose intentions are cruel. Leave this place and leave this school; there is nowhere here for you. This is my will, so mote it be.” I said and repeated it as I walked down the stairs, trying to ensure that there would be nowhere in this stairwell for the spirit to be.
It didn’t take long for the sprinklers and smoke alarm to go off, so I had to hurry down the rest of the stairs, leaning over the sage to keep it from being put out by the sprinklers. Once at the bottom, I could feel that it was gone. I stood up straight and let out a deep breath as the sprinklers put out the sage for me. Ideally, we would do a protection spell after this, but a teacher had already thrown open the double doors and was starting towards us angrily. He opened his mouth to yell at us, but we just apologized and marched soggily to the principal’s office. When we entered the school office, the principal was out of his office and standing in front of the front desk, already busy with someone.
"She says you threatened her with a knife." the principal said to him, looking exasperated.
“When, supposedly, did this take place?” Philip challenged.
“When she caught you skipping class in the blue wing stairwell. Only a few minutes ago.”
"So, I could have passed her in the hallway… Anyways, I was in world history at the time she claimed it happened," he said. "Plus, I was researching stuff when it happened as well. I even have proof."
"Where?" The principal asked.
"I screenshotted a picture in world history, and it has the time at the top. Not only that, but it was posted today, so there is no way I could have taken it at the same time yesterday or something." Philip said confidently.
He pulled out his iPad and showed the principal the picture.
"Why on earth would you look at that during world history?!" That got a strong reaction out of the principal.
"Anyways, the picture proves her statement false," Philip said.
"Okay, Philip. But if you were in history class at the time, you could have just asked me to call up Mr. Garnett and ask. Go back to class."
Philip turned and stopped. He looked at Lindsey and me.
"...What happened?" Philip asked.
"I burned something in the green wing stairwell and set off the smoke alarms,” I responded.
“And the sprinklers,” Lindsey added.
Philip beamed. “So that’s why they went off. We almost went outside. That’s so unexpected from you.”
“Philip. Back to class,” The principal said. "You two, my office now.”
************************************************************************
(POV Josie)
Lindsey is better with people than I am. Instead of getting suspended, or really anything serious, we had a Saturday detention. But we weren’t sent home early and instead had to go to the nurse’s office to get dry clothes. “So…you’re friends with Philip Jensen?” Lindsey asked pretty much as soon as we were out of the school office.
“Probably not yet, but he’s interesting. Why?”
“Have you heard the rumors about him?” She looked at me with such concern you’d swear I’d just taken a bite of cheeseless pineapple pizza with anchovies.
I laughed. “Of course, you’ve heard rumors about him. You’ve heard rumors about everyone.”
“Seriously Josie you wouldn’t believe- “
“Probably not”
“Can you at least humor me? I’m trying to warn you, plus, you’ll find this interesting. I promise,” she said.
“Okay…”
“Have you noticed how everyone avoids him? There’s a reason for that. Everyone says he’s cursed. Also, his family was dismembered. And they never found out who did it. Whether he attracts death or causes it is still up for debate. They also say that after his family died, the first people to adopt him sent him back to the orphanage in less than a week.”
“That’s ridiculous.”
“Of everyone you shouldn’t dismiss the idea that he might be cursed so quickly.”
“It’s not that. Orphanages don’t even exist in the United States anymore,” I said.
She stared up, racking her brain for something. “Okay so that bit of information is false, but that doesn’t mean the rest is.”
“I wouldn’t be surprised about a curse. But he’s 14 and looks weak. He couldn’t dismember someone now, never mind however long ago this was supposed to have happened. Unless he was either a lot stronger back then which would be weird, or he had an amazing blade and was really skilled which would be weird, or both. Odds are too small,” I said.
“Wait why would you not be surprised about a curse?”
“His aura is weird. And his energy in general. I can feel something that’s Not Him in it whenever I’m close,” I said, “After talking to him I’m starting to suspect his aura is just that dark naturally though. I’ve never met anyone with an aura like that before, but I’ve never met anyone like him before either.”
“Oh? Isn’t a dark aura bad?”
“You tell me, deep violet.”
“Trauma,” she rebutted.
“Isn’t it awful to avoid someone because their family died?”
“Yeah. You’ve made your point. Hopefully, they were as awful as mine are, and it isn’t such a terrible thing,” she said.
“Might still be a terrible thing.” I pushed open the door and held it for her.
“It wouldn’t be” She breathed as she walked past me.
We stood awkwardly behind the nurse as she opened one of the tall cabinets that lined the back of the room. In this one there was food in the top half and clothes in the bottom. The clothes were very clearly bisected to girl clothes on the left and guy clothes on the right. Why would they do that? Anyways, I wouldn’t much care if the nurse didn’t immediately reach towards the right. She handed me a school sports team t-shirt, ugly khaki shorts, and dirty sneakers that I was pretty sure would be too small. Lindsey was handed a school band shirt, almost identical shorts except that they were grey, an inch shorter, and had a proportionally smaller waist, and mickey mouse slippers. The nurse’s office had a single stall-free bathroom, so I offered to go second. Lindsey returned. It was the worst I’d ever seen her look in an outfit.
“Your turn,” she said unenthusiastically.
I did not fare better. I looked at the clock as soon as I was out, and it was exactly a minute before 1st lunch.
“Ugh, I have Algebra,” she said. Third lunch.
We walked together until the stairwell when I promised I’d text her after school, and then we went our separate ways. I saw familiar green hair on the second landing.
“Dragana!” I said and waved.
She waved back and went to the side to let people pass while she waited for me. Soon we were side by side. Our hands slipped into each other.
“Thanks for the fire alarms earlier. I’m guessing the banishing went as expected?” She snickered.
“Yeah…We succeeded in the end though.”
She patted my wet hair. “Depends on what you mean by succeeded. Nice job though.” She bumped into me encouragingly.
Dragana and I walked into the crowded cafeteria. I detected subtle notes of the rumored pizza for lunch underneath the heavy stench of AXE Body Spray. I started to walk over to my usual table. I needed to be cheered up after almost getting suspended. I stopped about halfway to the table. I could see there were no seats left from here. I knew if I walked over and asked, they'd pull a chair over for me from somewhere else, but I didn't want to bother them. I sighed.
"Are you okay?" Dragana asked.
"Yeah, just all the seats are full. Thinking of where else to sit."
A chair scraped against the linoleum in a section of the cafeteria filled with excitable jocks yelling and throwing things, and Dragana’s boyfriend Jake headed towards us. He looped his arm around her waist. “I saved a spot for you, babe.” He said, with his usual big, stupid, crooked smile.
“No, you didn’t, all the seats are full,” she giggled.
“That can change.” He shrugged.
“I’m just going to go sit over there…” I said awkwardly, pointing to a table with only one kid sitting at it.
“See you after school.” Dragana gave Jake a quick peck on the cheek and followed me.
"Hi!" Dragana chirped as she sat next to Philip.
I sat across from her.
"Hello," he responded.
He was looking at his phone again.
"Still researching decapitation?" I asked.
Dragana's eyebrows shot up.
"No. Now it's whether traces of blood are detectable on clothing after years of being worn and washed as normal."
"You have odd hobbies. It's cute," Dragana said and messed up his already very messy hair.
"I get bored easily. This isn't boring.” He was quiet for a moment. “Do you guys hear that?”
There was a cacophony in the cafeteria. 50 table’s conversations, all speaking loudly to be heard, and the jocks’ throwing things seemed to have evolved into a competition of who could yell most obnoxiously as they did so.
“You’re going to need to be more specific,” I said.
“Sirens?” Dragana asked.
“Why? Is there someone you’re worried about?” I asked.
“I don’t know why…but I have a good feeling about this.” He stood up.
“Where are you going?” I asked.
“Uh…” He waved his hands around a bit as if looking for an explanation that escaped him like an Elefun butterfly. “Outside?” He said and began to wander off.
“Can we come with?” Dragana asked.
He looked at me. “You’ve proved yourself observant. If there’s anything interesting, why not?”
Somehow that came across as spectacularly arrogant. We followed him outside as the sirens grew louder. I’m not sure what Philip expected, but I expected them to fade to quiet again soon. We got close enough that we could see through the windows on the doors to the outside. He rushed out, and a door almost swung back into my face, but I caught it in time. I held it open for Dragana and then followed. Outside there was a scattering of tables, all empty due to it being October, and several huge light posts even though as far as I knew outdoor events after dark almost never happened here.
There was a girl standing against one but with blood all down the front of her frilly pink lolita dress. Where the stain started was the top of her neck, which a red ribbon was tied around. And around the post. She wasn’t standing. She was being held up by it.
Police cars pulled into the bit of driveway that passed here and stopped. I looked at Philip, curious as to how he was reacting. He was on his phone again and appeared to be finishing up a text. He clicked send and shoved the phone back into his pocket.
“Don’t go near it!” One of the officers shouted as he climbed out of his car.
“Don’t worry I know better than that,” Philip shouted back.
“Philip?” The officer smiled.
A much less enthusiastic-looking lady climbed out of the driver’s side and began heading towards us. There were two more as well, from the other car. A big Viking-looking dude and an equally tall but much narrower older guy with on-point makeup.
“How did you get here before us?” The enthusiastic officer asked.
Philip tilted his head and looked into the officer’s eyes with as much feigned concern as it looked like he could muster, which was subtle at best. “It’s a school day.”
“Oh. Yeah of course.” The officer scratched the back of his head. “It’s easy to forget you’re like 12 or something.”
“I’m 14.”
“Still too young to be here. In fact, even if you were older, you’re not a police officer, and shouldn’t be interfering with investigations. And both of you, there’s a body here? Perhaps, Modred, let’s do what we’re supposed to before catching up with friends?” The lady officer said.
“Oh, come on Alicia, it’s the kid who solved that arson. Let’s just hear- “
“I don’t intend to interfere.” Philip cut Modred off, getting that arrogant tone again and walking a few steps to the right so Alicia wasn’t blocking his view.
“You and whoever these two are. Please leave.” Alicia instructed.
“Except that we’ve been at the crime scene? You can’t simply send us back without asking if we saw anything, or disturbed anything for that matter, or at the very least collecting ‘these two’s’ contact info. You might need to know who’s been in the area later. We might have seen something. I, for one, noticed several things you might want to know,” Philip taunted.
Alicia turned red and rubbed the bridge of her nose. “Guanyu if you’d talk to them?”
“Can I?” Modred asked.
Alicia threw her hand up. “Fine! Why not? Who saw it first and called us?” Alicia turned towards the big Viking-looking guy.
“Er, well they said they saw from the classroom window, so one of them, I gather,” he said and gestured towards all the classroom windows facing this patch of grass. Curious faces crowding most of them.
______________________________________________________________
Currently very short tag list (ask to be added to it): @daughter-of-night
#hal writes#friends to accomplices#my fave wip#writing#chapter 1#chapter one#mystery#murder mystery#long post#multi pov#first person past tense#ya except that it deals with dark topics later#it gets angsty#found family#wherein the introduction to the unknown is meeting a weird guy on the bus#def not following monomyth here i just felt compelled to make fun of that#happy ending#i can not express how determined i am to write a happy ending for these people who might not deserve it but they've been through so much#my writing#do you need something to read?#that involves witches#and ghosts#and mentally ill characters#and everyone is queer#and they become friends and solve murders#and in the og half this took place in the forest but I changed the crime scene but I shall endeavor for as much forest scenes as possible#because i like it <3#pls read my story#first chapter of a novel#which in and of itself is the first in a series
21 notes
·
View notes
Text
Version 431
youtube
windows
zip
exe
macOS
app
linux
tar.gz
I had a challenging week, but I got some decent fixes in.
all misc this week
Pretty much everything was little fixes this week. Nothing hugely significant, but check the changelog if you have been waiting on something.
The e621 parser now pulls 'lore' tags, which seems to be some new 'canonical' tag. I have put them in 'lore' namespace, so you can exclude them easily if you want. One user suggested they are useful for certain blacklists.
For advanced users, I added a 'sorter' to string processing. It has a neat thing where you can sort by a regex'd substring of the main string. I was happy about this, but then I realised this morning that it is only half of the job I wanted to do. I will add a String Slicer next week so you can just sample the first item or the last three items or whatever you like, once you have your sort figured out.
full list
misc:
when parents are hidden in the edit/write taglists (e.g. in manage tags), there is now a '(n parents)' suffix
thread watchers that are DEAD or 404 but still have files downloading now report 'working' status until that is done
search terms with ';' like 'steins;gate' should now work in downloaders. sorry for the trouble!
fixed an issue where un-ideal tags were sometimes becoming non-searchable when they were entirely replaced in manage tags with their 'ideal' siblings (i.e. their autocomplete count went to 0). this was due to overzealous deletion in the new tag definitions cache not filtering out sibling/parent chain members. a small routine will run on update to resynchronise affected tags
fixed an issue when loading up files in the main 'import files' dialog where a critical error (as opposed to a nice 'couldn't figure it out, sorry') in mime detection would cause the whole job to hang
that main 'import files' dialog now counts 'missing' files separately in the error count
fixed tags not updating on the filename tagging dialog when double-clicking to remove from the simple taglists
fixed the sort on the manage tags dialog's suggestion taglists--they now preserve their original sort, rather than alphabetising once sibling/parent data is populated
the manage parser test panel now catches all network errors. error data back from the server is presented better, and the traceback is now viewable in a special new button on the network job control
the edit shortcut set dialog now gives a veto text popup if you try to ok with a shortcut set twice (previously, it would ok and merge down to one command randomly). support for multiple commands per shortcut will come in future
entering alt+number in the shortcut entry dialog on windows will no longer spam some errors about 'null character'
fixed a 'this object is too huge' check in the database, which mostly affects gui sessions with millions of objects, to check against 1 billion bytes max size rather than 1GB, as here https://sqlite.org/limits.html (issue #816)
fixed the 8chan.moe parser, which was pulling hash incorrectly. it should now save more bandwidth
updated the e621 parser to pull their (new?) 'lore' tags, which all end in _(lore) and refer to canonical gender and some spice. they come with the 'lore' namespace for now, we'll see how it works out. a user reports these are useful for blacklists
.
new string processing sort step (for advanced users):
string processing objects have a new processing step: String Sorter
this sorter can sort the whole list of strings, either strict lexicographic or 'human sort' that does numbers properly, asc/desc
it can also take a regex for the sort 'key', so you can sample just the number or name you want for sort purposes
content parsers no longer have the 'sort formulae results' controls. any content parser with existing sort has been converted so its string processing object has a String Sort step appended
the string processing UI is still built around single string processing, so the test UI here is essentially non-functional, but you can see the sort happen in the formula test parse panel
I will add a String Slicer in future to sample the list of strings, so you'll be able to grab the top item etc...
.
boring code cleanup:
refactored the refresh call in filename tagging dialog to nicer Qt signals
the add/remove taglists on the simple panel are also moved to Qt signals
and so are 'filter' taglists
fixed some typos in new help text
removed a 'needs restart' string in 'gui pages' options that no longer does
.
here is a hieroglyph falcon:
𓅃
next week
A thing I wanted to move forward this week, the network improvements, just got lost in the mix, fugg. I also fell way behind on some messages. I think I may simply be ill. Not the coof, and I am not dying or anything, but I'm a little low productivity at the moment. No worries, I'll make sure to rest enough and get back to it. Otherwise, I want to get this String Slicer sorted. Since network improvements are proving such a problem to break up and fold into 'normal' work, I may end up scheduling several weeks over March/April to do it in one go so I can move on multiple local file services, we'll see.
1 note
·
View note
Video
youtube
Here’s a video I made from all the videos I took from Rammstein’s first Finland concert last year. They’ve been sitting there in my files for months and finally I did something about them and here’s the result. It’s in 1080p so I definitely recommend to watch that on full screen and in HD.
Here’s a text I wrote on YT desc box to go with it and there’s no point writing the same stuff twice so here we go:
Finally I had energy and motivation to edit these videos into one bigger video. Most of the clips are shorter clips of the songs, only a few being almost the whole songs. I was filming with my phone (Sony Xperia XZ) and camera eats lots of battery so I had to try and film as little as possible but I still wanted more than a couple of clips worth few seconds, so here's 22 minutes long video about the whole show. I also had no idea how my phone was going to do but I'm surprised, the video quality is perfect and the sound quality could be so much worse. Unfortunately you can't hear much more than Till's vocals and the drums but if I was to film with my digital camera... you'd have heard nothing but distorted sound broke by the loud bass. So I think it's better this way.
I was standing quite far (plus I'm very short) so I didn't really see what was happening on the stage, so when I film these videos, I see everything from a different perspective too :D But anyway, I'm in no way feeling bad for standing so far because now I had the perfect opportunity to admire the actual light and fire show! It was amazing and we could have not got the better weather for the night! I'm still so amazed by the whole light show whenever I watch these videos. I still have time to see the show on stage at some point anyway, if not in real life, then at least from the dvd in the future, whenever they decide to release that :D Rammstein is a band that I won't even try to get to front row, I've never been too close anyway and barely have seen the guys even so I'm always so excited to tell people that hey, I could see Schneider's head! Or if I saw a glimbse of the guitarists! Pretty much the only time to actually see them with my own eyes is when they used the platforms to lift them up on stage :D But it's funny to think I've been to 4 Rammstein concerts now but I've barely even seen the guys with my own eyes lol. More often through my videos afterwards! :D
Thank you for Rammstein for an awesome concert. I always feel like dying at the beginning because of how loud and huge everything is but then I'm still happy that I went there. This was probably loudest than ever and the sound waves sometimes made me feel like they were killing me there and I just HOPE they don't outdo even this or I'm sure there will be people actually dying lol.
Feel free to reblog.
#©mcrmadness#my videos#rammstein#rammstein europe stadium tour 2019#rammstein at tampere finland 9.8.2019
8 notes
·
View notes
Text
bad religion - jjk (m)
pairing: jungkook/reader
rating: NSFW (18+)
genre: SMUT, hunter!reader au, kingofhell!jungkook (yes this was highkey inspired by spn)
words: 6.7k
desc.: it was a bad religion to fall for someone who could never love you. but, thankfully you hadn't fallen yet. and who knows? maybe he could learn how to love. or namjoon, your dumbass witchy friend ends up possessed by a demon. on halloween night, you make a deal with the devil to try and get him back.
warnings: dirty talk, unprotected sex, oral, dom!jungkook, tiny bit of breathplay, possessive jungkook, probably forgetting something
notes: im sick so this is super unedited! also this is my p late submission for the BTS Smut Club Halloween Smut Fest: Prompt #77 “You can’t sell me your soul, when you don’t have one to begin with.”
The warmth of Summer was long gone. The air felt sticky, despite the chilly breeze. The moon was abnormally bright, casting a silver glow upon the Earth. It was unsettling, being able to only see the moon, and not a single star. The inky clouds that occasionally floated in front of the hanging, luminous pearl, never once caused it to dim. Your stomach churns and twists in protests. Your subconscious continuously beckoned to you, begging for you to turn back. It had been a long drive to find the secluded crossroads, and it was too late to turn back.
You had parked your car several blocks away and were now on foot. Driving this far into the countryside was new to you. Hopefully, you wouldn't have to drive this far here again. It never failed, Namjoon always managed to fuck something up.
There wasn't a shred of doubt in your mind. You knew this would work. It had taken hours of relentless searching to find the proper incantation. You had to dig through the witch's files for days before you found anything remotely close to what you needed.
Witchcraft was something you had promised yourself to avoid messing with. You always left it to Namjoon. You did the stabbing and he did the casting. You were on your own, and you were the only person willing to help your poor fuck up of a best friend.
You glanced around the road, eyeing the sides carefully. You gathered several decent sized rocks. You dropped the bag cautiously onto the dirt and kneeled. You adjusted each rock until they formed a somewhat circular shape. You drew each ingredient out of your bag and placed them in the middle of the circle, one by one. You grabbed a pebble and used it to sketch out the sigil into the dirt. You had to sketch delicately around the rock formation, the last thing you wanted was to mess up the ceremony.
Next, you brought out six onyx colored candles. You pulled the lighter from your jacket, the dirt crunching beneath your weight as you moved. The flame flickered to life, nearly fading out because of the howling wind. You lit the first candle, using your body to block the wind. The candles were specifically created for summoning. They endlessly burn, and are entirely unaffected by nature, unlike your lighter. You returned the lighter back to its place and used the one candle you had burning to light the others.
Next was the picture of you.
You pricked yourself with the needle, squeezing and massaging your finger to try and make the blood flow out easier. The drop landed directly onto the picture of you, and you felt more queasy than ever.
You cleared your throat, staring down at the dancing flames of the candles. The energy is already coursing through the pages, waiting to be unleashed. You can feel it humming through the thick leather. A shaky sigh escapes you when you tightly grasp the book and yank it from the confines of your bag. The book practically leaps into your arms and flings itself open. It violently splits open, the pages hastily whirl by on their own. It was as if the book had a mind of its own.
It seemed... eager... to be used.
The howling wind and the tossing of the grass seemed to still when the first words parted from your lips. You inhaled deeply, trying to focus. The words were familiar, you had repeated them to yourself for hours on end, trying to learn the spell. Though you spoke in broken Latin, you knew the words were transmitting. The text began to glow, and the book grew hotter with each sentence you finished.
The ground began to rumble, and you knew the creature was being torn from its throne. Your throat tightened, and you felt tears begin to poke from the corners of your eyes. It was so much worse being the individual to actually summon a demon. Rarely, when you were observing Namjoon complete a ritual, did you get sick. You always knew that, watching Namjoon get sick. You never realized entirely how sickening the process really was though. It was draining, mentally and physically. It felt as if you were right on the brink of death.
You choked out the last word and threw the book from your hands. The feeling of your skin sizzling and melting away made you hiss. You grabbed your arm, desperate to stop the pain. The book was entirely illuminated, glowing painfully bright. You wrench your eyes closed, the wind was roaring now, and you were convinced the entire planet was rocking back and forth.
Then it was calm.
The book dimmed, the candles simultaneously blew out, and the wind blew away the sketch in the dirt. Your picture was entirely singed, along with the ingredients. The rocks had sunk into the ground at some point during the ritual. The only thing that was left was burnt ashes. More importantly, your skin hadn't dissolved away. You stand and dust yourself off. You glance around, expecting to see someone standing around, watching you with curiosity.
You contemplated leaving, going and finding a place where you could have a couple of drinks... Or maybe a nest full of vamps you could stake.
Anything to get your mind off of this.
You pluck up the book and your bag. Everything felt different, but not in ways that you could name. It was such a slight shift in the atmosphere it was almost unnoticeable. For a fleeting moment, you worried if you had pronounced something wrong and unleashed something terrible out into the world.
You waited.
Unlike the person you were summoning, you were not immortal. You couldn't sit here and stare blankly at the sky until he showed up. At this rate, you were going to die before he arrived.
You persisted anyway.
You were determined to fix Namjoon's mess, even though he was the one to dig his own grave. You stood there like the ugly girl at prom, waiting for the guy who promised to be her date to show up.
"Sorry, I was running late. It's not often someone calls me directly from my throne."
You twirl around, nearly tripping over your own feet as you try and turn. Features scrunching up in confusion, you examine the man head to toe. How the fuck had you managed to summon an angel? The dark, doe eyes twinkle in amusement, and he grins.
"What? Were you expecting my horns to be larger? I didn't want to frighten you, delicate mortal."
You froze, and your heart lurched. It was finally settling in. You had just summoned the fucking King of Hell. His tall, lean figure didn't intimidate you. Not in the slightest. If it wasn't for the horns and the occasional shifting of his eye color, he could pass as someone your age. In no way, shape, or form did he appear to even be an ancient demon. The power, raw and unadulterated, radiating off of him was the off-putting part. The demon glanced towards the ashes, eyeing them carefully. He reaches towards the ashes and pinches a bit of the ash between his fingers.
He blows the dust from his fingers and raises his eyebrows. "A deal?" he asks. He eyes you suspiciously and wipes away the smear of ash off. "You waited specifically until Hallows' Eve to do this. Didn't you?"
As if you were a video, someone had taken the remote and stopped you from moving or speaking. You were on pause. You didn't know how to answer, should you lie? Should you tell the truth? The demon takes a step towards you, coming closer than you were comfortable with. You catch a glimpse of red in his eyes, and then it's gone.
He smirks, "I see. You purposely waited, just to summon little old me. This must not be a regular deal then. Oh. Don't bother trying to lie to me, because it obviously won't work."
You mentally give yourself a good shake and try to focus on your objective. You could probably knife this bastard just as easily as any other demon.
He rolls his eyes, "Mortals, all of you are so feeble-minded. Tell me, what is it you want? True love? Fortune? An extra cup size? Go ahead, sweetheart. This is always the busiest night in Hell."
"I want you to stop whichever one of your little minions it is from wearing my best friend. I only want him sane, completely alive, and back where he belongs," you hiss.
The worst thing is having someone incredibly powerful laughing directly in your face.
Which is exactly what he did. The King cackles until he doubles over, appearing to be in pain from laughing so hard. You internally cringe, and the repulsive feeling returns to your gut. He really found you.. amusing. You were concerned about the well being of your friend. Yet, this asshole was laughing.
You have to really resist the urge to whip your knife from your side and gank him right then and there.
"Not a problem, sweetheart," he raises his head, the grin still on his lips. He circles around you like a vulture, inspecting every inch of you. "Before we talk payment... Tell me, how did he end up as a vessel for a demon of mine?"
Truth be told, you weren't entirely sure. Namjoon wouldn't let some demon merely hop in his body and take it for a ride. Also, he hated messing with demons in the first place. You had kind of came to the conclusion that he had somehow been tricked, or forced. The last time you barged into his house, he had black eyes and threw you against a wall with simply a wave of his hand. He didn't answer a single question and only rummaged through his files. Maybe the demons wanted information? There was no way for you to be entirely sure.
He hums almost inaudibly, seemingly thinking. He had read your thoughts again.
"Have you considered the idea that maybe your friend wanted to be a vessel?"
Before he even finished the sentence, you were already shaking your head. "Why? Why would he want to ride backseat while someone else controls his body? That doesn't make sense."
He crosses his arms and shrugs. "How will you pay me?" his tone lowers, and he stops in front of you once more. You hold your breath as he nears you again. From this angle, you can see that innocent glimmer even better.
You frown, "Well, my soul. That's usually the price, correct?"
"Indeed," he hums. "But you can't sell me your soul when you don't have one, to begin with."
The metal jewelry glinted just enough to catch your attention. You focus your attention on the silver adorning his wrist, mulling over his words. You never played around with this kind of thing. Unless someone appeared in the middle of the night and siphoned it from you, he was lying. It wouldn't surprise you in the slightest if he really was lying. He was the King of Hell, and lying was what he did best. He tilts his head to the side, pouting.
"You don't believe me?" He asks.
He sighs and then the pout drops from his features. "The names Jungkook, by the way. Constantly referring to me as the King gets annoying after a while," he snorts.
You go silent, unsure of what to do, or what to believe. You were already low on cash, so you definitely weren't going to be able to give him a regular payment. Besides, a part in the back of your mind knew he wouldn't want it anyway. "How am I alive if I don't have a soul? How did I lose my soul?" you demand. Surprise flashes across his features, and it vanishes as quickly as it arrived.
"You think it's a big contract, just like every other mortal on Earth, don't you?" He asks in a mocking manner. "Technically, yes. You can lose your soul due to a big contract, similar to a contract that would be made here."
He pauses and steps away. He places his hand underneath his chin, trying to formulate a better way to explain his thoughts.
"It's a series of little agreements and every little fuck up counts. As for the how you're alive part, you can live a perfectly normal life even if your soul is gone. You're not unique, you're just the same as any other regular mortal. Until you die, that is. Then you're destined to fall straight into the pit."
You reflect on the haunting words, trying to think of every single thing you had done wrong. The list was honestly quite long at this point. You had done several horrible things in the past, trying to save your own ass from the fire. Only to learn that you were destined to fall right into it anyway. You never harmed animals, you never hurt anyone that didn't deserve to be hurt. You thought you were doing the moral thing.
"The devil has a thousand faces, sweetheart. Sorry to break the news this way," he mutters, not looking sorry in the slightest.
"If that's the case, then how do any souls get sold at all?"
The corner of his mouth twists in irritation. He clearly didn't appreciate the number of questions you had for him.
"Not everyone fucks up as easily as you have. Some souls simply are worth more than others, but most others just make fewer mistakes. Even if their essence is close to being fully corrupted, we usually will accept it. That is... if the deal is over something minor. You though, you're asking me to bother one of my own, and there's pretty much nothing to gain from you. No profit."
"Pathetic," he sneers condescendingly. "It's been years since I've seen a mortal completely corrupt themselves all on their own. You're lucky, though. I'm willing to fetch your little friend if you're willing to pay a different price."
Jungkook takes a confident stride towards you. You fought the urge to take a step back and start sprinting in the other direction. Jungkook cupped your face, gently brushing his thumbs against your cheekbones. Your cheeks scorched with embarrassment. Your mind clouded, and it became hard to think with him so near. Your face feels frozen, but burns where he caresses you gently. It took a moment before you could form a coherent thought.
"What's the price?" you ask, your stomach in knots.
He grins, "I get to fuck you. Since I've laid eyes on you, I've had an overwhelming desire to pin you down and whisper the filthiest things into your ear. I want to hear you whine and whimper until the pleasure becomes too much for you to handle. I think that's a fair deal, don't you?"
You felt lightheaded. The slightest breeze could come along and tip you over with ease. "Right now?" you murmur, voice failing you. You blinked rapidly, trying to clear the fog surrounding your mind and vision.
"No, Y/N. I will come to collect my payment soon."
You want to ask how he knows your name, but you figure it's a demon thing. Besides, you probably couldn't force the words out of your mouth at the moment anyway. His fingers remain on your face, and he didn't break eye contact. He was probably doing this on purpose, trying to lure you into a contract. Too bad for him, he was only wasting his energy. You were going to say yes either way. It was the eye contact, or scent, or.. something! It was him, he was the culprit making you feel this way.
"Yes," you spit out, finding it to be a struggle to make your voice go louder than a whisper.
The urge to throw yourself in his arms and let him care for you for the rest of eternity burns strongly inside of you, but you suppress it. It was his energy, you didn't even know him or anything about him. He presses his body into you eagerly, lips closing in on yours. His figure was so much warmer, compared to your mortal frame. It was thrilling, but terrifying considering you were so close to something that could easily snap you in two. Warmth spreads from the tips of your toes to the top of your head.
There was a swirl of indescribable emotions in your chest when the two of you broke apart. The kiss didn't last near as long as you wished it had. He stepped away from you, and you knew the deal was sealed.
He turns on his heel and marches away. The fog dissipates, the more distance there is between the two of you. There's another strange warmth, and it's creeping it's way up your arm. You roll up your sleeve with slightly cloudy vision, searching for the cause of the feeling. Right below the bend of your elbow is a mark. It materializes into a branded mark, and the symbol is easily recognizable. It's the sigil you drew to summon him. He had stuck a claim on you.
Your head darts up when you hear a violent cough. On the ground, a few feet away from you, is Namjoon. The sigil etched into your skin and every thought of Jungkook disappeared from your mind.
It had been a week since that night, and Namjoon was still pissed. He wouldn't admit it, but his actions spoke volumes. There had been no sign of Jungkook, leaving you regularly on edge. The mark scorched into your skin was obnoxious. At night, you would wake up, convinced someone had put your arm in a boiling pot of water.
"What's next?" Namjoon asked, reaching for one of the flasks on the bottom shelf. He shifts the basket on his arm and starts to stroll along again. You followed behind Namjoon like a lost puppy. "Oil of Abramelin," you responded, eyeing the list carefully.
When Namjoon didn't acknowledge you, you tried to pry once more.
"You can get that here?"
Namjoon kept his back turned to you, but you knew he was rolling his eyes. The building was like a maze, and the fluorescent lights above probably gave away every skin imperfection you had. There was a moment of silence, and then Namjoon sighed. "Humans who want to meddle in the dark arts can't buy anything here."
You frowned, definitely still pissed. You bite your lip, wanting to make a snide remark back, but also not wanting to see a Namjoon meltdown in public. Everything in the store seemed antique. Each item seemed crammed onto the shelf rather than place artistically. The painted text on the aisle directory signs was peeling away.
Only chunks of words were recognizable, but it didn't help in the slightest. All of the products appeared to be scattered throughout the store carelessly. So, the signs wouldn't have been much help regardless.
Namjoon led you further into the shop, and you could tell the rear of this place rarely was used. Dust had gathered on pretty much every surface available. Even the spiders had abandoned the back of the shop. Their silk webs were now another collector of dust and pollen. Namjoon ignored the cobwebs, plucking thing randomly off of the shelves as he passed them.
"Next?" Namjoon asked, stopping abruptly. You fling your arms out in front of you, trying to avoid crashing into him. You stabilize and fumble with the list.
"Fulgurite," you read, squinting at the word in confusion. "Whatever that is."
Before Namjoon could completely twist around again, you lightly hooked your fingers into the back of his shirt. He studied you with a puzzled expression, "What?"
Feeling awkward, you release his shirt and let your hand drop to your side. "How many times have I apologized already?"
The question comes off slightly harsh, although you don't intend for it to sound that way. You didn't care though, Namjoon would be way too willing to hold this grudge against you for as long as he could. Namjoon glanced around as if he was expecting to see other customers nearby. It's deserted except for the ancient cashier. She was most likely hard of hearing anyhow.
"We've already been through this," he retorted, dropping his voice low.
"Yeah, but-"
You swallowed, trying to force the words to come out of your throat. It became hard to make out the details of the room, and the features of Namjoon. A wave of heat coursed through your veins, starting with the mark. Your ears popped, and the deep voice calling your name went muffled. Through blurred vision, you could see Joon wave his hand in front of your face. Nothing you did stopped the warmth rising in your chest. You buckle over, and you feel cool hands grab you by your shoulders. Namjoon does his best to guide you to the floor as safely as possible.
Then Namjoon's soothing hands disappear. You're drifting. There's no floor underneath you, nothing you can grab onto, and the weight of your clothes is missing. The fear, the worry, it has departed too. You feel abnormally calm, despite what had just happened. You unclench your eyes, startled to see an unfamiliar sky above you. You raised yourself from the bed, breath hitching in your throat.
Jungkook sat, perched right beside you on the bed. His mouth erupts into a sinister grin, and he greets you. "Welcome to Hell."
You were in a room, not outside, you concluded. The ceiling above resembled a night sky. There was something about the way the lights twinkled that made you feel as if it wasn't real. After a few more moments of gazing at the faux sky, your eyes drifted to Jungkook. Jungkook, the reality you didn't want to face. "Hello," you murmur, almost inaudibly.
"You don't sound very happy to see me," he remarks.
Namjoon comes to mind, you envision him on his knees in the shop. He was probably baffled by how you managed to vanish right from his arms. You had absolutely no reason to be happy to see Jungkook. Jungkook shifting on the bed catches your attention. He smirks and crosses his arms, "Oh, I see. You're upset because I interrupted the fight between you and your little boy-toy."
You scoffed, "Namjoon's like a brother to me, it's not like that. Besides, he's obviously not interested, and neither am I."
"Oh, Y/N..." he trails off, shaking his head. At some point, Jungkook had moved closer to you. He snakes his fingers up your arm and to the bend of your elbow. Your heart skips a beat, and for a moment you can't breathe. Jungkook brushes his thumb over the mark, and you swear little sparks shoot up your arm. "How does Namjoon feel about you selling your body to me?"
You lower your eyes, and the deafening silence answers the question. Jungkook tilts your chin up, so you are no longer looking away from him. "You didn't tell him, did you?"
He already knew the answer, but he wanted you to confirm it. You hesitantly shook your head, "Not what I sold."
The arm he was tracing over the mark with slipped itself around your waist. The grip around your waist tightened, and you could feel Jungkook's energy shift. "Y/N, if you genuinely don't want to do this, I won't force you. Tell me now, though, and I'll leave you alone."
You disregarded the sound of your heart beating tensely, trying to think through this carefully. Jungkook called to you softly, "Y/N, I hope you realize I am a very selfish and greedy person. This can be a one-time thing, or we can do it often. Know that I have no plans to share you with someone else though."
This was your chance to say no. From past experiences, you knew you were prone to desiring a relationship, craving the romantic things. Casual sex in the past never really stayed that for you. He could never love you back if you were to fall for him. Yes, Jungkook had the decency to ask you if you wanted this or not. That didn't mean he knew how to love another.
The easy solution was just to say no. Why would you take that route though? You could decide later if you were going to take a gamble at doing this again... For now, you were not going to miss this opportunity. Overcome with desire, you breathe out a faint 'yes.'
Jungkook dipped his head down and kissed you deeply. Your eyes fell closed, and all you could feel was warmth. The warmth of his mouth on yours, the heat from the mark, and the warmth of just his very being. The intoxication that Jungkook had brought upon you last time returned. There wasn't a doubt about it, the King of Hell already had you wrapped around his finger.
You whimper when Jungkook pushes your lips apart with his tongue. He explored your mouth with the intent to claim. He was conveying his message from earlier to you again, he was not going to be willing to share your body with another. Every inch of you was now his.
He broke the kiss, allowing you to catch your breath. Jungkook went for your jaw, sloppily trailing kisses down to your neck. It took a few moments before you realized Jungkook was simultaneously pushing you down onto the bed while marking your neck. He removed himself from your neck with a frustrated growl. Jungkook raised his hand, and the tip of his finger began to glow. With a single touch to your shirt, the material crumbled and dissolved into thin air.
You gasped, shocked by the sudden actions. Jungkook didn't merely stop at your shirt. He proceeded until you were completely exposed and on display for him. His palm found your breast, his fingers massaging it in a way that had your core throbbing. The wet heat between your thighs was growing more and more with each action. He reached for your nipple, gently tugging and rubbing it between his fingertips. This provokes a whine out of you, and he hums contently. His concentration turned to the other breast, and he repeated the same steps.
"You're so fucking pretty," Jungkook uttered, nipping at your sensitive chest once more. The kisses return, but this time, they're much more rushed. His attention trails lower, down past your ribs and all the way to your thighs. Jungkook parts your legs and moves between them. He resumes his path of kisses, now that your legs are parted.
Although you should expect it, you don't. A sharp moan rips itself from your throat when Jungkook finds your clit. He takes the tender nub into his mouth, flicking his tongue over it in different patterns. You withered underneath his touch, panting wildly. This feeling was so much different compared to your previous partner's attempts. Jungkook had a skilled, very well practiced tongue. He undoubtedly knew what he was doing. Jungkook brings his hands to your hips, striving to still your trembling form.
Jungkook licks a stripe up your slit, and you mindlessly let your hand drift to his hair. You wind your fingers into his hair, and the angle he looks up at you from exposes his glistening forehead. His furrowed eyebrows and the look of concentration on his face made you ecstatic. "Does this feel good, baby?"
"F-Fuck, yes," you whimpered. A squeak escaped you when Jungkook slipped a finger inside of you. He slowly starts to work you open. Your fingers tightened in Jungkook's hair, causing him to groan. He dipped another finger into your wet heat, producing a loud noise from you. You do your best to silence your cries, but with such a cloudy mind, it's a struggle.
Jungkook seems to sense that you're holding back, so he doubles his efforts. "Such a tight little slut, you're taking my fingers so well," he smirks, knowing damn well what his words do to you. He sinks his fingers in and out of you repeatedly, working them faster than before. "...I can't wait to see how you take my cock."
Not being able to hold back any longer, you let your hips roll to meet the thrusts of his fingers. You were so slick and soaked, at this point there was no way the sheets weren't tainted. Jungkook went back to lapping at your clit, slamming his fingers in and curling them. Your back arched from the bed, sharp pleasure shooting up your spine. Jungkook had hit the sweet spot inside of you, but your brain was so muddled it took you a moment to figure out what he was doing.
His tongue circling and twirling around your sensitive clit grew faster. Jungkook added a third finger, making sure you were nice and fucked out for him. It was beginning to be too much, you didn't know how much longer you could last. You try to cry out Jungkook's name, try to warn him your about to tip over the edge, but you can't. It's too late. You clenched around his fingers, rolling your hips and wailing out his name.
He helps you ride out your orgasm, before drawing himself away from your soaked core. You expected the fogginess to lessen, instead of growing worse. You struggle, trying to scramble upwards. You're so, so tired, but you're dying to continue.
"What are you doing?" Jungkook queries, confusion written all over his features.
"Returning the favor-"
Jungkook puts a hand in front of you, motioning for you to slow down. He stands, letting his clothes disintegrate and disappear. He shakes his head, "You don't seem to understand who makes the decisions around here, but okay. You want me? You'll get me."
You peel yourself from the bed and drop to your knees obediently. Your face was perfectly level to Jungkook's long, throbbing cock. It was standing proudly, a thick vein wrapped from the top to the underside. The way Jungkook was glaring down at you had you feeling eager and more submissive than ever. You scooted closer, opening your mouth for him. "Good girl," he hums.
He slid himself over your lips a couple of times in a teasing manner. After a few moments, he finally pushes himself into your mouth. He moved slowly, not stopping until he hit the back of your throat.
You linked your hands behind your back, letting Jungkook have full control of the pace. His fingers met the back of your head, guiding you up and down his length.
"You little slut, you've had plenty of practice, hm? You're taking me pretty well," he grunted, drawing himself out of you until his head was back at your lips. You ignored the ache in your knees, knowing damn well you were going to have a horrible carpet burn later. Jungkook hisses in pleasure, "Is this how you tainted your soul? By sucking as many dicks as you could so you could become a pro?"
The words made your insides burn once more, just when you thought you were sated.
You were anxious to please, so you hollowed your cheeks against him. You went to bob your head, but Jungkook held you still. You gazed up and met his eyes, causing him to groan. A thick band of sweat was developing on his forehead. His hair was beginning to stick to his forehead. You closed your eyes, trying to focus on breathing. You hear him murmur something along the lines of, 'fucking gorgeous.' You can't make out the rest of the sentence, too concentrated on controlling your breath.
Your throat tightened around him, and for the first time in the session, you gagged. Jungkook yanked you off of him, and you gasped for air. You opened your mouth again, despite your aching jaw. He slid into your mouth with ease, meeting the back of your throat again. This time he was rougher, thrusting quicker and quicker. You knew he was getting close, and he did too. He gave a few more thrusts and then slipped out from between your lips.
You craved Jungkook more than ever now. Lust surged in you, loins stirring. His tone and his harsh words triggered something inside of you that you didn't really understand. Without speaking, you knew what Jungkook craved from you. You rose and crawled onto the bed. You were correct, your knees were fucked. You didn't pay any more attention to it, needing all of your focus to go to Jungkook.
Jungkook chuckled darkly, a knowing look in his eyes. His voice grows closer and soon enough, he's right behind you. "You're this excited to be fucked by a demon, I can't believe it. I'm a monster. I'm the fucking King of Hell, and yet here you are. You're presenting yourself to me, practically begging for it."
He planted a gentle kiss on your shoulder before rearing his hand back and slapping your ass. You glanced back in shock. One of his hands were busy, pumping up and down his cock. The other hand cracked against your skin, extracting a yelp from you. Jungkook positioned himself over you, and you arched your back into him.
"Please," you whine quietly. Your voice was unsteady, and there was nothing you could do to control it. Jungkook doesn't reply at first, deliberating on his next move. "Are you this eager for all cock, or am I just special?" he growls, delivering another smack to your ass.
"Yours! Only your cock!" you cry out, feeling tears begin to build up. His free hand roamed from your ass to your flooded heat. He cupped your core gently, and you jerked lightly. You were still a bit sensitive from the earlier orgasm. His fingers find your clit, and he flicks his wrists in a circular motion a few times. Just as quickly as the touches came, they disappeared. Your walls uncontrollably grasped and tensed around nothing.
You need him to fill you to the brim already. You needed him to fuck you until you couldn't walk or see straight. Right when your patience started running out, he puts his cock to your entrance. "I'm going to fuck you so hard, you won't be able to think of any other dick than mine. Your poor little boyfriend will never be able to make you feel this way."
You were so worked up, at this point you didn't bother to argue that Namjoon wasn't your boyfriend. He moved his cock up your slit, brushing against your clit. You wiggled excitedly, stomach in knots. The head of his cock found your entrance again. He leans his weight onto you and enters you.
"I'm going to ruin you," he barks, bringing his hand down on your backside. The initial thrusts are slow like he's testing how far your depths go. He was also most likely giving your walls time to adjust to his size. You don't hold back your noises now, letting them spring wildly from your lips. You're glad you had already orgasmed once, so you were slick. This made the glide and stretch so much better.
Then, Jungkook yanks himself from you almost entirely. When he thrusts back in, it's with nearly enough strength to knock you into the headboard. Your arms trembled, trying to hold yourself up. Jungkook slams into you again, and for a split second, you think you're going to fall face first into the silk sheets. Jungkook's hand travels up to your shoulder, and he helps hold you steady.
"Fuck," you spit out, heavily heaving. Jungkook keeps his promise, each thrust was going to ruin you. He snaps his hips up into you at a ruthless speed. Eventually, your arms do fail on you. Your face was buried into the sheets, along with your fingers twisted into them. "I don't think I've ever felt a pussy as tight as yours, fuck," he rumbles.
Jungkook places his other hand on your shoulder. He uses both arms to yank you up, and to his chest. You're lifted off the bed now, and your legs are thrown over Jungkook's thick thighs. Jungkook never stops pounding into you, although you're pretty much sitting in his lap. His hand travels from his shoulder, past your collarbones, and to your throat.
He wraps his hand gently around it, ever so slightly constricting your breathing. You snap your hips down onto him the best you can. Your tits bounce lewdly, and you can do nothing but helplessly moan. Jungkook seemed to like this angle, not wanting to release you or your throat. You rotated your hips and did your best to grind down onto him with equal passion. He releases your throat but decides to hook his arms under your own. He lets you lean forwards slightly, so the only thing keeping you from smacking your face onto the bed is his arms hooked around your shoulders.
The coil in your tummy was threatening to snap, but you urged it away. There was a tiny sense of control you had before, but now there was none. Jungkook had inhuman strength and could toss you around as he pleased. Jungkook is close to your ear, panting heavily. Somehow, he knows. "That's right, baby. You don't come until I tell you that you can. You're fucking mine."
Jungkook knew your body so well. He knew how to press your buttons and how to play with you flawlessly. He found the spot inside of you that he had previously discovered with his fingers. He angled his body so he could repeatedly jab his cock into that place. A scream erupts from your sore throat, and you try to find something to grasp onto.
You find nothing, though, and let your hands fall limply to your sides. Your limbs came back to life though when the pads of Jungkook's fingers find your clit. You nearly come on the spot but manage to choke it back. Your hands clamped around his wrist, trying to make him stop circling your sensitive nub. There was no way, you weren't going to last. There wasn't a single sign he was planning to slow down, either.
"I'm close, baby. Don't worry," Jungkook snarls. His words come off as harsh, but also endearing. His thrusts turned sloppy, and you knew he was telling the truth. No matter how messy, he was still more skilled than any other man you had ever been with.
"Come, come for me like the good girl you are," he orders, hips giving their final few jerks. You couldn't deny him even if you wanted to. The blistering, white-hot heat courses through you. He fills you immediately, and you were slightly surprised by the unfamiliar feeling. Never had someone stuffed you so full. Or filled you at all. Jungkook goes to pull out, and most of the liquid flows out from your walls.
He positions you carefully on the bed. You blink slowly, entirely spent. "You did so well for me, Y/N. Thank you," Jungkook coos. You can't see his facial expression, because you're too tired to open your eyes. Jungkook cleaned you up the best he could, and soon enough you passed out with him realizing it.
You crack your eyes open, yawning contently. There was no alarm obnoxiously beeping, forcing you to wake up. It was merely sunlight seeping through your curtains and the sound of the birds outside chirping. Jungkook must have brought you home while you were resting. Jungkook, wait? What?
Memories of last night flood you, and you raise straight up. The memories were slightly blurry, almost like you had been drunk. You frown, and after a minute or so, it becomes clear. You had held up your end of the deal.
Something still seems wrong though. You drag yourself from your bed and glance in the mirror. There are no visible bruises on you or your neck. You notice you're wearing the exact same clothes you were before Jungkook had destroyed them. After a minute or two of staring at yourself, you think you know what's wrong.
You roll up your sleeve, the mark was still there.
Jungkook had forgotten to remove it. Fuck.
#btssmutclub#BSCproject#hyunglinenetwork#jeon jungkook#jungkook/reader#smut#bts smut#bts#jungkook#jungkook x reader#bts oneshot#jungkook oneshot#dom jungkook#demons#demon jungkook#imagines#bts imagine#jimin#taehyung#yoongi#hoseok#namjoon#seokjin
3K notes
·
View notes
Text
if a great wave shall fall
Pairing: Jake Peralta/Amy Santiago
Desc: “Amy, sorry to wake you,” Terry says quickly. “There’s an active shooter at the grocery store on St Mark’s...Jake responded to it.”
Notes: title from wherever you will go - the calling (but the charlene soraia version is better). you might cry.
Read on AO3
Jake and Amy’s apartment
12:02 A.M.
Amy jolts awake to the found of her phone ringing. Not her morning alarms, not her eight month old baby, but the distinct sound of the ringtone reserved for one person only - her boss, Captain Terry Jeffords.
She reaches across the bed, the other side still empty, to grab her phone. “Hi, Captain, how can I...” She pauses as she glances over at her alarm clock. She’s not on call to come into work. There is no logical, work-related reason for her captain to be calling at this hour. “Wait, Terry, why are you calling me after midnight?”
“Amy, sorry to wake you,” Terry says quickly. “There’s an active shooter at the grocery store on St Mark’s...Jake responded to it."
After she hears her husband’s name, her world goes completely still for a few seconds. It’s long enough that she doesn’t fully absorb the rest of Terry’s words.
“He...he what?”
“He’s not by himself in there,” she hears him repeat, a bit slower and more gently. “He’s got a good team, all highly trained in situations like this. But we don’t have any updates just yet.”
As Amy’s brain goes into panic mode, she closes her eyes tightly, trying to visualize how to deal with this particular issue. It’s an emergency. Who do I call in an emergency? Jake. Who do I call if Jake is the emergency?
“I’m coming to the precinct,” Amy says, quiet but firm. “I just need to call my brother to come watch Abby.”
���Of course, Amy. I’ll call if I hear anything before you get here.”
She thanks him and ends the call, instantly going into her emergency contacts and selecting the second name on the list.
“Amy, what the-it’s three in the morning-“
Her brother, Nic, was the obvious choice when planning for an emergency such as this one. The rest of the squad were out of the question, as they could easily be involved in whatever reason Jake is unavailable. Karen lives twenty minutes away and her parents are in New Jersey, but Nic is only a five minute drive from them, making him the perfect candidate to watch Abigail. Of course, she hoped she would never have to actually call him - so much so that she never exactly told him he was their emergency go-to.
“Jake responded to an active shooting.” Her voice is still steady. She’s trained to deal with crises. “I need to go to the precinct. Can you please-“
“Oh god, Amy, I-I’ll be right there.”
The line goes dead, and Amy only allows herself a moment to try to remember how to breathe before she jumps into action.
She goes through the motions of packing an emergency bag, rummaging through the things in their bedroom: anxiety medication, phone chargers, badge and gun...
As she grabs the badge from her bedside table, her eye catches the framed photo right beside it, a moment captured by Gina’s phone of their first kiss as husband and wife. It wasn’t the professional photograph she had planned, but it’s her favourite picture ever taken of her and Jake.
Jake. Her husband. The father of her child.
It suddenly clicks that he’s actually in real, mortal danger. This isn’t just a worst case scenario, it’s the worst case scenario. The absolute worst thing that could possibly happen is one bullet away from becoming reality.
She slowly sinks down until she’s on the floor, her back against the side of their bed as the tears begin to flow. She doesn’t have time to break down, she knows that. She’s a wife, mother and sergeant - not one of those roles does she take lightly, not one leaves room for her to be weak. She’s supposed to be strong.
The opening of her bedroom door brings her back to reality, her head jolting up from where it was positioned in her hands to see her brother. His brows are furrowed with deep concern and his sweatpants and messy hair indicate that he got here as fast as is humanly possible.
“That was really fast,” she remarks, her voice trembling more than she thought it would as hot tears continue to stream down her face.
“I might have broken a few traffic laws. You can get me out of a ticket, right?” Nic smirks slightly at her horrified look. The Santiagos do not break traffic laws. “Kidding.”
Her older brother plops down on the floor next to her, putting a hand on her knee as she moves to get up.
“I need to go-“
“You need to breathe for a second before you operate a vehicle, Amy.”
She shakes her head, aggressively wiping away her tears. “I need to be there. I need to figure out what’s happening and - and I need to be a good wife and sergeant and mother and - and I need to buy more mushy peas in the morning because it’s all Abby will eat this week and now I have to go-“
“Amy, breathe.” Nic shifts over so he’s facing her, forcing her to look him in the eye. “You are strong. That’s never in question, okay? The fact that you’re breaking down right now does not make you weak, it makes you a normal person who’s going through something totally terrifying.”
She nods, letting a small sob escape her and leaning back against her soft comforter.
“I didn’t kiss him,” she says suddenly. “I…I always do, but I had just gotten Abby down for a nap and I was in the shower when he left.”
“Hey, it’s okay,” Nic says comfortingly. “You’ll get to kiss him.”
“He only took a night shift because he’s been trying to get more overtime ever since we found out I was pregnant. I told him he doesn’t have to, but he wanted to start a college fund for Abby.” Amy runs a hand through her hair, shaking her head. “He spent all his money on massage chairs and take out when I met him, and now he’s…he’s such a good dad. I can’t do this without him, I can’t come home to her alone.”
“You won’t. Jake’s tough and he’s a good cop. He’s gonna be fine.”
For the first time in a life of relentless teasing and arguments, she really hopes her brother is right.
99th Precinct
12:28 A.M.
Nobody says a word when Amy comes running off the elevator wearing leggings and an NYPD sweater smelling faintly of cologne that is noticeably to big to be hers. Terry, Rosa, Charles and Gina are gathered in a loose circle of chairs outside Gina’s former desk in front of Captain Holt’s former office that is now Terry’s. She has no idea how everyone got here so quickly, but the many cups of coffee and the bags under her friends’ eyes indicate that they all rushed to the precinct as quickly as she did without the added step of having to find someone to watch their children. There’s just about nothing that this group of people wouldn’t do for Jake Peralta, she realizes.
Amidst the silence, everyone rises from their seats and within seconds she’s being pulled into a hug by Charles.
“He’ll be okay, Amy. It’s Jake, he has to be.”
Her husband’s best friend’s words resonate with her - Jake is always okay. He’s survived death threats and prison and countless dangerous operations just like this one. He hasn’t been taken from them yet, she hopes with all of her heart that he won’t be taken from them tonight. She hugs him back briefly and then pulls away to face her captain.
“Have you heard anything?”
Terry gives a solemn shake of his head. “Sorry, Amy, I still don’t know much. Holt said he’ll do everything he can to get an update, but there’s only so much even the commissioner can do in situations like this.”
She sits in the chair next to Gina, the extra seat obviously meant for her, trying not to glance just to her left at the pair of desks where she spent years stealing glances at the guy that she had a minor crush on (okay, it was pretty major by the time she admitted it to herself and full-blown obsession by the time she told him).
She keeps her phone in her hand and the volume on high in case Jake texts that it’s over or Holt provides an update to her directly. Her heart begins to ache a little more than it has been this whole time as the elevator doors open again and the commissioner of the NYPD himself steps out. Despite the considerable relationship he has with his old detective squad, he certainly isn’t obligated to give them an update in person. Unless it’s a bad one. She isn’t going to wait to find out.
“Have you heard from Jake?” she explains in a tone that lacks politeness and professionalism, but Holt does not seem to mind. His face softens when he sees Amy in her current state.
“As of right now there are two civilians wounded, no deaths and no officers injured.” Relief washes through her instantly and she nearly falls back into Gina, who keeps her upright with a hand on her shoulder. “Unfortunately the shooter has not been taken into custody yet, so Jake and the others are still there. It is unclear at this time when they will be out.”
The thought of waiting any longer without the certainty that he’s safe makes her feel nauseous, but Captain Holt - Commissioner Holt, but he’ll always be her captain - sits next to her and says “Peralta will be alright. I believe that his tendencies to make rash decisions without proper judgement have declined significantly through your relationship.” It eases her mind for a moment.
99th Precinct
1:22 A.M.
The precinct is colder at night. It always has been, and Amy’s always noticed it. She worked late often enough to realize the change in temperature, but it wasn’t until they were assigned to the night shift by the ridiculous Captain Stentley that she came to truly loathe how cold it got.
The moment she steps into the break room tonight and a chill goes up her spine, she feels a big wave of déjà vu hit, almost as if it’s a vision from her past.
“Hey, whatcha doing in here?”
She looks up from her spot on the couch, her face buried in a case file. Despite her fatigue and the general disheartening effect of the night shift, she’s still working as hard as she always does. It eases her heart and mind a little to see her boyfriend limping through the doorway with his cane, grinning at her. It’s his first week back at work in months, and she missed seeing him across the desk from her more than she realized.
“It’s a couple degrees warmer in here than the bullpen,” she answers, shifting over on the couch so he can join her.
“Yeah, it is actually a lot colder in here at night than I remembered it,” Jake agrees, plopping down next to her with a thud. “Wait, why aren’t you wearing a jacket?”
“None of my blazers really match this blouse, so-“
Jake’s already shrugging off his leather jacket, wrapping it around her shoulders and then pulling her into his side.
“Jake, we’re at work...” she trails off, looking up through the break room window. The majority of their colleagues are nearly asleep at their desks or currently absent. She knows for a fact that Captain Holt just took his break, so he won’t be walking in any time soon.
She doesn’t think anyone would really say anything, anyways. She’s sure they all noticed how little she smiled or laughed or showed enthusiasm of any kind over the six months he was in Florida, how she would decline invitations to hang out after work or quietly excuse herself when someone mentioned him.
“You’re so warm,” she says fondly, her face squished against his chest. She allows her eyes to flutter closed, immersed in his embrace. God, she missed him so much.
“And you’re freezing,” he says with a kiss to the top of her head.
Feeling completely relaxed for the first time that night, she begins to fantasize about the comfort of her own home - or his, she doesn’t really care at this point - awaiting her when their shift is done in just two short hours. “We should definitely take a long, hot shower as soon as we get home.”
His eyes widen. “Ames, that is hardly appropriate conversation for the workplace.”
“Oh, yes, there’s nothing sexier than helping my boyfriend bathe because he has a bullet wound in his leg-“
“And who inflicted that wound upon me?”
“I saved your life!”
They’re both laughing at this point, and she can feel his chest rising and falling in sync with his laughter, the sound bouncing off the walls.
Now, the room is painfully quiet as Rosa leads her to a chair, urging her to sit down and placing a mug in front of her. She appreciates the gesture, but her nerves certainly cannot be tamed by a cup of herbal tea.
“Thanks, Rosa, but-“
“It’s coffee,” Rosa interrupts her. “I know Terry said to give you chamomile tea to relax you or whatever, but we both know it’s gonna be a long night.”
Amy nods gratefully, taking a long sip of the hot, bitter drink.
“Remember the Brooklyn Heights shooting a few years ago?” Rosa’s voice cuts through the silence.
She’s taken aback by the question, nodding slowly. Of course she remembers it - the hours Rosa’s life was up in the air were some of the scariest of her life (until today, that is).
“Did Jake ever tell you he almost came to help me even though he was ordered not to?”
Amy’s heart clenches in her chest, trying to recall the events of that day after Rosa found her drenched in toilet water. She remembers going home, taking a shower, going over some wedding plans with Kylie over the phone, falling asleep early with Jake beside her. They barely talked about the shooting at all, let alone the fact that he almost went.
“No,” Amy says quietly. “No, he never told me.”
She can’t say she’s surprised, but it still hurts her to think that she could’ve lost him weeks before their wedding. She could’ve never been married to him.
“We went to Shaw’s that night and he told me what happened,” Rosa continues. “I think I was the only one that ever found out other than Holt. But you know what he said when I asked why he came to his senses?” Amy shakes her head, still looking at Rosa with watery eyes. “You, Amy. He said he couldn’t handle the thought of leaving you alone.”
She promised herself she wouldn’t cry again, at least until she gets to hold him and inevitably breaks down in his arms (she has to keep telling herself that that moment will come) but Rosa’s revelation completely unravels her.
Rosa’s hand on her own brings her some comfort, the act of affection both rare and extremely appreciated.
“He wants to come home to you. And Jake’s stubborn as hell when he wants to be.”
Amy smiles fondly, nodding in agreement. It’s one of the things she loves and occasionally disdains.
“Yeah, he really is.”
24-Hour Grocery Store
3:14 A.M.
As soon as they get the call that the shooter’s been taken into custody, the Nine-Nine rushes to the scene of the shooting. Amy rides in the passenger seat of Terry’s car, her eyes shut tightly so more tears don’t escape as the words she heard through the speaker phone in the captain’s office replay in her brain.
Several officers down. Names and severity of injuries still unclear.
There were less than ten officers present, as far as she knows, which means there’s a significant statistical possibility that Jake is one of the several.
There are ambulances and squad cars surrounding the store, the flashing lights making Amy feel more disoriented as she jumps out of the car the moment they’ve parked.
Immediately, she spots a familiar face, Detective Ross Thompson from their neighbouring precinct, exiting the building. He’s uninjured, as far as she can tell, which first relieves her and then makes the calculation in her brain of the likelihood that Jake is one of the injured shift further out of her favour.
“Thompson!”
The way that the man’s face pales with fear when he sees her in a way that it shouldn’t at the sight of a superior officer with whom he has a pretty good professional relationship, but might at the sight of a dead man’s wife.
“Sergeant,” he says quietly. “Peralta-he, uh-“
A quick glance over his shoulder renders the rest of Thompson’s sentence obsolete. Nothing has ever shaken Amy Santiago quite as much as the sight of her husband on a stretcher, blood covering so much of him that it’s impossible to tell where he’s been shot.
Jake. She isn’t sure if she actually shouts his name or if it’s just echoing in her head the way that it has for the better part of ten years, but she manages to push past the crowd of cops and paramedics until she’s as close to him as possible.
“Jake,” she breathes, her hand clutching his where it rests limply at his side. He’s still wearing his kevlar vest, which has a mark from a bullet that surely would’ve penetrated his heart without it - she’s never been more grateful for an article of clothing. She’s close enough now to see the wound in his shoulder, where the paramedics seem to have finally stopped the blood - which is everywhere - from flowing. His name comes out like a whimper as she lets out the tears she was holding back.
“Ames?” His voice is so weak and small compared to the volume she’s used to. She squeezes his hand a little tighter as he looks up at her with wide eyes. She’s pretty sure that the look of fear on his face mirrors hers.
“Excuse me, miss, I’m going to have to ask you to step back so we can move him to the ambulance.”
Amy steps away reluctantly, only enough that the man and woman in paramedic uniforms can move the stretcher into the back of the vehicle. Jake’s groan of pain as she steps away makes her sob harder.
“Is he going to be okay?” she chokes out, following them to the ambulance parked just a few feet away.
“He’s lost a lot of blood, but we’re going to do everything we can to make sure he pulls through,” the male paramedic, a twenty-something with dark hair and bright blue eyes, informs her. “Are you his wife?” Amy nods. “You can ride in the ambulance with him.”
She climbs up into the back of the ambulance behind the paramedics, sitting as close to Jake as she can while the paramedics work around them, cleaning some of the blood off his chest.
“Why’re you crying, babe?” Jake’s eyes are barely open, his only real awareness seeming to be the fact that she’s there and she’s sobbing violently while she clutches his hand so tightly that both of their fingers are white.
She kisses the back of his hand a few times, comforted by the fact that his skin is still as warm as it always is. “I can’t lose you.”
“Not gonna…” he struggles to get the words out, his breathing laboured. “Not gonna leave you. Promise.”
He moves their joined hands almost like a handshake, a symbolic agreement that he will never leave her. She feels his grip on her loosen as he drifts off, and she holds on to both his hand and the vow that he’s just made to her. He’s not leaving her, definitely not tonight.
“I love you so much,” she whispers for no one to hear.
Brooklyn Methodist Hospital
7:21 A.M.
Mom
Just woke up to voicemail from Nic. Our prayers are with Jake. Call if you need anything, mija, we love you both very much. Xo Mom and Dad
Nic Santiago
Abby’s up and just had breakfast. All good here. Has Jake woken up yet?
Charles Boyle
Just got home. Don’t forget to text me when Jake wakes up and every hour after that with an update :)
Raymond Holt
Dear Sergeant Santiago,
Captain Jeffords has updated me on Jake’s condition. I will visit later today after you have both had adequate time to rest.
Sincerely,
Raymond Holt
Kylie
Your brother texted me. Is Jake okay?? Do you need anything?
Gina Linetti
you were passed out during my turn to visit, plz tell jake he’s not getting out of the $10 he owes me for buying pizza in ninth grade that easily. and ily both i guess
Karen Peralta
Just got your texts. I’ll be at the hospital as soon as I can - just have to find someone to cover me at work today. Give Jake a big hug from me. Sending you all my love.
Rosa Diaz
Say hey to Jake for me when he wakes up. Don’t tell him any of the lame stuff I said (yes, that is a threat)
Terry Jeffords
Thinking of you guys. Just got home to Sharon and the girls. Take all the time off you need while Jake recovers.
Amy wakes to an onslaught of text messages from her friends and family, her eyes adjusting to the harsh hospital lighting and the brightness of her phone screen. She realizes she’s only been asleep for about an hour, but it’s more than she thought she would be able to get in the uncomfortable chair next to Jake’s bed.
She glances over at her sleeping husband. If it weren’t for the sling keeping his fractured scapula immobile, he would be indistinguishable from the man she wakes up next to every single day.
Against her better judgement, knowing that she needs to let him sleep, she runs her hand through his hair. She feels a little guilty when his eyes flicker open, but it vanishes when he smiles at her. Her heart feels like it’s going to explode. She loves him so much.
“Hey, Ames” he says. His voice is hoarser than normal and still her favourite sound in the world.
“Hi, baby,” she says in a soothing voice, moving to sit on the bed in the space next to him. While one hand continues to stroke his soft curls, the other grabs his where it rests on his stomach. “How are you feeling?”
“I…can’t feel much,” he says, confirming for her that the drugs she approved that they give him are working. “Babe, where’s Abby?”
“She’s at home with Nic. He came over to watch her last night when I got the call.” Her voice breaks a little at the end of the sentence. She thinks it goes unnoticed until she feels his hand squeeze hers tighter.
“Nic’s watching her?”
Amy chuckles slightly. Apparently, Jake does not try as hard to hide the fact that Nic’s not exactly his favourite of her brothers when he’s on morphine.
“He’s a doctor, Jake. He’s capable of watching our daughter.”
“He’s also capable of judging my every move and acting like he knows everything.”
“To be fair, he probably does know a bit more about the effects that pizza bagels have on your health-“
“Well, I know more…laws,” Jake says with a huff, frowning. He looks like a five-year old that just got told it’s time for bed, and he’s completely adorable and she loves him so much.
“I bet you do,” she says warmly.
“I’m sorry I scared you. I tried to be careful for you guys.”
After Jake was rushed into surgery and she was reunited with the squad in the waiting room, Thompson filled her in on what happened. Jake had taken two bullets intended for a twelve year old boy, only one of them actually penetrating his flesh. It was the kind of decision that they’re often faced with in this job but never really prepared to make. As much as she hates the choice he made, she knows it was the right one and the same one she would’ve made.
“It’s okay, Jake,” she murmurs. They’ll talk about it more later, when the shock and the drugs and the initial terror have worn off. She leans down to kiss his lips gently. He kisses her back, his hand moving from hers to weakly cup her face. She pulls away and rests her forehead against his, her eyes still shut. “I love you so much.”
“I love you too,” he says with a quick kiss to her cheek. “’M sleepy.”
She pulls away as he closes his eyes, seconds away from drifting back into a deep sleep.
“Yeah, you should get some rest.”
“Need you,” he murmurs softly, but its still laced with urgency.
“I’m right here, honey,” she assures him. “I’m not leaving.”
He shakes his head, unsatisfied. “Need you here.” Jake shifts over in the bed to offer her more space, extending his uninjured arm so she can curl up with him.
“I shouldn’t…” she starts to say, but quickly decides that cuddling with her husband right now is a million times more important than some hospital rule.
She, very cautiously, climbs into the bed with him and melts into his side, her arm hugging his stomach. Her head tucks under his chin.
“I love you,” she says once again. “Forever.”
“I know, that’s why we got married.”
“Jake, please just let me be emotional for two seconds. My husband just got shot, it’s been a bit of a rough night for me.”
“Really? He sounds like a badass.”
Amy rolls her eyes, smiling against his chest at the sheer fact that she still gets to do that. “You’re such an idiot.”
He holds her closer, his cheek resting comfortably on the top of her head.
“I love you too, Ames.”
#otp: you're not allowed to fall in love with me#b99 fic#b99#all of the angst#also i apologize sincerely for any grammatical errors it is very late#but i wanted to post before bed#myfics
96 notes
·
View notes
Text
OPC UA server on a FPGA using open62541
Overview
Open Platform Communications Unified Architecture (OPC-UA - IEC62541) is a standardized platform-independent architecture which provides a service-based data exchange. In combination with TSN it allows new possibilities when it comes to high interoperability and deterministic communication.
Based on the open62541 implementation the following steps show how everything has to be setup to get it up and running on a FPGA (Artix7 with MicroBlaze). In combination with NetTimeLogic’s complete FPGA based TSN solution you get the full solution for industrial communication 4.0.
The example FPGA project and the application are available here:
https://github.com/NetTimeLogic/opcua
The open62541 implementation is available here:
https://github.com/open62541/open62541
Introduction
It is not straight forward to get the open62541 OPC UA stack up and running on an embedded system even if FreeRTOS and lwip is supported. The following implementation description is based on the open62541 documentation which describes how to build the library and how to implement a basic OPC UA server. The application creates an OPC UA server thread which is running under FreeRTOS with lwip.
The FPGA use a MicroBlaze softcore with DDR3, Axi Ethernet Lite, Axi Uart Lite AXI GPIO and AXI Timer. As hardware an Arty A7-100T development board from DIGILENT is used.
Required tools
To build the full project, the following tools are required:
Xilinx Vivado 2019.1
Xilinx SDK 2019.1
CMAKE (Python 2.7.x or 3.x)
UA Expert
BSP adjustments for LWIP
Open62541 supports “freertosLWIP” as an architecture. In that case it uses the libraries of the target device which are the ones of the BSP in Xilinx SDK.
To be able to compile the open62541 library some adjustments for the lwipopts.h file are needed:
Line 10-19 https://github.com/open62541/open62541/blob/master/arch/common/ua_lwip.h
Since this file is managed by the BSP in Xilinx SDK, manual modifications are overwritten when the BSP is generated. With the following workaround, it is possible to add the additional defines over the BSP setting GUI.
1. Go to: C:\Xilinx\SDK\2019.1\data\embeddedsw\ThirdParty\sw_services\lwip211_v1_0\data
2. Open the lwip211.tcl
3. Search the proc generate_lwip_opts {libhandle} and go to the end of this procedure
4. Add before the line puts $lwipopts_fd "\#endif" the following code:
#OPEN62541 implementation
set open62541_impl [expr [common::get_property CONFIG.open62541_impl $libhandle] == true]
if {$open62541_impl} {
puts $lwipopts_fd "\#define LWIP_COMPAT_SOCKETS 0"
puts $lwipopts_fd "\#define LWIP_SOCKET 1"
puts $lwipopts_fd "\#define LWIP_DNS 1"
puts $lwipopts_fd "\#define SO_REUSE 1"
puts $lwipopts_fd "\#define LWIP_TIMEVAL_PRIVATE 0"
puts $lwipopts_fd ""
}
5. Save the file
6. Open the file lwip211.mld
7.Add the new Parameter e.g. at line 47:
PARAM name = open62541_impl, desc = "Used as an open62541 implementation?", type = bool, default = false;}
8.Save the file
9. Restart Xilinx SDK
After this change and a restart of Xilinx SDK the new option will be visible in the BSP settings GUI of the lwip.
Design preparation
Before everything is ready to build the open62541 library, the implemented FPGA design from Xilinx Vivado and a software application project in Xilinx SDK is needed. In this example project a MicroBlaze design with DDR3 is used (unfortunately the application does not fit into the available block RAM).
Vivado
The Vivado project can be created with the available tcl script. By running the implementation of the Vivado project the bitstream can be created. With File->Export->Export Hardware the hardware definition can be created.
File->Launch SDK starts the SDK.
Xilin SDK
In Xilinx SDK a new empty Application Project with the OS Platform “freertos10_xilinx” can be created.
File->New->Application Project.
After the project is created some adjustments in the OpcServer_bsp are needed
Select lwip211 as supported libraries
Go to the lwip211 and adjust following parameter:
api_mode = socket_API
open62541_impl = true
Go to the freertos20_xilinx and adjust the following parameters:
Check_for_stack_overflow = 1
total_heap_size = 2097152
Re-generate BSP sources
The environment is now ready to start with CMake.
CMake
The easiest way is to work with the CMake GUI. Later it can be used in Xilinx SDK.
CMake for open62541 is used with following adjustment:
UA_ENABLE_AMALGAMATION = ON
UA_ENABLE_HARDENING = OFF
UA_ARCH_EXTRA_INCLUDES = <path to microblaze/include>
UA_ARCH_REMOVE_FLAGS = -Wpedantic -Wno-static-in-inline -Wredundant-decls
CMAKE_C_FLAGS = -Wno-error=format= -mlittle-endian -DconfigUSE_PORT_OPTIMISED_TASK_SELECTION=0 -DconfigAPPLICATION_ALLOCATED_HEAP=3 -DUA_ARCHITECTURE_FREERTOSLWIP
UA_LOGLEVEL = 100 (optional for debugging)
1. Start the CMake GUI
2. Select the correct source code path where the open62541 GIT repository is located and define the path where you want to build the binaries:
3. Click Configure:
4. Select the CMake file which defines the compilation toolchain and other settings:
5. Click again on Configure and after that on Generate
6. The Unix Makefiles are now ready and can be added Xilinx SDK workspace:
File->Open Projects from File system
7. Now it should be possible to generate the open62541.c/h file in Xilinx SDK.
Make Target->all
8. The workspace should have now following structure:
Creating the OPC UA server application
C/C++ Build settings
For a compilation without errors some adjustments in the application project Build settings are required.
1. Add the symbol for UA_ARCHITECTURE_FREERTOSLWIP
2. Add the open62541 build directory as include path
3. Add the open62541 build directory as library search path
4. Link the folder to the source location of open62541.c/h
5. Add an exclusion pattern that only the open62541.c/h are used:
Linker script
The linker script for our OPC UA server application needs some small adjustments.
With Xilinx->Generate linker script a new lscript.ld with following settings can be created:
Heap Size: (min) 1MB
Stack Size: (min) 1MB
Now the application project should be ready for a successful compilation.
OPC UA Server app
The complate Workspace is here available:
https://github.com/NetTimeLogic/opcua/tree/master/Src/Sdk_workspace
In Xilinx SDK the source file OpcServer.c can be imported to the OpcServer application project.
The thread stack size is defined with 4096 it might be possible that the application is not running properly with other values. However, the hook functions for MallocFailed or StackOverflow might be helpful.
In a first step the network initialization is done. This includes auto negotiation, ip configuration, interface binding and starting the lwip receive thread. After that the opcua thread gets started.
Important for a working server is the configuration and especially the buffer size of the network layer. With the following settings, the server was running without any problems:
config->networkLayers->localConnectionConfig.recvBufferSize = 32768; config->networkLayers->localConnectionConfig.sendBufferSize = 32768; config->networkLayers->localConnectionConfig.maxMessageSize = 32768;
Before the server is started an object and a variable are added to the server. Additionally, a callback for the variable is configured, which allows to control the LEDs on the ArtyA7 board by an OPC client. After that the server gets started and runs until the running variable is set to false (never in this case).
Connecting to the OPC UA Server
After a successful implementation of the MicroBlaze FPGA design, building the open62541 library and compiling the OPC UA server application everything is ready.
The Arty A7 board should be connected to the PC over USB and the RJ45 is connected to a network interface adapter.
1. Open a serial terminal for the debug print out (baud rate: 115200)
2. Loading the bitstream (from Vivado or SDK)
3. Run the Application (from SDK)
4. If the application has successfully started, in the serial terminal following text is printed out:
5. Start UaExpert
6. Add the server via “Custom Discovery” with the configured open62541 hostname
7. Expand the added server to add the connection. In the serial terminal you get already some information that a new connection over TCP was detected
8. After a successful connection in UaExpert the defined object a variable are visible.
9. The variable LED can now be added to the Data Access View via drag & drop
10. By changing the boolean value of the variable, the LEDs on the ArtyA7 can be switched on /off.
Summary
To get an open62541 server running on a MicroBlaze softcore following adjustments are needed:
Add the defines in the lwip BSP for lwipopts.h:
#define LWIP_COMPAT_SOCKETS 0
#define LWIP_SOCKET 1
#define LWIP_DNS 1
#define SO_REUSE 1
#define LWIP_TIMEVAL_PRIVATE 0
Adjust the BSP settings for lwip:
api_mode = socket_API
open62541_impl = true
Adjust the BSP settings for FreeRTOS:
Check_for_stack_overflow = 1
total_heap_size = 2097152
Adjust CMake options for open62541:
UA_ENABLE_AMALGAMATION = ON
UA_ENABLE_HARDENING = OFF
UA_ARCH_EXTRA_INCLUDES = <path to microblaze/include>
UA_ARCH_REMOVE_FLAGS = -Wpedantic -Wno-static-in-inline
-Wredundant-decls
CMAKE_C_FLAGS = -Wno-error=format= -mlittle-endian
-DconfigUSE_PORT_OPTIMISED_TASK_SELECTION=0
-DconfigAPPLICATION_ALLOCATED_HEAP=3
-DUA_ARCHITECTURE_FREERTOSLWIP
UA_LOGLEVEL = 100 (optional for debugging)
Generate a linker script with at least: 1MB heap and 1MB stack
Adjust the C/C++ build settings / include sources/libraries
Define the thread stack size to 4096
Adjust the buffer size of the server config:
config->networkLayers->localConnectionConfig.recvBufferSize = 32768;
config->networkLayers->localConnectionConfig.sendBufferSize = 32768;
config->networkLayers->localConnectionConfig.maxMessageSize = 32768;
1 note
·
View note
Text
Using SQLAlchemy session from Flask raises "SQLite objects created in a thread can only be used in that same thread"
I have a Flask view which uses SQLAlchemy to query and display some blog posts. I am running my app using mod_wsgi. This view works the first time I go to the page, but returns a 500 error next time. The traceback shows the error ProgrammingError: SQLite objects created in a thread can only be used in that same thread. Why am I getting this error and how do I fix it?
views.py
engine = create_engine('sqlite:////var/www/homepage/blog.db')Base.metadata.bind = engineDBSession = sessionmaker(bind = engine)session = DBSession()@app.route('/blog')@app.route('/blog.html')def blog(): entrys = session.query(Entry).order_by(desc(Entry.timestamp)).all() return render_template('blog.html', blog_entrys = entrys)
models.py:
class Entry(Base): __tablename__ = 'entry' id = Column(Integer, primary_key = True) title = Column(String(100), nullable = False) body = Column(String, nullable = False) timestamp = Column(DateTime, nullable = False) featured = Column(Boolean, nullable = False) comments = relationship('Comment') def is_featured(self): return self.featuredclass Comment(Base): __tablename__ = 'comment' id = Column(Integer, primary_key = True) entry_id = Column(Integer, ForeignKey('entry.id')) text = Column(String(500), nullable = False) name = Column(String(80))engine = create_engine('sqlite:////var/www/homepage/blog.db')Base.metadata.create_all(engine)
Exception on /blog.html [GET]Traceback (most recent call last): File "/usr/lib/python2.6/dist-packages/flask/app.py", line 861, in wsgi_app rv = self.dispatch_request() File "/usr/lib/python2.6/dist-packages/flask/app.py", line 696, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/var/www/homepage/webserver.py", line 38, in blog entrys = session.query(Entry).order_by(desc(Entry.timestamp)).all() File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 1453, in all return list(self) File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 1565, in __iter__ return self._execute_and_instances(context) File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 1570, in _execute_and_instances mapper=self._mapper_zero_or_none()) File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/session.py", line 735, in execute clause, params or {}) File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1157, in execute params) File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1235, in _execute_clauseelement parameters=params File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1348, in __create_execution_context None, None) File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1343, in __create_execution_context connection=self, **kwargs) File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/default.py", line 381, in __init__ self.cursor = self.create_cursor() File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/default.py", line 523, in create_cursor return self._connection.connection.cursor() File "/usr/lib/python2.6/dist-packages/sqlalchemy/pool.py", line 383, in cursor c = self.connection.cursor(*args, **kwargs)ProgrammingError: (ProgrammingError) SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140244498364160 and this is thread id 140244523542272 None [{}]
https://codehunter.cc/a/flask/using-sqlalchemy-session-from-flask-raises-sqlite-objects-created-in-a-thread-can-only-be-used-in-that-same-thread
0 notes
Text
Version 339
youtube
windows
zip
exe
os x
app
linux
tar.gz
source
tar.gz
I had a good week. I fixed some bugs and finished one part of the Client API.
client api
(This is only for advanced users for now.)
The Client API is now ready for some experimentation! Although most of this work has gone much faster than I expected, the last step of actually writing the server commands along with some half-decent test code and help documentation is proving a little slower. This week rolls out 'set up API access' and 'add urls' functionality. In the coming weeks, I will roll out 'add file', 'add tags', and 'search files' commands.
The basic (under construction) outline is here:
https://hydrusnetwork.github.io/hydrus/help/client_api.html
If you are interested in writing a script to talk to the Client API, please have a play with the new service under manage services and review services and see if you can get some fun going. I am interested to hear your feedback and to help if you run into trouble.
misc
I messed up several things last week, thank you for the quick reports. The bugs with ratings service sorting, the manage import folder dialog, and setting a UPnP port on the local booru/client api are now all fixed.
I also added a button to the ratings' review services panel that allows you to delete ratings en masse based on several file categories. If you have wanted to clear all the ratings for your deleted files, check it out!
full list
client api:
wrote some ui to handle client api permissions adding and editing
wrote a 'catch a permissions request' mini-dialog for external api permissions adding
wrote api calls:
GET
/api_version
/request_new_permissions
/verify_access_key
/add_urls/get_url_info
POST
/add_urls/add_url
and made a new 'client api' help page to describe in detail what these do
wrote fairly comprehensive unit tests for the new client api
refactored a bunch of 'hydrus network' specific stuff away from general server code that the client api now uses
neatened up 401 vs 403 error handling across the program, and replaced some clientside error handling that was inelegantly borrowing these network errors
deleted very old prototype file/thumbnail client server fetch code, which was no longer in use
.
misc and bug fixes:
added a 'clear ratings' button to the ratings service 'review services' panels. it can clear out ratings for deleted, non-local, or _all_ files
the '3 downloaders are working, is it ok to close the client?' message is now folded into the 'confirm client exit (auto-yes in 15s)' dialog. this merged dialog will still appear for users who have the regular confirm client exit dialog turned off (and still auto-yeses in 15s)
the file url downloader now reports 'downloading file' and 'importing url' text status separately
fixed a typo bug from last week that was breaking asc/desc ratings service sorting
fixed a typo bug from last week that was stopping manage import folders from opening
fixed a typo bug from last week that was breaking setting upnp port on the local booru/client api service management panel
the advanced file reparse-and-re-thumbnailing routine now correctly moves a file to its new extension if its mime changes (e.g. png->apng, or webm/mkv distinctions)
the client file manager now silently detects and auto-repairs instances of missing files where the file actually does exist, just with the wrong extension
fixed a url parsing issue that was normalise-mangling url classes with no path but some query parameters
the network engine now uses utf-8 decoding when no specific encoding is set (previously ISO-8859-1)
fixed an ffmpeg video parsing bug when the video included Shift-JIS metadata. it should work for other unusual encodings as well
maybe cleaned up some menubar management code
the filename tagging dialog now uses a notebook for service choice, like the manage tags dialog, rather than the janky old listbook
fixed a py2-to-3 issue with the admin-only 'is server currently busy' check while a backup is running
improved some dialog button event handling. it may completely fix the 'trytoendmodal' issue some users run into
improved some JSON db serialisation error reporting code, trying to pin down an issue several users have seen with session save
improved thread-safety of serialisable objects as they serialise
misc improvements and cleanup
next week
More Client API stuff. I did 'add urls' this week because it was the simplest. I think I can do 'add file' and 'add tags', and we'll see how much of 'search files' I can do as well.
I had meant to try out some high-resolution support for the OS X release this week, but it kept getting put off. I realised I had missed it again just now and tried to slip it in, but my first attempt did not go perfectly. Rather than try to rush it together in the last moments of the week, I have decided to instead give it another go for 340. Sorry for the delay!
1 note
·
View note
Text
Introduction to the Drupal Unit-testing
You have added features to the site a few days later the customer called and told me that nothing works. You have 20 hours stuffing code and a bunch of times and go on klatsaete forms of testing to get everything working, but the brain perceives nothing and end up on the site added a broken piece. Or maybe you have a complex module with a bunch of interconnected functional, well or small, but with a lot of choices. In general, you have millions of reasons to come to the automated testing.
Use of automated testing can get rid of piles of routine operations on a regular functional testing code. To test the available AutoComplete forms and checking the result, control user access to various sections of the site and functionality, and much more.
What can we offer to test Drupal?
Testing modules and functionality in Drupal module by using SimpleTest. And, with version 7 is included in the kernel, so look the other way and do not make much sense.
Installation
To install you need to set Drupal and that the server was accessible library php-curl, with which the module implements parsing of pages. Once the module is copied to the server, you need to patch the kernel, the patch file is located in the root folder of the module. To use it you must click on the server from the root of the site:
patch-p0 <{path-to-folder-with-modules} / simpletest/D6-core-simpletest.patch Then you can just activate it in the tab with modules and you can view a list of available tests on the page admin / build / testing.
How does the SimpleTest?
In the beginning, it scans the folder modules in search of available tests, if it does not matter whether or not the module is active, the user sees and tests themselves and can not fulfill them including the corresponding module.
This is achieved thanks to the fact that, before starting the test SimpleTest creates a virtual installation of Drupal with a later and running. Already it activates the necessary modules and themes, which may differ from the installation of the current site. Further, in the software testing outsourcing services process tested caused a page or function, after which they validate and generate output information about the success or failure of the operation.
By the way, for each function testXXX setUp runs every time before performing the test.
The first test
Thus, we conclude the flood and move on to practice. In the first test we examine the creation of material such as Page, which is available in all installations. To do this we need:
Create a test file with the name imya_modulya.test and save it in the folder with the module. The file name specified in the tough SimpleTest.
Next, create the test itself:
<?php class OurModuleTest extends DrupalWebTestCase { / / Helper function, which we will generate a text with blanks and Blackjack protected function randomText ($ wordCount = 32) { $ Text =”; for ($ i = 0; $ i <$ wordCount; $ i + +) { $ Text .= $ this-> randomString (rand (4, 12)). ”; } return $ text; } / / Information about the test, which is displayed on the page of tests. public static function getInfo () { return array ( ‘Name’ => ‘Page creation test’, ‘Desc’ => ‘Testing page creation’, ‘Group’ => ‘Our tests’, ); } public function setUp () { / / Set the required modules $ Args = func_get_args (); $ Modules = array_merge (array (’help’, ’search’, ‘menu’, ‘node’), $ args); call_user_func_array (array (’parent’, ’setUp’), $ modules); / / Set the right user permissions $ Permissions = array (’access content’, ‘create page content’, ‘delete own page content’, ‘edit own page content’); / / Create a user with these rights and enter into the system $ User = $ this-> drupalCreateUser ($ permissions); $ This-> drupalLogin ($ user); } / / Testing a page public function testPageCreation () { $ Params = array ( ‘Title’ => $ this-> randomName (32) ‘Body’ => $ this-> randomText (), ); / / Call a Page Page $ This-> drupalPost (’node / add / page’, $ params, t (’Save’)); / / Check if the received input $ This-> assertText (t (’Page @ name has been created.’, Array (’@ name’ => $ params ['title'])), t (’ Page creation ‘)); } } ?>
Clear the cache and go to the page admin / build / testing. Now, there we see the drop-down tab "Our tests", which is available in a single test "Page creation test". By putting a tick on him to fulfill it. after the information is available to us "19 passes, 0 fails, and 0 exceptions". The fact that we wanted.
Now log out the user and then try to perform the test. To do this, create another test and call it testAnonymousPageCreation. From the previous test code will be different only in that we run before running $ this-> drupalLogout ()
/ / Test create page anonymous user public function testAnonymousPageCreation () { / / User Razloginivaem $ This-> drupalLogout (); $ Params = array ( ‘Title’ => $ this-> randomName (32) ‘Body’ => $ this-> randomText (), ); / / Call a Page Page $ This-> drupalPost (’node / add / page’, $ params, t (’Save’)); / / Check if the received input $ This-> assertText (t (’Page @ name has been created.’, Array (’@ name’ => $ params ['title'])), t (’ Page creation ‘)); }
Now the result of 29 passes, 5 fails, and 0 exceptions. However, this is not the result, which was worth getting. In this case, you need to check whether the user’s access is blocked to this page, this will be a successful test, this will modify the test:
/ / Test create page anonymous user public function testAnonymousPageCreation () { / / User Razloginivaem $ This-> drupalLogout (); / / Try to get the desired page $ This-> drupalGet (’node / add / page’); / / Check the server response to error 403 (Access denied) $ This-> assertResponse (403, t (’You have no permitions to this page .’)); }
Now the result: 30 passes, 0 fails, and 0 exceptions. Ok, now we know that unauthorized users can not get access to the creation of pages.
Visit here: Mobile app testing services
What’s next?
Next we have to teach myself to write code right away with the tests. SimpleTest provides enough functionality to solve many problems.
First, it helps to formalize the problem, because for the test to prescribe a clear success criteria.
Second mistake will be detected earlier and a fix will be spent significantly less time because there will be the exact information where and under what conditions the error appeared.
Third excluded mass of routine operations, in which to make a mistake and miss something important. And most importantly, always nice to know that everything he wrote is working as intended.
A small bonus
There is a set of small and major problems and issues related to testing with the help of this module, which you or come across or not, but we warn you:)
SimpleTest can not test JavaScript, therefore the functional jQuery, dynamic content spoofing, etc. test will not work :( The list of available tests (Assertions) is available here: http://drupal.org/node/265828 To form the module must be called View $ this-> drupalGet (), instead of drupalPost (). Example:
$ Params = array (’sorting’ => ’sorting_value’); $ This-> drupalGet (’find / wine-ratings’, array (’query’ => $ params));
Tests are available for inactive modules.
Establishment types, etc. should be brought to a separate module, and write all the necessary procedures in module_name.install.
If you create a separate module for testing, then the file should be added module_name.info hidden = TRUE, then the module can be invoked in the tests, but will not be available in the list.
Nodecomment module conflicts with the module comment, so you should edit the profiles \ default \ default.profile and remove it from the default settings.
And finally an extended version of the class DrupalWebTestCase, which added additional functions and features:
class ExtendedDrupalWebTestCase extends DrupalWebTestCase { protected $ admin_user; protected $ users; / / Helper function, which we will generate a text with blanks and Blackjack protected function randomText ($ wordCount = 32) { $ Text =”; for ($ i = 0; $ i <$ wordCount; $ i + +) { $ Text .= $ this-> randomString (rand (4, 12)). ”; } return $ text; } / / Change the current theme protected function setTheme ($ new_theme) { db_query ("UPDATE {system} SET status = 1 WHERE type = ‘theme’ and name = ‘% s’", $ new_theme); variable_set (’theme_default’, $ new_theme); drupal_rebuild_theme_registry (); } / / Generate file name to display a folder that is outside the temporary folder and SimpleTest can view the data after cleaning. protected function getOutputFile () { $ File_dir = file_directory_path (); $ File_dir .= ‘. / Simpletest_output_pages’; if (! is_dir ($ file_dir)) { mkdir ($ file_dir, 0777, TRUE); } return "$ file_dir / $ basename." . $ This-> randomName (10). ‘. Html’; } / / Write page protected function outputAdminPage ($ description, $ basename, $ url) { $ Output_path = $ this-> getOutputFile (); $ This-> drupalGet ($ url); $ Rv = file_put_contents ($ output_path, $ this-> drupalGetContent ()); $ This-> pass ("$ description: Contents of result page are". L (’here’, $ output_path)); } / / Write the last on-screen display protected function outputScreenContents ($ description, $ basename) { $ Output_path = $ this-> getOutputFile (); $ Rv = file_put_contents ($ output_path, $ this-> drupalGetContent ()); $ This-> pass ("$ description: Contents of result page are". L (’here’, $ output_path)); } / / Write variable to file protected function outputVariable ($ description, $ variable) { $ Output_path = $ this-> getOutputFile (); $ Rv = file_put_contents ($ output_path, ‘<html> <body> <pre>’. Print_r ($ variable, true ).’</ pre> </ body> </ html> ‘); $ This-> pass ("$ description: Contents of result page are". L (’here’, $ output_path)); } }
0 notes
Text
36 Winthrop Road, Chelsea , MA 02150. Live in the suburb in Prattville with no condo fee.
#gallery-0-5 { margin: auto; } #gallery-0-5 .gallery-item { float: left; margin-top: 10px; text-align: center; width: 33%; } #gallery-0-5 img { border: 2px solid #cfcfcf; } #gallery-0-5 .gallery-caption { margin-left: 0; } /* see gallery_shortcode() in wp-includes/media.php */
No Condo fee!
For showings email [email protected] or text 781-201-9488 http://www.bostonjeff.com
MLS # 72725847 – New Condo – Townhouse, Half-Duplex
36 Winthrop Rd – Unit 36 Chelsea, MA 02150-1120 Suffolk County
List Price: $450,000
Unit Placement: End, Corner Total Rooms: 5 Unit Level: 1 Bedrooms: 2 Grade School: Bathrooms: 1f 1h Middle School: Master Bath: High School: Fireplaces: 0 Outdoor Space Available: Handicap Access/Features: Directions: Near Newbridge Cafe.
Next Open House: Saturday, September 19, 2020 12:30 PM – 1:30 PM Event Type: In-Person
Remarks
Live on a quiet street in what some consider to be the suburb neighborhood of Prattville. Live in an attached tri-level single family with no condo fee. Share only one demising wall. Paark ya caaar in ya garaaage. Seller is willing to sell the condo AS IS Condition, which is preferred or sell the condo with custom upgrades for the new owners. Imagine, pick your paint colors, pick your floors, pick your appliances, counters, sink, faucet and backsplash, upgrade heat and A/C units. All maybe negotiable. Bring your ideas and your checkbook! Schedule a showing or come to the open houses.
Property Information
Approx. Living Area: 1,008 Sq. Ft. ($446.43/Sq. Ft.) Approx. Acres: 0.07 (3,000 Sq. Ft.) Garage Spaces: 1 Detached Living Area Includes: Heat Zones: 4 Electric Baseboard, Individual, Unit Control Parking Spaces: 2 Off-Street, On Street Permit, Paved Driveway Living Area Source: Public Record Cool Zones: 1 Wall AC, Individual, Unit Control Levels in Unit: 3 Living Area Disclosures: Disclosures: Deck needs work, Interior Pictures are from previous listing. Seller will credit for deck work, paint, sand and polish floors, replace carpets a/c upgrade, fix the deck with acceptable offer. All the appliances will be negotiable with acceptable offer.Sellers can close ASAP or by the end of the year
Complex & Association Information
Complex Name: Units in Complex: 2 Complete: Yes Units Owner Occupied: 2 Source: 2 Association: No Fee: Assoc. Fee Inclds:
Optional Fee: $750 Inclds: Master Insurance Special Assessments:
No
Room Levels, Dimensions and Features
Room Level Size Features
Features
Area Amenities: Public Transportation, Shopping, Medical Facility, Laundromat, Bike Path, Conservation Area, Highway Access, House of Worship, Public School, T-Station Appliances: Dishwasher, Refrigerator, Washer, Dryer Association Pool: No Basement: Yes Full, Walk Out, Interior Access Beach: No Construction: Frame, Brick Exterior: Vinyl, Brick Exterior Features: Deck, Decorative Lighting, Fenced Yard, Screens, Gutters Flooring: Hardwood Hot Water: Electric Interior Features: Cable Available, Internet Available – Fiber-Optic Pets Allowed: Yes Roof Material: Asphalt/Fiberglass Shingles Sewer Utilities: City/Town Sewer Water Utilities: City/Town Water Waterfront: No Water View: No
Other Property Info
Adult Community: No Elevator: No Disclosure Declaration: No Exclusions: Laundry Features: In Unit Lead Paint: None UFFI: Warranty Features: Year Built/Converted: 1987 Year Built Source: Public Record Year Built Desc: Actual Year Round: Yes Short Sale w/Lndr. App. Req: No Lender Owned: No
Tax Information
Pin #: M:092 P:022B Assessed: $342,800 Tax: $4,590 Tax Year: 2020 Book: 60427 Page: 35 Cert: 000000100462 Zoning Code: R1 Map: Block: Lot:
36 Winthrop Road, Chelsea , MA 02150 36 Winthrop Road, Chelsea , MA 02150. Live in the suburb in Prattville with no condo fee.
#chelsea ma#chelsea ma real estate#chelsea open house#chelsea real estate broker#ChelseaRealestateagent#prattville
0 notes
Text
Augvape Narada Pro Pod Review
The Druga Narada Pro pod from Augvape and Vaporizzo is a follow up to the Narada AIO pod released late last year. The Narada Pro is the same AIO format with some extra features and upgradeable firmware. With a beefy 3.7ml capacity the Narada Pro is the perfect pocket size AIO pod. Find out more at Augvape’s website
Specs and Features
Battery: 950mAh built-in
Pod capacity: 3.7ml
Coil Resistance: 1.0ohm Coil For MTL Liquids Only and the 0.4ohm Mesh Coil
Material: Zinc Alloy+PCTG
Size: 82×18.5x40mm
Wattage range: 5-30W
Firmware up-gradable
In the box
1 x Narada Pro Battery
1 x Empty Cartridge
1 x USB-C Cable
1 x 1.0Ω Coil For MTL Liquid Only
1 x 0.4Ω Mesh Coil
1 x User Manual
1 x Warranty Card
youtube
Design
The Druga Narada Pro is an attractive looking device, with its decorative panels and zinc alloy frame. There are three designs to choose from, a black carbon fibre, red and leather, and gunmetal and wood. The Narada Pro is truly a pocket size vape being only 82mm tall and 40mm wide. The tank has a 3.7ml capacity with a removable standard 510 drip tip.
The integrated fire button allows you to control the wattage by turning. Without the extra buttons the Narada Pro maintains its sleek design. A small LED screen is located on the top of the pod. It displays your wattage, resistance, and battery level. The screen will also display the time of your draw in seconds.
The Narada Pro has an RBA which can be purchased separately. It is similar to the Smoant Pasito RBA in that it has an attachment for you to build on a mod or your ohm reader. It is very small but perfect for micro coil builds. I don’t think you’ll be able to get a clapton coil in there unless it’s a very small gauge, but the convenience of building definitely makes it worth it. In the box you receive two coils, a 0.4Ω mesh coil and a 1Ω round wire coil specifically for mouth to lung with nicotine salts.
The coils are press fit into the bottom of the pod, this makes swapping out your coil a simple process with no tool required. The pods for the Narada Pro have been designed with a top-to-bottom airflow .The airflow control can be restricted for mouth to lung by sliding the switch. The airflow wide open is still a restricted draw but it is definitely capable of direct lung hits. With the top airflow design you are less likely to have leaks, but I do feel it does make it slightly more restrictive than other pods.
Features
Out of the box the Narada Pro is a variable wattage pod. But, with the firmware update available from Augvape’s website, the Narada Pro is capable of variable voltage and temperature control. Temperature control will work with stainless steel and some nichrome. Impressive features for a small AIO device, but it does require you to download the software and manually upgrade. The process isn’t difficult if you follow the visual instructions included in the download file.
The Narada pro has a lock function to lock the resistance as it is very easy to accidentally move the dial. However, if you choose to upgrade the firmware to use temperature control and voltage mode then you will lose the functionality of the lock button. This is the one small floor of the integrated button design.Pressing the power button three times locks the device or with the firmware allows you to select the different modes.
The way the pod is designed to fit into the side of the battery is convenient, as is the side filling. It is fairly secure but it failed my drop test. I’m always dropping my pods so I like devices that stop the pod from ending up under the couch. It did fly out when dropped from a height with force, but it is otherwise reasonably secure.The USB port is located on the base of the device, which is fine since this pod doesn’t have an issue with leaking when left on its side.
Augvape Narada Pro Box
Augvape Narada Pro Integrated Button
Augva[e Narada Pro Leather and Red
Augvape Narada Pro USB Type-C
Flavour and Clouds
With the top to bottom restricted airflow I didn’t feel as though I was getting as many clouds as I would from something like the Aegis Boost. The flavour was pretty good with a ni80 coil in the RBA at 30W. The included mesh coil vapes great at 25W, producing some dense clouds with freebase juice. Flavour wise I’m getting more flavour out of the mesh coil than the RBA.
The included mouth to lung coil is best vaped at a lower wattage and is best suited to nicotine salts. It had pretty good flavour, but if you’re looking for clouds you’re going to get more from the mesh coils or the RBA using temperature control mode. With the airflow open wide I’m really pretty surprised with the amount of cloud the Narada pro can pump out.
.wp-review-6756.review-wrapper { font-family: 'Nunito', sans-serif; }
Augvape Narasda Pro Pod Review
Product Name: Narada Pro Pod
Product Description: The Druga Narada Pro pod from Augvape and Vaporizzo is a follow up to the Narada AIO pod released late last year. The Narada Pro is the same AIO format with some extra features and upgradeable firmware. With a beefy 3.7ml capacity the Narada Pro is the perfect pocket size AIO pod.
Brand: Augvape
Offer price: $52.43
Currency: AUD
Availability: InStock
Offer URL: http://shrsl.com/2fw9b
[ More ]
Design - 80
Features - 85
Flavour - 95
Clouds - 90
Bottom Line
The Augvape Narada Pro is a good looking device. If you’re not into the carbon fibre version ro the wood, the red and black leather just looks amazing. The Narada Pro is a really convenient size, it will easily fit into your pocket and weighs only 129g. The added features the firmware update provides are handy, but if you aren’t planning on using the RBA you may as well stick with the stock firmware and keep the lock function.
Flavour wasn’t bad from the included coils, the mesh was slightly better than the RBA with an Ni80 coil. Where the Narapa Pro excels is it’s hybrid AIO nature, it functions well as a pod for nicotine salts and a compact sub ohm AIO device. I think the Narada Pro will suit a range of people from new vapers to the more advanced vaper. More advanced vapers will enjoy the temperature control ability and the RBA option, where new vapers would like the simplicity and ease of operation.
Overall
88
Pros
There’s an RBA option for those of us that like to build.
By upgrading the firmware the Narada Pro also has variable voltage and temperature control.
I like the side filling on the pods, it’s convenient and mess free.
Overall I think the design is great, and the Narada Pro is a very convenient pocket size.
I’m thoroughly impressed with the battery life and the generous 3.7ml capacity. The battery lasted as long as a tank full of nicotine salts.
Cons
Upgrading the firmware removes the ability to lock the wattage setting. It’s a small inconvenience but the dial does turn easily.
I’m not a huge fan of where the airflow is, I think it would be better located on the front where I’m less likely to accidentally cover it with my finger.
.wp-review-6756.review-wrapper { width: 100%; float: left; position: relative; } .wp-review-6756.review-wrapper .review-desc { width: 60%; padding: 25px 30px 25px 30px; float: left; box-sizing: border-box; min-height: 230px; } .wp-review-6756.review-wrapper, .wp-review-6756 .review-title, .wp-review-6756 .review-desc p, .wp-review-6756 .reviewed-item p { color: #d6d6d6; } .wp-review-6756 .review-links a { background: #323233; padding: 8px 20px; box-shadow: none; color: #d6d6d6; cursor: pointer; border-radius: 3px; border: 2px solid #9900cc; transition: all 0.25s linear; } .wp-review-6756 .review-links a:hover { box-shadow: none; background: #9900cc; color: #fff; } .wp-review-6756 .review-list li, .wp-review-6756.review-wrapper { background: #323233; } .wp-review-6756 .review-list li { padding: 15px 20px 12px 20px; width: 29.3%; margin: 2%; float: left; border: 2px solid #9900cc; border-radius: 10px; box-sizing: border-box; } .wp-review-6756 .review-list li:nth-of-type(4n) { margin-right: 0; } .wp-review-6756.wp-review-circle-type .review-list .review-circle { margin-top: 0; height: 32px; } .wp-review-6756.wp-review-circle-type .review-list .wp-review-user-feature-rating-circle { margin-top: -8px; margin-bottom: 10px; } .wp-review-6756.wp-review-circle-type .review-list li { width: 46%; padding: 20px 30px 20px 30px; } .wp-review-6756.wp-review-circle-type .review-list li > span { margin-top: 4px; float: left; } .wp-review-6756.wp-review-point-type .review-list li, .wp-review-6756.wp-review-percentage-type .review-list li, .wp-review-6756.wp-review-thumbs-type .review-list li { width: 100%; padding: 15px 15px 26px 15px; border-right: none; margin: 0; border: none; } .wp-review-6756.wp-review-thumbs-type .review-list li { padding: 15px; } .wp-review-6756 .review-point, .wp-review-6756 .review-percentage { margin-right: 40px; margin-top: 5px; } .wp-review-6756 .wp-review-user-feature-rating-point + span, .wp-review-6756 .wp-review-user-feature-rating-percentage + span { margin-top: 5px; display: block; } .wp-review-6756 .wpr-user-features-rating .review-point, .wp-review-6756 .wpr-user-features-rating .review-percentage { width: 100%; } .wp-review-6756.wp-review-point-type .review-list .review-count, .wp-review-6756.wp-review-percentage-type .review-list .review-count { width: 44px; min-width: 42px; border: 2px solid #9900cc; padding: 9px 0 7px 0; text-align: center; position: absolute; right: 15px; top: 22px; border-radius: 25px; background: #323233; z-index: 1; } .wp-review-6756 .reviewed-item { border: none; } .wp-review-6756 .review-links { padding: 30px 30px 20px 30px; border-color: #9900cc; } .wp-review-6756.review-wrapper .review-result-wrapper i { font-size: 18px; } .wp-review-6756.review-wrapper li .review-result-wrapper .review-result i { color: #9900cc; } .wp-review-6756.review-wrapper .review-pros-cons { clear: both; padding: 0; border-bottom: 1px solid #9900cc; } .wp-review-6756.review-wrapper .review-pros-cons .review-pros { border-right: 1px solid #9900cc; padding: 30px; box-sizing: border-box; } .wp-review-6756.review-wrapper .review-pros-cons .review-cons { padding: 30px; box-sizing: border-box; } .wp-review-6756 .user-review-area { padding: 12px 30px; border-top: 1px solid; border-color: #9900cc; } .wp-review-6756 .wp-review-user-rating .review-result-wrapper .review-result { letter-spacing: -2.1px; } .wp-review-6756.review-wrapper .review-title { letter-spacing: 1px; font-weight: 700; padding: 15px 30px; text-transform: none; border-bottom: none; background: #323233; color: #d6d6d6; } .wp-review-6756.review-wrapper .review-total-wrapper { text-align: center; border: 10px solid #9900cc; border-radius: 50%; height: 180px; width: 180px; padding-top: 25px; clear: none; margin: 30px; box-sizing: border-box; position: absolute; right: 0; } .wp-review-6756.review-wrapper .review-list { clear: both; width: 100%; border-top: 1px solid #9900cc; border-bottom: 1px solid #9900cc; padding: 15px; overflow: hidden; float: none; display: block; margin-left: 0; } .wp-review-6756.review-wrapper .review-list .review-star, .wp-review-6756.review-wrapper .review-list .wp-review-user-feature-rating-star { margin-left: -2px; float: left; } .wp-review-6756.review-wrapper.wp-review-circle-type .review-total-wrapper { width: auto; height: auto; padding: 14px 0 0 0; border: none; } .wp-review-6756.review-wrapper.wp-review-circle-type .review-total-wrapper .review-circle.review-total { float: right; } .wp-review-6756.review-wrapper .review-percentage .review-result-wrapper, .wp-review-6756.review-wrapper .review-percentage .review-result, .wp-review-6756.review-wrapper .review-point .review-result-wrapper, .wp-review-6756.review-wrapper .review-point .review-result { height: 3px; margin-bottom: 0; background: #41465c; } .wp-review-6756.review-wrapper li .review-point .review-result { background: #9900cc; } .wp-review-6756 .review-total-wrapper .review-point.review-total, .wp-review-6756 .review-total-wrapper .review-percentage.review-total { width: 70%; display: inline-block; margin: 0 auto; } .wp-review-6756.review-wrapper .review-total-wrapper .review-total-box { font-size: 34px; float: left; text-align: center; padding: 0; color: #d6d6d6; line-height: 1.1; } .wp-review-6756.review-wrapper .review-total-wrapper .review-total-box h5 { margin-top: 10px; margin-bottom: 0; color: #d6d6d6; text-transform: uppercase; } .wp-review-6756.review-wrapper .review-star.review-total { color: #d6d6d6; } .wp-review-6756.review-wrapper .user-total-wrapper .user-review-title { display: inline-block; color: #d6d6d6; text-transform: uppercase; letter-spacing: 1px; padding: 0; border: 0; } .wp-review-6756.review-wrapper.wp-review-circle-type .user-total-wrapper h5.user-review-title { margin-top: 12px; } .wp-review-6756.review-wrapper.wp-review-circle-type .user-total-wrapper span.user-review-title { margin-top: 11px; } .wp-review-6756.review-wrapper .reviewed-item { padding: 30px; border-bottom: 1px solid #9900cc; } .wp-review-6756.review-wrapper .user-review-area .review-percentage, .wp-review-6756.review-wrapper .user-review-area .review-point { width: 20%; float: right; margin-top: 10px; margin-right: 0; } .wp-review-6756.review-wrapper .review-embed-code { padding: 7px 30px 15px; } .wp-review-6756.review-wrapper .review-embed-code #wp_review_embed_code { background: rgba(0, 0, 0, 0.15); } .wp-review-6756.review-wrapper .user-review-title { color: inherit; padding: 15px 30px; border-top: 1px solid #9900cc; } .wp-review-6756.review-wrapper .wpr-user-features-rating { clear: both; } .wp-review-6756.review-wrapper .review-thumbs .wpr-thumbs-button .wpr-thumbs-icon { border: 1px solid rgba(0, 0, 0, 0.2); background: rgba(0, 0, 0, 0.2); } .wp-review-6756 .wpr-rating-accept-btn { background: #9900cc; margin: 10px 30px; width: -moz-calc(100% - 60px); width: -webkit-calc(100% - 60px); width: -o-calc(100% - 60px); width: calc(100% - 60px); border-radius: 3px; } @media screen and (max-width:900px) { .wp-review-6756 .review-list li { width: 46%; } .wp-review-6756 .review-list li:nth-of-type(2n) { margin-right: 0; } } @media screen and (max-width:767px) { .wp-review-6756.review-wrapper .review-desc { width: 50%; } } @media screen and (max-width:600px) { .wp-review-6756.review-wrapper .review-desc { width: 100%; min-height: auto; } .wp-review-6756.review-wrapper .review-total-wrapper { float: none; clear: both; position: static; } .wp-review-6756.review-wrapper .review-pros-cons .review-pros, .wp-review-6756.review-wrapper .review-pros-cons .review-cons { flex: 100%; } .wp-review-6756.review-wrapper .review-pros-cons .review-cons { padding-top: 0; } .wp-review-6756.review-wrapper.wp-review-circle-type .review-total-wrapper .review-circle.review-total { float: left; } .wp-review-6756.review-wrapper .review-percentage .review-result-wrapper, .wp-review-6756.review-wrapper .review-percentage .review-result, .wp-review-6756.review-wrapper .review-point .review-result-wrapper, .wp-review-6756.review-wrapper .review-point .review-result { height: 10px; } } @media screen and (max-width:480px) { .wp-review-6756.review-wrapper.wp-review-circle-type .review-list li { width: 100%; } .wp-review-6756.review-wrapper .review-desc { width: 100%; } .wp-review-6756.review-wrapper .review-total-wrapper { float: none; clear: both; } .wp-review-6756.review-wrapper .review-title .review-price { float: none; } } { "@context": "http://schema.org", "@type": "Review", "itemReviewed": { "@type": "Product", "name": "Narada Pro Pod", "description": "The Druga Narada Pro pod from Augvape and Vaporizzo is a follow up to the Narada AIO pod released late last year. The Narada Pro is the same AIO format with some extra features and upgradeable firmware. With a beefy 3.7ml capacity the Narada Pro is the perfect pocket size AIO pod. ", "image": "", "brand": "Augvape", "url": "https://www.augvape.com/product/narada-pro/", "offers": { "@type": "Offer", "price": "$52.43", "priceCurrency": "AUD", "availability": "InStock", "url": "http://shrsl.com/2fw9b" }, "review": { "@type": "Review", "reviewRating": { "@type": "Rating", "ratingValue": 88, "bestRating": 100, "worstRating": 0 }, "author": { "@type": "Person", "name": "dragonmagicvape" }, "reviewBody": "<p><span style="font-weight: 400">The Augvape Narada Pro is a good looking device. If you’re not into the carbon fibre version ro the wood, the red and black leather just looks amazing. The Narada Pro is a really convenient size, it will easily fit into your pocket and weighs only 129g. The added features the firmware update provides are handy, but if you aren’t planning on using the RBA you may as well stick with the stock firmware and keep the lock function. </span></p><p><span style="font-weight: 400">Flavour wasn’t bad from the included coils, the mesh was slightly better than the RBA with an Ni80 coil. Where the Narapa Pro excels is it’s hybrid AIO nature, it functions well as a pod for nicotine salts and a compact sub ohm AIO device. I think the Narada Pro will suit a range of people from new vapers to the more advanced vaper. More advanced vapers will enjoy the temperature control ability and the RBA option, where new vapers would like the simplicity and ease of operation. </span></p>" } }, "reviewRating": { "@type": "Rating", "ratingValue": 88, "bestRating": 100, "worstRating": 0 }, "author": { "@type": "Person", "name": "dragonmagicvape" }, "reviewBody": "<p><span style="font-weight: 400">The Augvape Narada Pro is a good looking device. If you’re not into the carbon fibre version ro the wood, the red and black leather just looks amazing. The Narada Pro is a really convenient size, it will easily fit into your pocket and weighs only 129g. The added features the firmware update provides are handy, but if you aren’t planning on using the RBA you may as well stick with the stock firmware and keep the lock function. </span></p><p><span style="font-weight: 400">Flavour wasn’t bad from the included coils, the mesh was slightly better than the RBA with an Ni80 coil. Where the Narapa Pro excels is it’s hybrid AIO nature, it functions well as a pod for nicotine salts and a compact sub ohm AIO device. I think the Narada Pro will suit a range of people from new vapers to the more advanced vaper. More advanced vapers will enjoy the temperature control ability and the RBA option, where new vapers would like the simplicity and ease of operation. </span></p>" }
Thanks for reading, if you liked this blog post please share!
PrevPreviousFreemax Twister 30W Kit Review
The post Augvape Narada Pro Pod Review appeared first on Dragon Magic Vapes.
from WordPress https://ift.tt/31jPgDG via IFTTT
0 notes
Text
Why Every SEO Should Be Using Google Sheets Query Function
Google Sheets allows us SEOs to manipulate data in a multitude of different ways - but Google Sheets combined with the power of SQL (“Structured Query Language” for the uninitiated) takes this to the next level. Not only does the QUERY function enable us to replicate the actions of formulas such as VLOOKUPs and IF statements - they enable us to accurately and efficiently query datasets without any copy and paste errors. I know a lot of you unfamiliar with SQL may be thinking “NOPE” but bear with me and by the end of this blog you’ll understand the basics, have a handful of examples and a number of Google Sheets you can steal and have a play with.
The examples will focus on:
Using Query For Keyword Research
Using Query For Analysing Crawl Data
Using Query For Backlink Analysis
An Introduction To Query
What actually is the Query function?
QUERY is a Google Sheets formula that enables you to manipulate data sources. This function is largely considered to be one of the most powerful functions on Google Sheets and can be a gamechanger in performing key SEO tasks (and other sorts of data manipulation). Let's say, for example, are doing keyword research and have an export from Ahrefs related to the term “birthday cards.” In one simple query, we can extract all rows of data relating to keywords where:
Keyword Difficulty is below 20
Keywords are non-branded (in this case excluding keywords that contain “moonpig”)
Search Volume is above 150
The keyword contains a Featured Snippet
We also want this ordered by Volume (descending).
In the first tab we would have the full export including a large number of varying quality keywords.
The second tab would have our Query formula in A1 -
=QUERY('All Birthday Cards Keywords'!A:G,"SELECT * WHERE B < 20 AND NOT A CONTAINS 'moonpig' AND C > 150 AND G CONTAINS 'Featured snippet' ORDER BY C desc") This would automatically populate the rows and columns with just the keywords matching the specific criteria we are looking for - Here are our results.
How does this relate to SQL?
SQL is a programming language used to communicate with a database.
The QUERY function on Google Sheets allows you to use a Google Sheets version of SQL, named Syntax Query Language, which allows far more granular, accurate and speedy insights from relatively large datasets. You may have heard of SQL in relation to BigQuery - Google’s cloud based tool which allows users to query really big datasets.
For SEOs, BigQuery comes in really handy for handling huge datasets and is useful for tasks such as log file analysis, analysing CrUX data or crawl analysis. For more insights check out this blog by one of our Senior Consultants, Dom Woodman.
What is the advantage of using Query on Google Sheets?
Instead of having to write individual formulas for each column, QUERY allows you to import specific columns and rows based on select criteria or conditions. This saves the dramas of copy and paste errors (we’ve all been there before!)
QUERY datasets update in real time making it easy to update sheets on the go - you can also use the QUERY results as a reference in tables and graphs etc, which can then subsequently be used on other Google platforms such as Google Docs or Slides. Updating your data will also update your data across these platforms making everything more seamless and error free.
Queries are extremely recyclable - once you have written queries for specific datasets, you can use them again and again (and obviously adjust as you go). One example of this within SEO is when doing a backlink analysis - you can apply the same rules to a backlink export across different tabs in order to isolate URLs that reach certain criteria. See the backlink audit example below for more info.
How to Write a Query Formula
Google Sheets QUERY Syntax
Google Sheets Syntax: =QUERY(range, sql_query, [headers])
Range - this is the table or range you are looking to query
Query - This is where you write your SQL query in “quotation marks.”
Headers - this is where you can add headers (note: this is optional and it can just allocate a name for you).
Google Sheets SQL - The Basics
As mentioned earlier, the Query formula uses SQL - which has the advantage of being very logical and easy to follow. There are a few generic rules that you need to follow when using SQL. The main one being that you need to write clauses in the correct order. Firstly, I’ll go through the basics using an Ahrefs export for the keyword “birthday cards” before jumping into some more examples. Feel free to jump straight to the examples if you fancy.
Our sample dataset consists of keywords related to the term “birthday cards” - there are a number of columns including the Keyword in Column A, Difficulty in Column B etc.
SELECT
SELECT allows you to specify which columns you wish to import. Firstly let’s say we want to just select all of the keywords without any of the additional columns of data - basically just column A. What we would do is create a new tab and type in our QUERY into cell A1. The ‘range’ will stay the same across these different examples and the Query will change. =QUERY('All Birthday Cards Keywords'!A:G,"SELECT A") Here’s our result...
WHERE
WHERE allows you to specify a condition you want to match (CONTAINS is when a cell contains specific text). So let’s say we want to select the Keyword and Difficulty Columns (Column A and Column B) where the keyword contains the text “birthday” =QUERY('All Birthday Cards Keywords'!A:G,"SELECT A,B WHERE A CONTAINS 'birthday'") Here’s our result...
WHERE NOT
WHERE NOT allows you to specify a condition you do not want to match. This time let's select all columns where the keyword does not contain the text “birthday” =QUERY('All Birthday Cards Keywords'!A:G,"SELECT * WHERE NOT A CONTAINS 'birthday'") Here’s our result...
ORDER BY
ORDER BY allows you to specify how you would like your data ordered - “asc” for ascending or “desc” for descending. Let’s select the columns Keyword, Difficulty and Volume and order it by Difficulty (descending). =QUERY('All Birthday Cards Keywords'!A:G,"SELECT A,B,C ORDER BY B DESC") Here’s our result...
LIMIT
LIMIT allows you to specify a limit to the number of results Let’s select all rows where the keyword contains the text “birthday”, let’s order it by Difficulty (descending) and limit it to the top 10 results. =QUERY('All Birthday Cards Keywords'!A:G,"SELECT * WHERE A CONTAINS 'birthday' ORDER BY B DESC LIMIT 10") Here’s our result...
LABEL
LABEL allows you to specify a name for a column. Let’s just grab column A and B - and let’s label Column B “Keyword Difficulty” =QUERY('All Birthday Cards Keywords'!A:G,"SELECT A, B LABEL B 'Keyword Difficulty'") Here’s our result...
Google Sheets Query Examples
Using QUERY for Keyword Research
The first stage in querying a large data set is to have all the raw data in one tab which can be the reference for queries in other tabs. I have named this tab “All Birthday Cards Keywords.” This may feel slightly familiar to those who read the previous section. You can see all these examples in this Google Sheet. In this case, I have some (very quick and unattractive) keyword research for terms related to birthday cards.
Example 1 - Isolating Branded Keywords
For this example, I am looking to pull out all the rows of data associated with keywords containing the text “moonpig.” I am also ordering this by estimated search volume. Our Query Function =QUERY('All Birthday Cards Keywords'!A:G,"SELECT * WHERE A CONTAINS 'moonpig' ORDER BY C desc") Our Result
Example 2 - Isolating Keywords Matching Specific Criteria
In the next tab, we are looking to extract all rows of data where;
Keyword Difficulty is below 20
The keyword does not contain “moonpig”
Search Volume is above 150
The KW contains a Featured Snippet
We also want this ordered by Volume descending.
Our Query
=QUERY('All Birthday Cards Keywords'!A:G,"SELECT * WHERE B < 20 AND NOT A CONTAINS 'moonpig' AND C >150 AND G CONTAINS 'Featured snippet' ORDER BY C desc") Our Result
Example 3 - Isolating “Mother” or “Mum” related keywords
In the next tab, we are looking to extract just the keyword and search volume where;
The keyword contains “mum” or “mother”
We also want this ordered by search volume descending.
Our Query
=QUERY('All Birthday Cards Keywords'!A:G,"SELECT A,C WHERE A CONTAINS 'mum' OR A CONTAINS 'mother' ORDER BY C desc") Our Result
Using QUERY for Crawl Data
Similarly to the KW research data, we will want to have all of the data in one tab - In this case, I have run a Screaming Frog Crawl of https://www.distilled.net, naming the tab “Distilled Crawl Data - Raw & Unedited.” You can see all these examples in this Google Sheet.
Example 1 - Pulling Redirects and their Redirect URL
For this example, I am pulling just URLS that are 301 or 302 redirects and the subsequent redirect URL. Our Query Function =QUERY('Distilled Crawl Data- Raw & Unedited'!A:AV,"SELECT A,C,AT WHERE C = 301 or C = 302") Our Result
Example 2 - 404 Pages Sorted By Number of Unique Inlinks
This example requires selecting just 3 columns where the status code is 404 order by the number of unique inlinks.
Our Query Function =QUERY('Distilled Crawl Data- Raw & Unedited'!A:AV,"SELECT A, C, AJ WHERE C = 404 ORDER BY AJ desc") Our Result
Example 3 - Title Tags Over 60 Characters
The purpose of this query is to extract the URLs with title tags over 60 characters ordered by length (highest first). Our Query Function =QUERY('Distilled Crawl Data- Raw & Unedited'!A:AV,"SELECT A, C, G, H WHERE H > 60 ORDER BY H desc") Our Result
Using Query for Backlink Analysis
Again, we will want to have all of the unedited data in one tab - In this case, we have a tab called ‘Full Backlinks Export - Distilled.net.’
You can see all these examples in this Google Sheet.
Example 1 - Analysing a Backlink Profile
For this example, I am pulling the Referring Page URL, Domain Ranking, Referring Page Title, URL Ranking and Type of Link based on specific criteria:
URL ranking is above 40
The links are followed links
Our Query Function =QUERY('Full Backlinks Export - Distilled.net'!A:W,"Select F,C, G,D,N WHERE D > 40 AND N = 'Dofollow'") Our Result
Example 2 - Analysing a Backlink Profile (Round 2)
For this analysis I am pulling the Referring Page URL, Referring Page Title and Link URL based on specific criteria:
The link URL is https://www.distilled.net (this will only pull in the homepage)
The links are followed links
Our Query Function =QUERY('Full Backlinks Export - Distilled.net'!D1:W1000,"select F,G,J,N WHERE N = 'Dofollow' AND J = 'https://www.distilled.net/'") Our Result
Example 3 - Analysing Anchor Text from Non “no follow” links
For this analysis I am pulling the Referring Page URL, Link Anchor, Link URL, Type and Traffic based on specific criteria:
The links are not “no follow” links
The lists are ordered by the traffic descending.
Our Query Function =QUERY('Full Backlinks Export - Distilled.net'!A:W,"SELECT F,L,J,N,T WHERE N <> 'Nofollow' ORDER BY T desc") Our Result
Conclusion
That’s the QUERY function - welcome to a new world without copy and paste errors ruining your day. Check out all the examples accompanying Google Sheets - Keyword Research, Backlink Analysis and Crawl Analysis. If you have any feedback, questions or recommendations, get involved in the comments.
0 notes
Text
Version 432
youtube
^ After years of seeing all sorts of smaller edits using this footage, I finally discovered this source vid this week. If you like fine art, please watch it in full, it is eight minutes of unbroken kino. It gets a bit heavy at the end, not appropriate for kids. If you don't like old art, no worries, I was just chuffed this week to have finally found this thing.
windows
zip
exe
macOS
app
linux
tar.gz
I had a great week. There are a bunch of different little fixes and improvements this week, and the tag sort dropdown is now easier to use.
tag sort
Rather than a big list, the tag sort dropdown is now a dynamic control that splits the different variables (sort type, asc/desc, group by) into different mini-dropdowns that show and hide when available. Confusing labels like 'lexicographic' and 'ignore namespace' are replaced with clean 'sort by tag/subtag/count'. I hope it is a bit easier to work with now. Give it a go and let me know what you think.
If you don't like your default tag sort, you can set it under options->tags. Your existing default should be converted to the new format on update.
I also added the option to sort by sibling text or the actual tag text when you have the manage tags dialog open.
There is more work to do. One thing I don't like is if, say, on the asc/desc dropdown, you have 'a-z' selected, you can hover your mouse over and scroll down to get 'z-a', but you can't scroll up to get it. I prefer to have scroll work like 'flip' when there are only two values, where either scroll direction will make a change, so I'll figure that out, and in the file sort/collect controls, so there is even less to think about when you edit. I'll also see about saving the tag sort in the session.
I also updated the back-end of tag sorting here, so it'll be easier to update in future. Some users have asked for custom namespace sorts (e.g. creator, character, series, then the rest (a-z), then unnamespaced), so I'd like to start thinking about that properly.
misc
As some users have not realised they were getting a big session that was lagging them, the client now makes a once-per-boot gentle warning popup if your session exceeds 500k weight. If you cannot conveniently reduce your session size, you can turn this warning off under options->gui pages.
Subscriptions now work more efficiently with a very small 'first run' file limit and a larger 'normal' file limit. Previously, the second run was often charging right through the handful of files caught on first sync and getting more than it should, but now it should better recognise it has 'caught up' and stop at the right position.
advanced users
I added a String Selector/Slicer object to the parsing system. You can select the nth item or the mth to nth. m can be 'start', n can be 'end', and either can be a negative index. Try mixing it with the new String Sorter! The String Processing UI has also had an update pass to better support multiple strings--it now shows everything its parent formula had, so you can better test sorting or how processing is changing the third string in the list or similar.
The Server/Client API now support single 'range' requests for files (basically anything not html/json). Apparently Safari was having trouble getting videos from the Client API, let's see if this fixes it. If not, I can try supporting the (more complicated) multiple range requests. The server's error handling is also improved--on certain 'emergency' errors, it was sometimes hanging without closing the connection properly.
full list
tag sorting:
the tag sort dropdown has been replaced with a dynamic control. rather than one big list with all possible permutations, you now work on each variable (sort type, asc/desc, group by) separately. what you are actually sorting is easier to understand and select
my stupid "lexicographic/incidence" labelling is replaced with the simpler and neater 'tag', 'subtag', and 'count'
when in the manage tags dialog and sorting by tag or subtag, you can now turn off the 'use sibling' sort.
I'd like to further neaten the workflow here, making the individual dropdowns flip back and forth with a mouse scroll in either directior rather than being just up/down allowed. let me know overall how you find this new control
the 'tag sort' object is updated behind the scenes as well. your old value should be converted automatically
fixed an issue with count tag sorting where deleted tag counts were being counted even when not displayed
if you try to search tags on a page of thumbnails that holds an invalid tag, this is now caught gracefully and you get a little popup saying 'please run the repair invalid tags routine'
.
misc:
the client now gives a once-per-boot warning popup if your session size exceeds 500k. for those who cannot reduce session size conveniently, this popup can be turned off under _options->gui pages_
when the file import options prohibit a file due to filesize or resolution etc.., it should now always record that as an 'ignored' result rather than an 'error'
fixed an unusual error popup in thread watcher display that could occur during session load. this problem seems to have been around for a long time, but it required a watcher in a previously saved and still valid 'wait a bit' error state and was only vulnerable for a few milliseconds, so it hadn't come up before. in any case, it is fixed
subscriptions with small 'first run' file limits now work better: if you create a subscription with a fairly small 'first run' file limit (this typically matters when the number is smaller than one of the site's gallery page's worth of results), subsequent normal checks with larger file limits will be more aggressive about noticing that they 'caught up' to that small initial sync (previously, they would sometimes incorrectly think the site just got some files tagged out of order and bump right past that initial 'already in db' batch and keep going until they hit their own file limit)
.
advanced string processing:
added a String Selector/Slicer object to the parsing system. this object allows you to select the nth item in a list of parsed strings or the mth to nth items. m can be 'start' and n can be 'end', and negative indices are allowed for both. pair it with the new Sorter for some neat new tricks!
the string processing edit UI is now _more_ multi-string-aware. the test panel has had a code cleanup pass and now has a list of all the starting strings in the test data (e.g. all the urls parsed by the formula that launched the UI) rather than just the first, and a list of all results from that list. selecting any of the starting strings populates the 'single string' area, so you can now zoom in on one particular string to see what is happening to it
the String Sorter edit UI now gets all the strings at that stage of processing, so you can review the sort properly
the new String Slicer edit UI similarly gets all the strings at that stage of processing
future updates will expand multi-string presentation and testing. I'd like to show the whole list at each stage
.
server/client api core improvements:
I had a go at supporting the Range header for file (basically this means anything non-html/json) requests. I added tests and it seems to work. as I understand this mostly applies to browsers pulling video from the Client API. to start, I am supporting single range requests. if it is needed, I'll try to get Multi Range requests right, but for now they'll 416
the client now understands 416 ("can't do that requested range m8") errors
I reworked the serverside error handling chain. this has been borked for a long time due to my own lack of understanding of twisted's deferred system, and certain late-stage errors were just not being handled right. the server should no longer hang on these and now should print error info correctly, including a rough 500 in true late emergencies, and terminate the connection correctly
.
boring:
fixed up a handful of typo-borked unit tests
fixed my ordinal (xst, xnd, xrd, xth) text generator to deal with 11, 12, and 13 correctly lmao
started some db maintenance routines and logistics to recover definitions and remove orphans in future, I feel great about it so far, but it'll have to wait for more of my db 'modules' refactoring to be more useful
updated the mpv dll on the Windows release to 2021-02-28, it may improve some video support/performance
updated sqlite dll on the Windows release to 3.34.1
next week
I think I am going to do a 'clean up' week and try to polish and finish off little things, no big changes, so that I can take the rest of March and perhaps the start of April to finally focus on these network improvements in one go.
0 notes