#i mean do ARGs count as writing projects?
Explore tagged Tumblr posts
Text
i was looking through goodreads reviews to see if anyone else had the same problems i did, and i DID find this after scrolling through multiple reviews praising jj abrams for his genius (insert the longest, deepest, groaniest sigh imaginable here):
It was almost entirely perfect were it not for the Obituary. Being Brazilian, one of my biggest pet peeves – in books, movies, TV series – is when they depict Brazilians speaking Spanish. We don’t. And Abrams/Dorst thankfully used Portuguese when Brazil was involved in the storyline. In all of it, but a little piece of the Obituary, which was all in Portuguese except for 12 little displaced Spanish words left unnoticed by the editors. I know it seems like nothing, but in a book like this, where every minor detail counts toward bringing the whole story together, it broke the magic a little bit.
truly this book was not intended to be read by bilinguals! which sucks because it was the multilingual aspect of it that drew me in, so i had foolishly hoped it would be like, accurate? i'm not expecting every cultural detail to be perfectly spot on, but they could at least had a couple consultants look over it before publishing. or as a friend pointed out - it didn't NEED to involve other languages! this project is plenty ambitious even without involving other languages for Fun International Flavour. the creators bit off more than they were willing to chew.
and yeah no my real problem isn't getting some words wrong, it's just the unwillingness to engage with its own premise in a way that feels true. why pretend it's a translation if you're not going to treat it as a translated text? i get that there's something about the Mysterious Tenth Chapter that the translator may or may not have completely made up, but it didn't have to be a translator. it could be a publisher or any other person who was handed the incomplete script.
also, i maybe i'm just poisoned from a decade on tumblr but i see literal teens write really thoughtful analysis of fiction and literature every single day. meanwhile, the characters of this book:
old pencil notes: "so is the monkey S.'s familiar or his rival? blue pen: "or both... which is funny, i think." black pen: "but dark, too - being at odd with another version of yourself..." blue pen: "isn't that pretty much the definition of *regret*, though? i mean, you don't have to be some tortured artist (or scholar) to feel that way."
like... there's a lot of stuff like this. it reads very fake deep to me, like instagram poetry that's just a Relatable Feeling that would've lived its best life as a tweet. a lot of "oh... this is so real... imagine feeling LONELY... waow..."
the thing about academia and analysis is that it builds on top of existing discourse. it means deconstructing the overarching themes of a story rather than pointing out lines that are relatable and pretend that they're deeply profound for it. i'm happy to discuss the blueness of the curtains but what these characters are doing is "my curtains are blue too" or "this person had blue curtains once; maybe he's the author". idk man it just doesn't feel that smart to me! on one hand i understand that the book needs to be accessible to people outside of academia, but it's also set itself up to be this super intricate ARG but it's all tell no show!!
MAYBE IT GETS BETTER WHO'S TO SAY
some time ago i watched This Video about ergodic literature and got inspired to get the book S. by jj abrams & doug dorst. i've finally started reading it and i have Thoughts
the video i linked shows and explains the premise of the book, but here's the tl;dr - two students(ish) are writing annotations in the margins of a novel called 'ship of theseus' by mysterious author V M Straka while passing it back and forth. they are getting to know each other as well as trying to solve the mystery of Straka. it's a non-linear epistolary story told through a footnotes, scribbled comments, and inserts such as postcards et cetera.
there's a couple reason this book caught my eye in particular:
- i love "two people getting to know each other through letters/accidental text messages/notes" trope. it may just be the internet denizen in me but i'm a sucker for characters who get to know each other through text.
- immediately intruiged by the mystery author's name, Straka - it means magpie in czech, so i feel like i'm getting a head start on the mystery because i'm the specialest little boy in the world!!!!
- it looks cool as hell
(i purchased a used copy that was apparently a library copy so it feels extra Authentic hehe)
ANYWAY i'm still very early in, but i have many impressions to chew on already. first off, i really love the whole premise/medium, and it looks Really Good. there's a lot of really cool details that make it look authentic (if we ignore the COMICALLY LARGE MARGINS) - the book absolutely looks like something i could find in my grandparents' bookshelf. the comments being written in different colours of pen to signal when in the chronology they were written is very good. everything is pointing to a Very Fun and Immersive reading experience.
howeverrrrrrrrrr
while i Am having fun so far, there's also a lot of details that keep shaking my suspension of disbelief. like i am trying my best to hold on to it - im accepting the Comically Large Margins and the silly premise that these two people absolutely had to pass the book back and forth to communicate. like i am fully on board with that. it's just... i feel like this book is trying to Appear more clever than it actually is?
i think maybe the main problem for Me Specifically is that it's pretending to be a book written by a Probably European author and translated to english, but S. was so obviously written/created by americans and not intended to be read by someone who knows any of the languages they're dragging into this.
i was correct in assuming Straka is meant to be czech, as ship of theseus was originally written in czech - but it's weird to me that the narrative is completely uninterested in like... the original? there is a foreword by the translator, who goes on and on about the mysterious circumstances under which v m straka died, but the fact that the original language is czech is mentioned in a *footnote*. i would think a foreword by a translator would, realistically, say more about their credentials or their actual process of translating. or is that weird??? i took a class in classical literature in uni where that's kind of a big deal so maybe i'm biased???
BUT ALSO the fact that straka's identity is So very mysterious and very possibly a pseudonym... if you're like, genuinely trying to untangle this mystery, wouldn't you make a note about the meaning of the name??? like wouldn't you put a picture of a magpie on your conspiracy board about it?? Straka is absolutely a valid czech surname because most czech surnames are seemingly random nouns or adjectives, but if you think it's a pseudonym then someone made a very deliberate choice!!!! HELLO!!!!!!
then they listed the names of people who are thought to possibly be v m straka (of varying nationalities), and like okay maybe i'm nitpicking but i has to take a pen and fix some of them. they used SOME special letters for some of the names but very sporadically - they wrote vaclav instead of václav, and ekstrom instead of ekström... like at least be consistent if you're going to ignore special letters!
the worst language offender by far is this:
if you want "the monkey dances" it's "opice tancuje". you could also do "opičí tanec" for "the monkey's dance". this particular abomination is causing me physical pain.
one of the first inserts i ran into was a letter written in swedish + a direct translation:
GUESS WHAT I CAN READ SWEDISH TOO... i can't tell if the "original" letter is supposed to be the swedish or the english one - while the swedish seems to be grammatically correct (I THINK), it extremely reads as Something Written In English And Getting As Directly Translated To Swedish As Possible. it reads very stilted and oddly phrased. i get the impression i'm not actually supposed to be able to understand it, it's just here for Flavour, and that's fine! this one i can easily justify as the swedish being the in universe translation.
here's another very small thing that made me sigh very deeply
"at what point does this book stop being straka's alone & become *theirs*?" THE BOOK IS CALLED SHIP OF THESEUS. AREN'T YOU GUYS DOING LITERARY ANALYSIS OVER HERE??? IT'S THE FIRST CHAPTER AND YOU'RE JUST SPELLING OUT THE PREMISE TO ME TO THE POINT OF CONDESCENSION.
like. okay. maybe not everyone knows what the ship of theseus refers to (also i want to point out it feels like a very english language phrase to me. it Does exist in czech but it doesn't sound like a good or catchy title i think) - but i really do feel like two university students doing a deep dive into this book + author would 100% analyse the meaning of the title, that's like 101 level stuff!! this comment would be so easy to save - just have Mr Black Pen add a quippy comment about this being a bit on the nose, or pointing out the aptness or irony of the title, Anything. it would add so much to the believability for me.
like i didn't study literature at a higher education level so maybe i'm completely off base, but i DID study art history, and it seems almost absurd to me that these characters are doing so much digging and mystery solving about the author's mysterious past and rereading all of his books to find out more... and not engage with the basicest basics such as, the original text(s) pre-translation, possible cultural contexts, tHE TITLE... why are they drawing connections from choices made BY THE TRANSLATOR that absolutely would not be there in the original czech!! !!???!!!????!!
anyway my biggest actual problem so far is that i'm really struggling to read the actual ship of theseus. i have fun reading the annotations, but the actual book... i am Struggling. i've never been any good at reading ~*The Classics*~ so it might just not be my vibe, but i'm not sure if TOS is even a Good Book? like in this universe it's Allegedly a classic and very iconic or whatever. and obviously it's a challenge to write A Classic that makes its mark on history. and gods know there's discourse about whether or not The Classics are actually good books and that's way above my paygrade. but idk i couldn't get through chapter 1 without skimming through it because it kept boring me so bad.
i suspect i might just, keep reading the annotations storyline and not bother too much with the 'book' part of the book. i genuinely wanna see where the story goes!! despite my complaints i Am sold on the emotional core of it.
i think the premise rules so hard but i really feel like the authors are too monolingual and american and maybe haven't read that many books????? i can't speak on the latter but the former.............. maybe im the one who's too european
#haiz reads things#S.#i hope im not being too incharitable bc i really do wanna like this book so bad#and if nothing else im happy to have a copy of it in case i would ever want to construct something similar
61 notes
·
View notes
Text
Heads Up, Seven Up
Thanks for the tag, @onthetipofmyquill!
I’m just gonna post an excerpt since my seven make absolutely no sense without context lmao. And also I have been dying to post Winter Hollow stuff on this blog and I had this little short story thing I’ve been working on involving it.
There’s an urban legend where I’m from. I’m not sure how it started or when, but most everyone in my small town knew the story. It was almost uncanny how well everyone’s different versions matched up, and I wondered for a long time whether that was because of how small our community was, or if there was something else going on here. I don’t ask myself that question anymore.
The story goes something like this:
Somewhere deep in the forest, there’s an old mining town. It’s not like any of the other old mining towns though. This town, called Winter Hollow after the founding Winterholler Mining Company, was burned to the ground in the winter of 1974. Yet, some people have reported that when they went to explore the town, all of the buildings were intact. In fact, there were even people living there. However, something seemed off, and it all got even worse the longer you stayed in Winter Hollow. You would start to see the landscape changing around you. A highway would appear going through the center of town, and the woods you had hiked through to get there were now desert plains where cattle and other livestock grazed. Some of the residents in the town would start urging you to leave while you still could, but you would catch others watching you, almost hungrily. And then…
The story can end in only one way, obviously. The townsfolk kill you, sacrificing you to their great horned god. Sometimes they would also eat you. Some people would embellish the story, giving the townsfolk names, or adding in a radio station that broadcast out weird messages that made no sense. When I was younger, the parents of the community would tell a version of the story where there were weird animals lingering in the woods, waiting to snatch you up. None of us kids ever admitted to believing it, but I know some of us were successfully scared out of solo adventures in the woods for a while.
This legend was just that for most of my life, a legend. When I hit college, though, it became much more than that.
I’d always been passionate about the outdoors, and the forest was one of my favorite places on earth, so when it came time to pick a degree, obviously I picked natural resources. However, it turns out natural resources involves a lot more math than I was anticipating, and since I had nearly failed all of my high school math classes, I ended up having to take a bunch of extra math classes in order to meet the prerequisites for the stuff I actually cared about.
The first semester of my sophomore year the math class was statistics. Around the 5th day of the semester this kid sat next to me in class, a guy I had never seen before. He was about average in every respect except for the fact that he looked like he hadn’t slept in a week and that his eyes were the most vivid green I’ve ever seen in my life.
This is an open tag for anyone who wants to do it!
#tag game#my writing#winter hollow is my absolute favorite thing but it's not actually technically a writing project and it makes me SO SAD#i mean do ARGs count as writing projects?
2 notes
·
View notes
Text
Schneeplestein ARG
So this blog @schneeplestein made by @crazions caught my attention some day and it looked very interesting and I decided to follow it. Since they there have been a bunch of posts in what looks to be like an ego ARG (Alternate Reality Game) which also involves 2 other blogs. (It might not really be that but I will call it that anyway)
I like code solving and I love ARGs so i took the time to read through all of the story and decode what I can to combine it all in one post for anyone interested... Note that this thing has ended
Also note that I’ll only really go about the “hidden” material, not story, and I don’t want to repost any logs so I highly encourage anyone interested to go take a look at the original blog first. Some great work has been put into it and it deserves to be appreciated!
NOTE!! After I finished this post I did find out someone else made something and I don’t want to change anything in what I solved and take credit for stuff I haven’t done so I will just leave BIG LINK to this doc file by @3ksal that contains a lot, some stuff which I would have never been able to do
(Its a bit long so... everything is under read more)
TO SET THINGS DOWN FIRST! I might have been a bit too late to investigate all of this since I started this basically few posts before it offically ended. Some stuff seems to have changed and I have missed it :( So we start off with Henrik’s blog posting a text post containing a nice big link.
This link leads to a Vimeo upload with a placeholder text title, black and white patter and seems to contain morse code and someone speaking, all distorted. (I don’t know if there is anything behind that speech, I’m not good at all with such stuff. I also tried to solve the morse code, really tried, downloaded the video to slow it down but I just really have trouble with making out audio so... sad but I gave up on it) Besides that there is one QR-code displayed 2 times! That code is a Imgur link which will lead to this
A nice edited hospital hallway gif with some text, one of which is a code and the other another Imgur link to that
(thanks for no double coding)So we have a key and a code which I put into AES 128bit decoder (I know the creators seems to like that) and got..
A blog @97-110-116-105 . Now I found this blog way before I saw this so it was kinda useless to solve and the blog already had some posts on it. From what it looks like it belongs to Anti, so I’ll just call it Anti’s blog.
The actual story starts of with Henrik telling us his blog has seem to got all posts deleted and he has memory problems. He finds out he has some logs laying around and starts posting them along with general text posts about his situation and answered asks. After the link the first suspicious post there is this one. Some zalgo and some binary which translates to:
Someone clearly mocking Schneep On his post “a small update” is also the first time google doc links is added under the word “God”. More links like this are on some other posts later too
Some time later Schneep’s blog posts a second post similar to his very first one, it contains a Vimeo vid uploaded by the same user who uploaded the first one. It’s a glitched out distorted old ad for Camel cigarettes and wouldn’t you know? There is another QR-code in it! This time it links to a private page on Anti’s tumblr.
It shows us a morse code and a hexadecimal one.
First and foremost: I haven’t solved this. The hexadecimal code brings ”aGFwcGllc3RiaXJ0aGRheS5jYXJyZC5jw==“ which def looks like AES again but I can’t make out the key. I’m sure its in the morse code from the post plus from the video description and title but different decoders give me different answers and it just looks like a lot of random letters. Might be an anagram (that contains the word fun) but idk...
Sometime later regarding the story you might have noticed a 3rd blog from Chase that is also part of the story. It doesn’t have any hidden codes on it like the others. He interacts with some of Henrik’s posts and later even posts a convo between them!
But after some time we get a post of him on the floor along with a google doc that sounds like someone had shot him.
(Small post to note with a google doc link, I just like the writing)
Sort of hidden in some text posts throughout is a whole seperate website! (it is linked on 2 different posts)
NOTE that there was a countdown!
Taking a look at the header you can clearly tell it was counting down to Henrik’s birthday. I only found this on said date so i didn’t get to see this live, only when you click on the link it appears for half a second. And of corse... more aes code...
A sweet little message! Doesn’t mean much so back onto what the website showed after the countdown:
A german “welcome” greets us and you can have a dialogue with someone (sounds like Anti imo).
You will reach an end and depending on if the one you’re talking to liked your answers or not you will be guided to a blank page or to a site on Schneep’s blog.
Sneaky little creator has changed the picture on this page and I wouldn’t doubt it didn’t change before I saw it too, I only got to see 2 images though. First time visting I got this
Probably a picture of infusion bags hanging? highly saturated with filters on top. Changing levels of the picture in the right top corner you can see some binary but...
The picture is small... and it was way too hard to read no matter how I changed filters so what/if that means anything is still out there and hopefully not too important.
The changed picture is this now:
This is all that was to the extra site if the picture doesn’t change again. (I checked the source code too but since it seems to be made with the help of a website tool i doubt you can even hide anything in there)
Anti’s blog starts off with this
I fairly simply Cipher that really doesn’t mean anything(or does it?). It translates to: I REMEMBER IT LIKE IT WAS YESTERDAY
In general he laughs around at the other’s misery and mocks them.Here he links to some imgur post
(”DO YOU WANT HIM TO DIE?”) Doesn’t look like there is something hidden in it, but I have to appreciate the work, it looks really cool imo
In another post he tags it something weird looking but the “?=“ definitely told me it should be a youtube video link. I have tried to solve this and the “https://youtube.com/watch?=v” is sure but the rest of the link is hard to do. I have put it through Caesar Cipher decoder and decoded it by hand a few times, but the link doesn’t seem to work. https://www.youtube.com/watch?v=9i73ddxye4c I don’t know if it’s on my part and I actually did do something wrong, the video was deleted or lil Anti just played a trick all along.
Second post that links to another imgur site:
Looks like Henrik’s workplace with all these logs, a phone with broken screen, sticky notes and empty coffee cup and yet again!
Another code...There is one across all and then even damn morse code on the red one, really doesn’t make it easier to read with the 3d effect on top. I like to think I typed it off right and that “XILDM” was the key but it didn’t work. Plus the morse code is hard to read and I’m not sure in which order it should be so.... this is still open to be solved.
The last suspicious thing he posts is an audio post that sounds like an old clock ticking (?) getting louder. The name of it is yet another code and the picture a QR-code! The QR-code just leads to this, a google search for “does space have a sound” I thought for sure that would be the key to the code to solve it but no. I even thought ‘Maybe the key is the answer’ or the zalgo tag but no, don’t know what this one means.
All in all... I really enjoyed this!! I’m really sad to leave a bunch of things unsolved but I am not the brightest person for this. I haven’t seen anything like this in the community and outside it only a few that aren’t that interesting. While many will do a lot of code solving like this one, this also had more story and so much extra work put into it. Seriously, Google docs, the logs that were actual scanned papers, photographs, polaroids, The videos, A whole other website, The amazingly edited gifs and 3 whole blogs. A lot was put into this and I really like it, kudos to the creator, it was a really neat project! :)
#jacksepticeye#dr schneeplestein#schneeplestein arg#idk what else to tag this really?#blood tw#knife tw
8 notes
·
View notes
Text
Zwei: The Arges Adventure - Localization Blog #1
AAAAAAHHHHH IT’S FINALLY HAPPENING.
I’ve been working on this game for the better part of a year now, but have been unable to say anything about it for PR reasons – namely, that it wasn’t in a showable state, and we didn’t want to confuse prospective players by having two Zwei games announced but unreleased at the same time. Which is totally reasonable, but AAAAAAAHHHH I’VE BEEN WANTING TO TALK ABOUT THIS GAME SO BADLY YOU HAVE NO IDEA.
…Ahem. First off, I guess I should bring you all up to speed, in case you missed the announcement. Falcom’s 2001 PC classic Zwei!! is coming to the Western world via Steam, GOG, and The Humble Store in early 2018, under the name Zwei: The Arges Adventure. Why the name change? Well, because we already released its 2008 sequel, Zwei: The Ilvard Insurrection (which was originally called Zwei II: Sky-High Great Adventure in Japan).
That’s right. Localization work wrapped on the sequel first, and now we’re finishing things up with the original.
What are we thinking?!, you must be asking yourselves. Why would we release the sequel first, then go back and release the original? Why wouldn’t we release the original game first? And since we’ve already released the more modern second entry in the series from seven years later, can this earlier effort really hold its own by comparison?
Well, that’s why I’m so excited. Because Zwei: The Arges Adventure is good. REALLY good. In fact, I dare say it’s my favorite translation I’ve ever worked on to date – yes, even topping Return to PopoloCrois and Corpse Party. And if you’re at all familiar with me (this is Tom, BTW), that statement alone should tell you that Zwei: AA is something special, since PopoloCrois and Corpse Party are… shall we say, perennial favorites of mine. To put it very lightly.
So, yeah. Let’s address those hypothetical questions, shall we?
Why would we release the sequel before the original? Well, two reasons. One, because we can – these games each tell standalone stories, set on different floating continents with different casts of characters. Zwei: AA’s two protagonists, Pipiro and Pokkle, do make a few cameo appearances in Zwei: II, but this is done almost purely for the sake of fanservice (the literal kind, not the naughty kind). When all is said and done, these two games are completely standalone, taking place in the same world but telling very different stories with very different characters and a very different feel. Think of it kind of like the Ys series, but even more episodic (since, Ys Origin aside, Ys has the Adol-as-protagonist connection from one game to the next, whereas Zwei doesn’t even have that!).
The other reason is because of the nature of Zwei: AA’s code. The Japanese version of this game utilized DirectX 5, was formatted strictly for 4:3 resolution with no widescreen options whatsoever, offered a lovely FPS selection of 30 or 15 (seriously!), counted on players to play it with mouse and keyboard over gamepad (it supported gamepads, but… barely), and contained no fewer than six unlockable Windows desktop apps that were loosely tied to yet completely separate from the main game.
This is one of them. And that first screenshot at the beginning of this blog entry is another.
In other words… this is the kind of adaptive coding project that’s been known to give lesser programmers heart attacks. Getting a game like this to even run on a modern Windows machine at all – much less run WELL – was decidedly not a task for the meek. In fact, it’s because of the way this game is coded that we ultimately decided to translate the game in-house rather than working with any fan-translators as we did for Zwei: II, as no two programmers would handle this text the same way – and trying to convert a fan-translated script to a format that would work for us would’ve taken almost as long as translating the game from scratch.
So, yeah. Getting Zwei: II out first was pretty much just done because… erm… it was ready first. And it was always GOING to be ready first. Even with a lengthy QA process and a couple minor delays, it still inevitably got finished long before its predecessor was ready to make its debut.
Fortunately, we hired a veteran programmer to work with us on Zwei: AA… but you’ll never guess who! It wasn’t Sara, since she was busy getting Zwei: II ready at the time (and a fine job she did of it, with one of our smoothest PC launches ever!). But this wasn’t our first time working with the guy we worked with on this project, either. It was, however, our first time working with him to modernize someone else’s game – and he really did perform some miracles for us (and put up with my many, many demands for quality-of-life improvements and feature additions, to boot!).
The man in question? Matt Fielding, of Magnetic Realms. A.k.a. the guy who brought you the game Exile’s End.
Pictured: Exile’s End. Which is also an awesome game you should play!
And thanks to his technical wizardry, you guys are going to have an astoundingly up-to-date version of Zwei!! on your hands at launch. We’re talking more than just widescreen support here – there’s full in-game integration of the Pet Monitor and other desktop apps, new control functionality for more natural gamepad support across the board, inclusion of the arranged soundtrack from the Japan-only PSP version of the game, additional art and text content not present in any previous version of the game, and much, much more (to be detailed in future blog entries!).
Moving on to the second question I asked, with Zwei: II already out, can Zwei: AA hold its own by comparison?
I think you know what my answer’s going to be, on that one. Zwei: The Arges Adventure is a freaking awesome game with a lot to offer, and differs from its own successor in enough key areas that it can very easily hold its own any day of the week. Hell, you might even like it better than Zwei: II – it’s certainly a very close call for me, but I’d say Zwei: AA gets the slight edge!
Sure, they’re both dungeon-crawling action RPGs at their core, and they both use food to level-up, even sharing the same food exchange system to discourage grinding. And the two-character party (plus one pet), with one character taking the role of physical attacker while the other slings spells, takes center stage in both titles as well. Plus, both games are set on floating continents in the same world.
That’s a lot of similarities, but they’re all relatively superficial. You could say Zwei: AA is like the 2D answer to Zwei: II’s 3D world, but that would be discounting its snarkier and more tongue-in-cheek storyline (yes, even more than Zwei: II’s!), or the gorgeous and ludicrously colorful hand-drawn backgrounds, or the two games’ very different approaches to pets (you only get one pet in Zwei: AA as opposed to the veritable army of pets featured in Zwei: II, but that one dog or cat [or other?] has significantly more personality and gameplay involvement than its many Zwei: II counterparts), or the huge variety of minigames on offer (all of which have been adapted to play from within the game itself, despite formerly existing only as desktop apps)… and that’s just scratching the surface. In short, although the two games use the same basic template, they represent two very different approaches to game design within the confines of that template.
For me as Zwei: AA’s translator, though, I can’t help but laser-focus right on the game’s dialogue. Protagonist duo Pipiro and Pokkle are without a doubt the best pair to write that somebody like me could ever ask for. Pokkle constantly cracks bad puns (and I do mean constantly!), wears a tail for funsies, and is always hitting on women twice his age.
And Pipiro just has absolutely no filter whatsoever, and is full of so much snark that she’s fit to burst.
Practically every line out of these two is an absolute gem – and that’s to say nothing of the many quirky NPCs surrounding them over the course of their rather lengthy quest (such as the endlessly self-delusional “libertine fatass” that’s funding your adventure, and his extremely no-nonsense maid who gave him that nickname).
I… really can’t stress enough how much fun it was to write for these characters, and how inspired I was to come up with the perfect phrasing for every line. I’m extremely appreciative that we chose to translate the game in-house, as it gave me an opportunity to work much more deeply with this script than I ever could’ve if we’d only been tasked with editing it. As time went on, I found myself revising my work on a daily basis, making small tweaks here and there as new bits of wordplay or better puns popped into my head (much to Matt’s chagrin, I’m sure!). The end result is something that I can stand behind as a faithful interpretation of the game’s mood and intent – an attempt to convey the same degree of lighthearted fun and irreverence present in every line of the Japanese script, but formatted to sound more natural in English, accounting for context, tone, atmosphere, and individual character quirks rather than just hammering out a word-for-word translation.
I’ve never laughed so hard while playing a JRPG before, and I truly hope that when you guys play this one in English, you’ll find its English interpretation just as hilarious as I found its original Japanese to be. That would mean I succeeded at what I set out to do, and would bring me great joy and pride as a localizer!
And please do keep an eye on this Tumblr, as I fully intend to give lots more info about Zwei: The Arges Adventure (and more screenshots showing off lines I’m particularly proud of) in the weeks to come!
Until then, I hope you’re all continuing to enjoy Zwei: The Ilvard Insurrection, and… well, I’mma go back to testin’ Zwei: The Arges Adventure now, ‘cause I want this game to be downright perfect when it’s released! And with translation and editing 100% complete, and coding probably somewhere in the 70-80% done range, that release date will be here before you know it…
72 notes
·
View notes
Text
I’m choosing to hope there’s a narrative reason for it, since it does seem... kinda just blatantly off?
I dunno if I’m making incorrect assumptions here, but I don’t think hurt/no comfort is really what Wilbur usually write when he does stories? Like, I guess my only other experiences with his writing would be the ARG and when he went really hard with the RP in skyblock (and his music, I guess, but I’m sure that counts), so that’s not a massive data set, but with the ARG at least, it definitely felt like he was having fun making his character suffer, but as, like, a means to an end within the narrative that eventually forced the character to grow as a person.
And the way he’s been doing the writing in the DSMP (taking only season one and Ghostbur into account because I don’t know how which parts of the current arc he’s controlling or what he has planned for them), he does seem to be making his character go through a lot, but he’s also been very careful to keep him sympathetic and redeemable throughout that.
And that might just be me projecting, since I do tend to be nicer to characters than their authors intend me to be, but just- the way he wrote Vilbur’s self destructive spiral, the way he wrote Ghostbur as such an obvious foil to him...
Hearing about how much Ghostbur is suffering in the afterlife versus how much Resurrectbur is enjoying being back in the mortal plane, it feels like he’s setting up opportunities to finally have a proper confrontation between them, to finally have them speak to each other for real and give us a deeper perspective on both of them.
I just feel like he’d be the type to disguise plot set-up as poor writing so that no one expects it when he pulls out the twist.
Though I guess I’ve misread genuine bad/unsatisfying writing as set-up before, so I might just be being too optimistic...
Been trying to figure out what bothers me so much about cc!Wilburs statements about ghostbur and I think I finally have somewhat of an answer
It’s not that ghostbur is dead, it’s the fact that cc!Wilbur went out his way to detail the amount of pain ghostbur is facing while being dead.
Like is he trying to make some point about the world being a cruel place and bad things happening to good people
Because for gods sake we’ve already had that beaten over our heads by every other character in this story. The only difference being their that those characters still try to remain hopeful or fight back against their conditions somehow
cc!Wilbur’s statements about ghostbur (which I’m going to be referring to as ghostburs epilogue from here on out) Don’t line up thematically with the rest of the story
It feels like being cruel just for the sake of being cruel instead for some narrative purpose
Narratively would it not make more sense to leave it up to fans to determine whether ghostbur was indeed his own person and not connected to Wilbur other than the fact that they swap places when they die and have some shared memories or if he was still apart of Wilbur, just without a lot of his key features and therefore merged back into Wilbur after his death thus reinstilling a revived Wilbur with the new lease on live that ghostbur tried to hold on to, the same one which Wilbur lacked when he was alive (which in itself would be a really good subversion of expectations regarding ghostburs existence)
I just don’t understand why cc!Wilbur would make this epilogue except for shits and giggles at us being sad or to I guess make this story more grim dark and thus refute a bunch of the themes that have been built up in the story previously?
I just don’t know but it doesn’t sit right with me
#dream smp#dsmp#wilbur soot#ghostbur#dream smp meta#dsmp meta#it wouldn’t surprise me if I was wrong- since I don’t think anyone on the smp is a super experienced writer#they’re all amateurs at it so I guess a couple thematic breaks would make sense#but they’ve been careful about keeping up the themes over just about anything else so it would be weird for one of the biggest proponents#of said themes to suddenly switch gears like that#but again- it wouldn’t be the first time I’d made too optimistic an assumption about something like this
164 notes
·
View notes
Text
DragonFruit and System.CommandLine is a new way to think about .NET Console apps
There's some interesting stuff quietly happening in the "Console App" world within open source .NET Core right now. Within the https://github.com/dotnet/command-line-api repository are three packages:
System.CommandLine.Experimental
System.CommandLine.DragonFruit
System.CommandLine.Rendering
These are interesting experiments and directions that are exploring how to make Console apps easier to write, more compelling, and more useful.
The one I am the most infatuated with is DragonFruit.
Historically Console apps in classic C look like this:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }
That first argument argc is the count of the number of arguments you've passed in, and argv is an array of pointers to 'strings,' essentially. The actual parsing of the command line arguments and the semantic meaning of the args you've decided on are totally on you.
C# has done it this way, since always.
static void Main(string[] args) { Console.WriteLine("Hello World!"); }
It's a pretty straight conceptual port from C to C#, right? It's an array of strings. Argc is gone because you can just args.Length.
If you want to make an app that does a bunch of different stuff, you've got a lot of string parsing before you get to DO the actual stuff you're app is supposed to do. In my experience, a simple console app with real proper command line arg validation can end up with half the code parsing crap and half doing stuff.
myapp.com someCommand --param:value --verbose
The larger question - one that DragonFruit tries to answer - is why doesn't .NET do the boring stuff for you in an easy and idiomatic way?
From their docs, what if you could declare a strongly-typed Main method? This was the question that led to the creation of the experimental app model called "DragonFruit", which allows you to create an entry point with multiple parameters of various types and using default values, like this:
static void Main(int intOption = 42, bool boolOption = false, FileInfo fileOption = null) { Console.WriteLine($"The value of intOption is: {intOption}"); Console.WriteLine($"The value of boolOption is: {boolOption}"); Console.WriteLine($"The value of fileOption is: {fileOption?.FullName ?? "null"}"); }
In this concept, the Main method - the entry point - is an interface that can be used to infer options and apply defaults.
using System; namespace DragonFruit { class Program { /// <summary> /// DragonFruit simple example program /// </summary> /// <param name="verbose">Show verbose output</param> /// <param name="flavor">Which flavor to use</param> /// <param name="count">How many smoothies?</param> static int Main( bool verbose, string flavor = "chocolate", int count = 1) { if (verbose) { Console.WriteLine("Running in verbose mode"); } Console.WriteLine($"Creating {count} banana {(count == 1 ? "smoothie" : "smoothies")} with {flavor}"); return 0; } } }
I can run it like this:
> dotnet run --flavor Vanilla --count 3 Creating 3 banana smoothies with Vanilla
The way DragonFruit does this is super clever. During the build process, DragonFruit changes this public strongly typed Main to a private (so it's not seen from the outside - .NET won't consider it an entry point. It's then replaced with a Main like this, but you'll never see it as it's in the compiled/generated artifact.
public static async Task<int> Main(string[] args) { return await CommandLine.ExecuteAssemblyAsync(typeof(AutoGeneratedProgram).Assembly, args, ""); }
So DragonFruit has swapped your Main for its smarter Main and the magic happens! You'll even get free auto-generated help!
DragonFruit: DragonFruit simple example program Usage: DragonFruit [options] Options: --verbose Show verbose output --flavor <flavor> Which flavor to use --count <count> How many smoothies? --version Display version information
If you want less magic and more power, you can use the same APIs DragonFruit uses to make very sophisticated behaviors. Check out the Wiki and Repository for more and perhaps get involved in this open source project!
I really like this idea and I'd love to see it taken further! Have you used DragonFruit on a project? Or are you using another command line argument parser?
Sponsor: Ossum unifies agile planning, version control, and continuous integration into a smart platform that saves 3x the time and effort so your team can focus on building their next great product. Sign up free.
© 2019 Scott Hanselman. All rights reserved.
DragonFruit and System.CommandLine is a new way to think about .NET Console apps published first on http://7elementswd.tumblr.com/
0 notes
Text
DragonFruit and System.CommandLine is a new way to think about .NET Console apps
There's some interesting stuff quietly happening in the "Console App" world within open source .NET Core right now. Within the https://github.com/dotnet/command-line-api repository are three packages:
System.CommandLine.Experimental
System.CommandLine.DragonFruit
System.CommandLine.Rendering
These are interesting experiments and directions that are exploring how to make Console apps easier to write, more compelling, and more useful.
The one I am the most infatuated with is DragonFruit.
Historically Console apps in classic C look like this:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }
That first argument argc is the count of the number of arguments you've passed in, and argv is an array of pointers to 'strings,' essentially. The actual parsing of the command line arguments and the semantic meaning of the args you've decided on are totally on you.
C# has done it this way, since always.
static void Main(string[] args) { Console.WriteLine("Hello World!"); }
It's a pretty straight conceptual port from C to C#, right? It's an array of strings. Argc is gone because you can just args.Length.
If you want to make an app that does a bunch of different stuff, you've got a lot of string parsing before you get to DO the actual stuff you're app is supposed to do. In my experience, a simple console app with real proper command line arg validation can end up with half the code parsing crap and half doing stuff.
myapp.com someCommand --param:value --verbose
The larger question - one that DragonFruit tries to answer - is why doesn't .NET do the boring stuff for you in an easy and idiomatic way?
From their docs, what if you could declare a strongly-typed Main method? This was the question that led to the creation of the experimental app model called "DragonFruit", which allows you to create an entry point with multiple parameters of various types and using default values, like this:
static void Main(int intOption = 42, bool boolOption = false, FileInfo fileOption = null) { Console.WriteLine($"The value of intOption is: {intOption}"); Console.WriteLine($"The value of boolOption is: {boolOption}"); Console.WriteLine($"The value of fileOption is: {fileOption?.FullName ?? "null"}"); }
In this concept, the Main method - the entry point - is an interface that can be used to infer options and apply defaults.
using System; namespace DragonFruit { class Program { /// <summary> /// DragonFruit simple example program /// </summary> /// <param name="verbose">Show verbose output</param> /// <param name="flavor">Which flavor to use</param> /// <param name="count">How many smoothies?</param> static int Main( bool verbose, string flavor = "chocolate", int count = 1) { if (verbose) { Console.WriteLine("Running in verbose mode"); } Console.WriteLine($"Creating {count} banana {(count == 1 ? "smoothie" : "smoothies")} with {flavor}"); return 0; } } }
I can run it like this:
> dotnet run --flavor Vanilla --count 3 Creating 3 banana smoothies with Vanilla
The way DragonFruit does this is super clever. During the build process, DragonFruit changes this public strongly typed Main to a private (so it's not seen from the outside - .NET won't consider it an entry point. It's then replaced with a Main like this, but you'll never see it as it's in the compiled/generated artifact.
public static async Task<int> Main(string[] args) { return await CommandLine.ExecuteAssemblyAsync(typeof(AutoGeneratedProgram).Assembly, args, ""); }
So DragonFruit has swapped your Main for its smarter Main and the magic happens! You'll even get free auto-generated help!
DragonFruit: DragonFruit simple example program Usage: DragonFruit [options] Options: --verbose Show verbose output --flavor <flavor> Which flavor to use --count <count> How many smoothies? --version Display version information
If you want less magic and more power, you can use the same APIs DragonFruit uses to make very sophisticated behaviors. Check out the Wiki and Repository for more and perhaps get involved in this open source project!
I really like this idea and I'd love to see it taken further! Have you used DragonFruit on a project? Or are you using another command line argument parser?
Sponsor: Ossum unifies agile planning, version control, and continuous integration into a smart platform that saves 3x the time and effort so your team can focus on building their next great product. Sign up free.
© 2019 Scott Hanselman. All rights reserved.
DragonFruit and System.CommandLine is a new way to think about .NET Console apps published first on https://deskbysnafu.tumblr.com/
0 notes
Text
New Post has been published on Buzz News from Monkey & Elf |
New Post has been published on https://www.monkeyandelf.com/the-silver-case-on-ps4-playstation-blog/
The Silver Case on PS4 – PlayStation.Blog
Hello everyone! Judith from NIS America here with some exciting news. Fans of detective and murder mysteries, noir games, and Suda51 will want to rejoice at the upcoming title The 25th Ward: The Silver Case for PS4!
The 25th Ward was originally released as a mobile phone game back in 2005 exclusively to Japan. Set seven years after the events of The Silver Case, a string of new mysteries emerge as new and familiar faces converge to solve the murders that plague the 25th Ward.
Now with the PS4 remake on the way, Suda51 himself — as well as Grasshopper Manufacture Director Nobutaka Ichiki — sits down with us to discuss his journey from past to present. Below is an exclusive interview with Suda51 and Nobutaka Ichiki and their vision for the remake of The 25th Ward: The Silver Case.
What does the revival of The 25th Ward: The Silver Case — one of your very first titles — mean to you?
Ichiki: The original was a mobile game released in 2005 in an episodic fashion. Nowadays it’s nearly impossible to find an environment that will actually be able to play this game, and for a long time this game has been considered a “lost work.” The 25th
Ward is the first game that I worked on as a developer roughly 12 years ago, and I have always asked Suda that if there’s going to be a remake, to involve me as well. Making a re-debut of this game, including the English translation, means that my lasting wish has been fulfilled.
Suda: The 25th Ward is a game that could be called Grasshopper’s buried treasure, as there is currently no way to play it. It’s a crime suspense title that delves much deeper into the world introduced in The Silver Case. For this remake, or shall I say revival, it was approached as though it were a entirely new visual novel and we see it as an opportunity for people to play it as a brand-new Grasshopper title. As for meaning, this release means that the world of The Silver Case will continue.
Thinking back on the conception of The 25th Ward, who and/or what inspired you creatively?
Ichiki: I was inspired by the British sculptor Antony Gormley and his work. When I saw Mr. Gormley’s sculptures, it overlapped with a personal conception I had with the “observer” that appears in Suda’s scenarios. This time, the game is designed so that “the story is from an observer’s viewpoint.” The UI is largely influenced by Mr. Gormley.
Suda: While we were writing and developing The 25th Ward, we were also in the middle of developing No More Heroes. We wanted to make something that was the polar opposite of NMH, which gave us strength during the creative process. Also, during this time, Tokyo was in the process of transforming into a huge city and foreign companies were building up offices and subsequently residential areas along the bay. A new city. A new local government. How would these things affect people? Also, how would the people who newly lived here be distorted and what kinds of crimes would occur? With these thoughts in mind, The 25th Ward took shape.
What challenges did you face when remaking The 25th Ward for PS4?
Ichiki: The challenge was how to make the focal point of the game — that is the story — be directly inviting to the player. More concretely, we made rules for how everything is displayed on the screen. It then becomes necessary that things be displayed in a certain way and this necessity creates a unique rhythm. Due to the limitations of cell phones at the time, we couldn’t express everything that we wanted, but in this remake, we are paying special attention to the finest details.
Suda: The Silver Case remaster was brought to life by the talented people at AGM. The team for The 25th Ward consists of a core of veteran staff from Grasshopper which is supported by a talented group from AGM who worked on The Silver Case remaster.
The key staff member Nobutaka Ichiki has taken this game from a remaster to a remake — it’s a totally new experience and it will also contain new scenarios as well. The theme of the entire project, indeed, is to make The 25th Ward a “new” game. We’ve evolved the Film Window System from the first game and from that we want to see how deeply we can go in the world of visual novels.
All of this is being done in an indie style with a staff count of only a few people, but we are actually a larger movement daily challenging what “game development” is. In order to have the strongest lineup possible, we have former Grasshopper staff member Jun Fukuda providing sound effects and Masafumi Takada working on the music. The magnetic power of The Silver Case pulled all of these people together.
What are some prevailing themes you included in The 25th Ward?
Ichiki: This work is a compilation of several themes; “orderly society” and “heinous crimes” are themes that are shared with The Silver Case. Particularly, in this work I feel that “crimes that cannot be seen” is a very prominent theme. But since the story is discovered by the players, there are an infinite number of possibilities in the themes they might discover.
Suda: Through the world of The Silver Case, we’re exploring the essence of the formless power of crime as it is propagated. People, genetics, will, neighbors, lifestyle, the city, time, tradition, plots, plans, analyses, network crime are birthed from various places and in opposition to it stands justice. We’ve tried to interpret these omnipresent ideas from a new perspective and that is what we put into the game.
What do you hope fans look forward to most in The 25th Ward for PS4?
Ichiki: I feel that in its balance between seriousness and humor this game is without equal. Even people who have not played The Silver Case will be able to greatly enjoy this game, to say nothing of those who have played it. We have added four additional scenario chapters to the game for an even more fulfilling experience. We hope you give the game a try!
Suda: The 25th Ward is like a beast wearing the skin of The Silver Case. At this very moment, right next to me, the staff is hard at work developing the game. I’m also pushing myself to the limit writing the new scenarios. This is a game that won’t lose to that young, hungry indie creator that was my past self, and will be sharp with its own edge. Be sure to check it out and experience something completely new.
And there you have it! The 25th Ward: The Silver Case arrives on PS4 next year. Check out the official website for more information, stay tuned for the release date in the upcoming weeks!
grasshopper manufactureplaystation gamesps4The 25th Ward
var _sf_async_config = uid: 11784, domain: 'blog.us.playstation.com', section: 'grasshopper manufacture,playstation games,ps4,The 25th Ward' ;
function extractParamFromUri(uri, paramName) if (!uri) return; var uri = uri.split('#')[0]; // Remove anchor. var parts = uri.split('?'); // Check for query params. if (parts.length == 1) return; var query = decodeURI(parts[1]);
// Find url param. paramName += '='; var params = query.split('&'); for (var i = 0, param; param = params[i]; ++i) if (param.indexOf(paramName) === 0) return unescape(param.split('=')[1]);
function notifyGoogle(network, action, url) var args = ['_trackSocial', network, action]; if (url) args.push(url); if (_gaq && _gaq.push) _gaq.push(args);
window.fbAsyncInit = function() FB.init(appId: '151297214929498', status: false, cookie: false, xfbml: true); FB.Event.subscribe('edge.create', function(targetUrl) notifyGoogle('facebook', 'like', targetUrl); ); FB.Event.subscribe('edge.remove', function(targetUrl) notifyGoogle('facebook', 'unlike', targetUrl); ); ; (function() var e = document.createElement('script'); e.async = true; e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; document.getElementById('fb-root').appendChild(e); ()); jQuery(document).ready(function($) var s = document.createElement('script'); var c = document.getElementsByTagName('script')[0]; s.type = 'text/javascript'; s.async = true; s.src = 'https://platform.twitter.com/widgets.js'; c.parentNode.insertBefore(s, c); $(s).load(function() twttr.events.bind('tweet', function(event) if (event) var targetUrl; if (event.target && event.target.nodeName == 'IFRAME') targetUrl = extractParamFromUri(event.target.src, 'url'); notifyGoogle('twitter', 'tweet', targetUrl); ); ); ); Source link
0 notes
Link
via www.pyimagesearch.com
PyImageSearch reader José asks:
Hey Adrian, thanks for putting together Deep Learning for Computer Vision with Python. This is by far the best resource I’ve seen for deep learning.
My question is this:
I’m working on a project where I need to classify the scenes of outdoor photographs into four distinct categories: cities, beaches, mountains, and forests.
I’ve found a small dataset (~100 images per class), but my models are quick to overfit and far from accurate.
I’m confident I can solve this project, but I need more data.
What do you suggest?
José has a point — without enough training data, your deep learning and machine learning models can’t learn the underlying, discriminative patterns required to make robust classifications.
Which begs the question:
How in the world do you gather enough images when training deep learning models?
Deep learning algorithms, especially Convolutional Neural Networks, can be data hungry beasts.
And to make matters worse, manually annotating an image dataset can be a time consuming, tedious, and even expensive process.
So is there a way to leverage the power of Google Images to quickly gather training images and thereby cut down on the time it takes to build your dataset?
You bet there is.
In the remainder of today’s blog post I’ll be demonstrating how you can use Google Images to quickly (and easily) gather training data for your deep learning models.
Looking for the source code to this post? Jump right to the downloads section.
Deep learning and Google Images for training data
Today’s blog post is part one of a three part series on a building a Not Santa app, inspired by the Not Hotdog app in HBO’s Silicon Valley (Season 4, Episode 4).
As a kid Christmas time was my favorite time of the year — and even as an adult I always find myself happier when December rolls around.
Looking back on my childhood, my dad always went out well of his way to ensure Christmas was a magical time.
Without him I don’t think this time of year would mean as much to me (and I certainly wouldn’t be the person I am today).
In order to keep the magic of ole’ Saint Nicholas alive, we’re going to spend the next three blog posts building our Not Santa detector using deep learning:
Part #1: Gather Santa Clause training data using Google Images (this post).
Part #2: Train our Not Santa detector using deep learning, Python, and Keras.
Part #3: Deploy our trained deep learning model to the Raspberry Pi.
Let’s go ahead and get started!
Using Google Images for training data and machine learning models
The method I’m about to share with you for gathering Google Images for deep learning is from a fellow deep learning practitioner and friend of mine, Michael Sollami.
He discussed the exact same technique I’m about to share with you in a blog post of his earlier this year.
I’m going to elaborate on these steps and provide further instructions on how you can use this technique to quickly gather training data for deep learning models using Google Images, JavaScript, and a bit of Python.
The first step in using Google Images to gather training data for our Convolutional Neural Network is to head to Google Images and enter a query.
In this case we’ll be using the query term “santa clause”:
Figure 1: The first step to downloading images from Google Image Search is to enter your query and let the pictures load in your browser. Santa Claus is visiting our computer screen!
As you can see from the example image above we have our search results.
The next step is to use a tiny bit of JavaScript to gather the image URLs (which we can then download using Python later in this tutorial).
Fire up the JavaScript console (I’ll assume you are using the Chrome web browser, but you can use Firefox as well) by clicking
View => Developer => JavaScript Console
:
Figure 2: Opening Google Chrome’s JavaScript Console from the menu bar prior to performing the hack.
From there, click the
Console
tab:
Figure 3: We will enter JavaScript in the Google Chrome JavaScript Console which is displayed in this figure.
This will enable you to execute JavaScript in a REPL-like manner. The next step is to start scrolling!
Figure 4: Keep scrolling through the Google Image search results until the results are no longer relevant.
Keep scrolling until you have found all relevant images to your query. From there, we need to grab the URLs for each of these images. Switch back to the JavaScript console and then copy and paste this JavaScript snippet into the Console:
// pull down jquery into the JavaScript console var script = document.createElement('script'); script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"; document.getElementsByTagName('head')[0].appendChild(script);
The snippet above pulls down the jQuery JavaScript library, a common package used for nearly every JavaScript application.
Now that jQuery is pulled down we can use a CSS selector to grab a list of URLs:
// grab the URLs var urls = $('.rg_di .rg_meta').map(function() { return JSON.parse($(this).text()).ou; });
Note: Make sure you expand the code block above using the “<=>” button — this will ensure you copy and pate the entire JavaScript function call.
And then finally write the URLs to file (one per line):
// write the URls to file (one per line) var textToSave = urls.toArray().join('\n'); var hiddenElement = document.createElement('a'); hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave); hiddenElement.target = '_blank'; hiddenElement.download = 'urls.txt'; hiddenElement.click();
After executing the above snippet you’ll have a file named
urls.txt
in your default Downloads directory.
If you are having trouble following this guide, please see the video at the very top of this blog post where I provide step-by-step instructions.
Downloading Google Images using Python
Now that we have our
urls.txt
file, we need to download each of the individual images.
Using Python and the requests library, this is quite easy.
If you don’t already have requests installed on your machine you’ll want to install it now (taking care to use the
workon
command first if you are using Python virtual environments):
$ workon cv $ pip install requests
From there, open up a new file, name it
download_images.py
, and insert the following code:
# import the necessary packages from imutils import paths import argparse import requests import cv2 import os
Here we are just importing required packages. Notice
requests
on Line 4 — this will be the package we use for downloading the image content.
Next, we’ll parse command line arguments and load our
urls
from disk into memory:
# construct the argument parse and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-u", "--urls", required=True, help="path to file containing image URLs") ap.add_argument("-o", "--output", required=True, help="path to output directory of images") args = vars(ap.parse_args()) # grab the list of URLs from the input file, then initialize the # total number of images downloaded thus far rows = open(args["urls"]).read().strip().split("\n") total = 0
Command line argument parsing is handled on Lines 9-14 — we only require two:
--urls
: The path to the file containing image URLs generated by the Javascript trick above.
--output
: The path to the output directory where we’ll store our images downloaded from Google Images.
From there, we load each URL from the file into a list on Line 18. We also initialize a counter,
total
, to count the files we’ve downloaded.
Next we’ll loop over the URLs and attempt to download each image:
# loop the URLs for url in rows: try: # try to download the image r = requests.get(url, timeout=60) # save the image to disk p = os.path.sep.join([args["output"], "{}.jpg".format( str(total).zfill(8))]) f = open(p, "wb") f.write(r.content) f.close() # update the counter print("[INFO] downloaded: {}".format(p)) total += 1 # handle if any exceptions are thrown during the download process except: print("[INFO] error downloading {}...skipping".format(p))
Using
requests
, we just need to specify the
url
and a timeout for the download. We attempt to download the image file into a variable,
r
, which holds the binary file (along with HTTP headers, etc.) in memory temporarily (Line 25).
Let’s go ahead and save the image to disk.
The first thing we’ll need is a valid path and filename. Lines 28 and 29 generate a path + filename,
p
, which will count up incrementally from
00000000.jpg
.
We then create a file pointer,
f
, specifying our path,
p
, and indicating that we want write mode in binary format (
"wb"
) on Line 30.
Subsequently, we write our files contents (
r.content
) and then close the file (Lines 31 and 32).
And finally, we update our total count of downloaded images.
If any errors are encountered along the way (and there will be some errors — you should expect them whenever trying to automatically download unconstrained images/pages on the web), the exception is handled and a message is printed to the terminal (Lines 39 and 40).
Now we’ll do a step that shouldn’t be left out!
We’ll loop through all files we’ve just downloaded and try to open them with OpenCV. If the file can’t be opened with OpenCV, we delete it and move on. This is covered in our last code block:
# loop over the image paths we just downloaded for imagePath in paths.list_images(args["output"]): # initialize if the image should be deleted or not delete = False # try to load the image try: image = cv2.imread(imagePath) # if the image is `None` then we could not properly load it # from disk, so delete it if image is None: delete = True # if OpenCV cannot load the image then the image is likely # corrupt so we should delete it except: print("Except") delete = True # check to see if the image should be deleted if delete: print("[INFO] deleting {}".format(imagePath)) os.remove(imagePath)
As we loop over each file, we’ll initialize a
delete
flag to
False
(Line 45).
Then we’ll
try
to load the image file on Line 49.
If the
image
is loaded as
None
, or if there’s an exception, we’ll set
delete = True
(Lines 53 and 54 and Lines 58-60).
Common reasons for an image being unable to load include an error during the download (such as a file not downloading completely), a corrupt image, or an image file format that OpenCV cannot read.
Lastly if the
delete
flag was set, we call
os.remove
to delete the image on Lines 63-65.
That’s all there is to the Google Images downloader script — it’s pretty self-explanatory.
To download our example images, make sure you use the “Downloads” section of this blog post to download the script and example
urls.txt
file.
From there, open up a terminal and execute the following command:
$ python download_images.py --urls urls.txt --output images/santa [INFO] downloaded: images/santa/00000000.jpg [INFO] downloaded: images/santa/00000001.jpg [INFO] downloaded: images/santa/00000002.jpg [INFO] downloaded: images/santa/00000003.jpg ... [INFO] downloaded: images/santa/00000519.jpg [INFO] error downloading images/santa/00000519.jpg...skipping [INFO] downloaded: images/santa/00000520.jpg ... [INFO] deleting images/santa/00000211.jpg [INFO] deleting images/santa/00000199.jpg ...
As you can see, example images from Google Images are being downloaded to my machine as training data.
The error you see in the output is normal — you should expect these. You should also expect some images to be corrupt and unable to open — these images get deleted from our dataset.
Pruning irrelevant images from our dataset
Of course, not every image we downloaded is relevant.
To resolve this, we need to do a bit of manual inspection.
My favorite way to do this is to use the default tools on my macOS machine. I can open up Finder and browse the images in the “Cover Flow” view:
Figure 5: The macOS “Cover Flow” view allows us to quickly check each downloaded image to make sure it’s Santa. We’ll want to be sure we’re training our deep learning detector (which we’ll cover next week) with valid Santa pictures.
I can then easily scroll through my downloaded images.
Images that are not relevant can easily moved to the Trash using
<cmd> + <delete>
— similar shortcuts exist on other operating systems as well. After pruning my downloaded images I have a total of 461 images as training to our Not Santa app.
In next week’s blog post I’ll demonstrate how we can use Python and Keras to train a Convolutional Neural Network to detect if Santa Clause is in an input image.
The complete Google Images + deep learning pipeline
I have put together a step-by-step video that demonstrates me performing the above steps to gather deep learning training data using Google Images.
Be sure to take a look!
Summary
In today’s blog post you learned how to:
Use Google Images to search for example images.
Grab the image URLs via a small amount of JavaScript.
Download the images using Python and the requests library.
Using this method we downloaded ~550 images.
We then manually inspected the images and removed non-relevant ones, trimming the dataset down to ~460 images.
In next week’s blog post we’ll learn how to train a deep learning model that will be used in our Not Santa app.
To be notified when the next post in this series goes live, be sure to enter your email address in the form below!
Downloads:
If you would like to download the code and images used in this post, please enter your email address in the form below. Not only will you get a .zip of the code, I’ll also send you a FREE 11-page Resource Guide on Computer Vision and Image Search Engines, including exclusive techniques that I don’t post on this blog! Sound good? If so, enter your email address and I’ll send you the code immediately!
Email address:
The post How to create a deep learning dataset using Google Images appeared first on PyImageSearch.
0 notes