# I am the Watcher. I am your guide through this vast new twtiverse.
# 
# Usage:
#     https://watcher.sour.is/api/plain/users              View list of users and latest twt date.
#     https://watcher.sour.is/api/plain/twt                View all twts.
#     https://watcher.sour.is/api/plain/mentions?uri=:uri  View all mentions for uri.
#     https://watcher.sour.is/api/plain/conv/:hash         View all twts for a conversation subject.
# 
# Options:
#     uri     Filter to show a specific users twts.
#     offset  Start index for quey.
#     limit   Count of items to return (going back in time).
# 
# twt range = 1 6523
# self = https://watcher.sour.is?uri=https://lyse.isobeef.org/twtxt.txt&offset=2234
# next = https://watcher.sour.is?uri=https://lyse.isobeef.org/twtxt.txt&offset=2334
# prev = https://watcher.sour.is?uri=https://lyse.isobeef.org/twtxt.txt&offset=2134
@david Nice hedgehog indeed! It just seems to make a face. Maybe it doesn't like its new felt hat. It's stuck to its spines and cannot be shaken off.
@stigatle This is really beautiful, absolutely awesome! What a colorful play.
@carsten Oh man, this is brilliant! I've seen the previous ones but not this third version. Awesome!
@movq Nah, that's an anti-theft protection. The space bar thief would need a bolt cutter to cut through the steel cable in order to make a successful coup.

Crazy, never seen or heard that. Very interesting.
@david Hahahaha, very nice! I love it. :-D
@movq Yes, true. I wouldn't wanna sit several meters up there in a storm either. Completely understand that. And we only got wind gusts of like 70 km/h tops. Probably nothing compared to what you experienced.
@movq Alright. Crazy, we even could order this from home to get all our equipment delivered for free. Except for desks due to actuarial reasons (what happens if the trucking company knocks over expensive vases or throws pictures off the wall etc.), but chairs are possible (although still bulky they came to the conclusion it's worth the risk).
@movq Haha, that's also an option. :-) Just refuse to take it back. "Nah, that's not mine!" What kind of furniture was it btw.?
@movq Thanks, man! Now with your album covers you just need your band. ;-) I took some shots of damage, fallen trees and that, but the photos turned out to be rubbish. I have to try again next time (and hope, it's not already cleaned up by then). But yeah, the storm was cool yesterday. Because I was in my cozy and dry home. :-)
@carsten Go for it. Something always sticks.
@carsten Ah, never heard of that DynDNS service, but I assumed it must be a hoster then. Wrong again. ;-) Here I have to quote our customer again who always says "The assumption is the mother of all fuckups". So true.

Not bad, sounds like a cool setup.
@david Thank you, mate! Our taste is the absolute best, no doubt about that. <3 Your temperature rollercoaster is very delibitating, holy moly! Wednesday is supposed to reach very sunny 11°C, that's gonna be tough. And then by the weekend down to -4 to 4°C again. Sounds like fun. Well, let's see. Maybe I can call it a day early and use the nice weather for some more hiking, but I fear I will have some longer meetings. :-(
@carsten Well, at least one article a month is quite something in my books. ;-) And you even post multiple times a month. Anyways, all I read so far I have to say I like your style of writing, very good job! I'm pleased. Keep it coming. :-)
@off_grid_living Wow, I like it! The cupboard looks great. Did you also build that?
@carsten Well, judging by the matching domain name of your nametwin Mr. Schenk at http://serversknet.synology.me/ I came to the conclusion that's clearly you. :-) Whoops, I was wrong. Sorry, mate!
@carsten Very nice! Cool thanks, seems like you're very active in your blog.
@screem @prologic How about the other way around, working three days and four days weekend?
@prologic Oh yeah, very nice! It's such a nice combination of blue and darkness.
@carsten Vim only at day 6 sounds quite a bit late. But throwing money to cloud providers already at day zero is very fishy in my opinion. Anyways, have fun! And watch out to not getting fooled.
Yesterday's storm exacted its toll. Forest paths were blocked by fallen trees. Raising the shutters in the morning revealed white roofs. We got some snow over night that only partially melted at tops 4°C.

Sun is setting behind trees and partially lighting up snowy paddocks

With all the rain we had yesterday the forest paths were saturated with puddles. One big hell of a mess. I could also see plenty of new ponds everywhere next to the tracks in the undergrowth. But I assume in a few days it's all gone again. 15 more photos.
@movq Ah, okay. Well then, happy hacking in the next decades. ;-)
The cake is about to be massacred by the serrated knife murderer.
@movq Thank you, in fact it's an operating byre with a few cows in it. And it looks way worse in person than on the photos. It actually scares me a bit each time I walk past it.
@david @prologic Thank you, mates! I blame the sun for the nice scenery yesterday.
Went out a couple of hours enjoying the nice sunshine. The wind made the 6°C feel much colder, though. So cold, that it took me a minute to untie my boot laces at home. I'm a lousy gunman when you compare the overall 430 shots with my machine gun to just 26 hits in the end after taking another few hours gathering the bullets. Qualitywise I could have kept much more photos, but nobody has time to look at 50 or 80 similar subjects.

Lush grass getting hit by the cold sun

I actually wanted to hike much further, but my calf somehow hurt, so I slowed down and strolled around some other routes. Also didn't need my tucker. But carrying water was a good idea. The clouds made for some rather nice scenery but had disappeared by the evening, so the sunset wasn't too terrible nice today. But oh well. It still was a very nice trip into nature.
@thecanine Looks like a pink rose to me. ;-)
@thecanine Take a well-deserved rest first. Oh, and congrats on having survived the semester. :-)
@movq @david And it also depends on how much you use, what equipment you're wanting to operate. One day I will hike past that and then take a closer look, if possible. I imagine if they have some storage capacity, they can do whatever they want all year long without buying any power. But I have no idea. @carsten is our electrician here, he might have some better understanding.
After KDE 3.5 (best KDE in my opinion) and then 4 back in the days I switched to wmii and finally setteled on i3. Can't remember the reason to trade wmii for i3. But tiling window managers are the absolute holy grail. I can't work with the others anymore. They're just making for an awful experience. So what exactly do you have in mind for your new window manager, @movq?
@movq She has a cane in her hand.
@prologic Ohh, I remember that, it's a nice one. Have fun!
@carsten Damn, got it fixed? Where's your blog?
@david Or someone wanted to absort all the funds.
@david Any luck with your experiment? In my experience it works best if it's a little bit dark outside. Otherwise the color shift is not so pronounced.

I never put much thought into it, but I reckon that plenty of things can be tracked down to some pretty old roots. Perhaps especially if there is some kind of power and control involved. Also I think that most people nowadays (maybe also in the past?) – including me – don't get the connections. They just take it for granted, that's the way it is. No questions on the why asked. Because there no important reason to do so (other than curiosity and interest on the subject). Just my wild guess. :-)
Ever wanted to plant solar panels in your garden to operate the next generation off grid yarnd raspi farm?
@david The city isn't my place. It's too easy to see the animals. No challenge involved. :-P (If you don't count defending your meals.) @prologic Well, sorry. Oh, nightvision sounds fricking brilliant. I'd love to have a pair of those, too. :-)
Ta, @david! I just put my camera on dawn/dusk mode and that's how that blueish/violetish color shift happens. No further processing required. For my liking that's a bit extreme on those, though.

The three red tongued black lions are the lesser coat of arms of this federal state here and date back to the Duke of Swabia and the Staufer dynasty in particular. The Mt. Hohenstaufen was the Staufer's local home mountain, so that makes it really connected. That flag here is exactly on that mountain. Frederick I or just Barbarossa ("red beard") is the most famous Staufer who also became a Holy Roman Emperor. That's all I know about the lions, heraldry is not my specialty, but the article might get you going with your research. ;-)
@prologic Mjam!
We got completely snowed in today!

Giant mountain of snow in the parking lot. Completely impossible to park in that spot.

They replaced the flag, but the shredded scrap still hangs all over the trees. Nothing spectacular today, so it's not really worth heading over. In case you still do and wonder what the sign says: "End of sledge run". With like 6 or 7°C it was really warm today. Sweated like a pig. They cleared and pushed over plenty of trees on the hillside, looking really sad now. I spared you the look.
@ullarah Ohh! Hahahahaha, I tricked myself! Only now I see it's actually on the "ceiling". I thought that the roof is a window jamb and the leaves are parts of flowers on the window sill. So you photographed vertically out the window. To my defense I zoomed right in and cropped the bushes below the white "jamb" at the bottom, to make the illusion perfect. ;-)
@david I'm a wood gnome, I even smell like one, so the squirrels don't mind me. The one in April (this conversation) I encountered before even reaching the forest. At that particular spot the road is cut into the landscape, so the bank goes right up about one and a half meters. This way the squirrel was just perfect at eye height. I was like three or four meters away, so I quickly drew my camera and bam, got it. That was good luck. Usually they're quickly disappearing if one gets this close.

In July (conversation you just linked) I think I was coming down the narrow, beaten track from my mountain. These squirrels over there seem to be a bit more tame than the rest. At least I was able to capure them a few times already. Here it was maybe three meters away from me. But usually, they don't come *this* close. It was an exception. But like up to ten meters is realistic with them. Others probably at most 20 meters.

But I also stop and sneak in very slowly when I see one. It's not like they're coming directly towards me when I just walk by there. Sometimes it also takes some patient waiting to blend in with the surroundings or build trust and confidence that I'm not a predator of some sort.

By far the craziest squirrel I've ever met was this one. Probably a once in a lifetime experience.
I was able to witness a brown squirrel jumping up and down and over to the next tree and up and down and back over the other tree etc. for 20-30 minutes. That was extremely awesome. Unfortunately, I did not record anything of that. Therefore, I present to you this from my April archives last year as Chlorophilia #10 instead.

Squirrel eating
I was able to witness a brown squirrel jumping up and down and over to the next tree and up and down and back over the other tree etc. for 20-30 minutes. That was extremely awesome. Unfortunately, I did not record anything of that. Therefore, I present to you this from my April archives last year as Chlorophilia #10 instead.

Eating squirrel
@david Congratulations! March which year are you referring to?
@prologic That's also my take at the moment. Haven't seen any spam in my user agent logs. So I don't bother. That's the good part about niche things. Although, it is also really nice if stuff gets designed correctly right from the beginning.
@ullarah Cool. What kind is it? @prologic You should have, yes!
Thank you, @david, I'm about to blush. :-) Glad, they don't just grow mold on the server. Absolutely, please, go for 'em. Do whatever you wanna do. Collect them, show them, edit them, compose them, cut them, rearrange them, print them, hang them, delete them, burn them, … just whatever you feel like. ;-) I'm happy that they are of some use.
@david Thanks, theese boots make quick work as you can easily see. A whole stack of spruce! What? Without the boot you say? How about that?

Woooowooowoowww, this is number 13! Watch out, careful! Better close your eyes and also your browser window while you're at it. This is not safe. Like not at all. Quick! Hurry, it is cursed for sure. It must be. There's no other way. Run! You're still there? What's wrong with you?! Gooooo! … Well. Nothing happend yet. Then it's probably not as bad as we might have thought in the beginning. And now the alternative is starting to become a bit ridiculous. Yeah. You're still reading it. But wait! Does it mean, the number thirteen really is evil? I think, it does. Now look at you. It appears like you're truely hooked. You continue reading. You cannot stop. Oh my gosh! It's too late now. No, noo, nooooooooo! I told you right from the beginning that this is a very terrible idea. A really bad one. Like the worst you ever had. Man, this sucks! How can you escape that?! You must continue reading until you die. Or a miracle happens. … Luckily it's over now. The spell is broken. Without any warning the alternative text of this photo ends abru

My second best choice would have been the flying raven. Hahaha, yes, go for your new forest office! You'll love it. :-D
@david Thanks, theese boots make quick work as you can easily see. A whole stack of spruce! What? Without the boot you say? How about that?

Woooowooowoowww, this is number 13! Watch out, careful! Better close your eyes and also your browser window while you're at it. This is not safe. Like not at all. Quick! Hurry, it is cursed for sure. It must be. There's no other way. Run! You're still there? What's wrong with you?! Gooooo! … Well. Nothing happend yet. Then it's probably not as bad as we might have thought in the beginning. And now the alternative is starting to become a bit ridiculous. Yeah. You're still reading it. But wait! Does it mean, the number thirteen really is evil? I think, it does. Now look at you. It appears like you're truely hooked. You continue reading. You cannot stop. Oh my gosh! It's too late now. No, noo, nooooooooo! I told you right from the beginning that this is a very terrible idea. A really bad one. Like the worst you ever had. Man, this sucks! How can you escape that?! You must continue reading until you die. Or a miracle happens. … Luckily it's over now. The spell is broken. Without any warning the alternative text of this photo ends abru

My second best choice would have been the flying raven. Hahaha, yes, go for your new forest office! You'll love it. :-D
It was already a bit late when I headed for the forest this afternoon.

Puddle on the side of a forst road with the sun behind it

The 8°C were quite nice though. Only the colors suffer a bit. Sorry. Anyways. Even caught a raven in flight, which I'm a tiny bit proud of. Also explored a new path and found a top notch structure. You can move right in. Furniture included.
@david @prologic Admittedly, nothing super fancy. I just don't want random people know when *exactly* I'm active or how much time I spent on twtxt. It's public after all. Just think of increasing the noise. So analyses such as "how quickly is this guy responding" etc. result in a much more incorrect and thus hopefully less valuable data point. But yes, a trend is clearly visible, I'm aware of that.
@movq The verification boils down to check that you got mentioned or linked on the advertised page. So, yeah. Nothing hard to overcome for a spammer either.
@movq Absolutely, go for it. It's quite a brain-twist to some extent. Yesterday night I found some more code by searching GitHub for urwid and asyncio combinations and I might be able to draw some inspiration from the results. Perhaps I can simplify one or the other. Let's see. Haven't fully grasped it yet. But there's potentially something.

And yes, this is the first time I actually used GitHub as a code search engine to try figuring things out by looking at real code and attempting to map their course of action to my problems. Some code looks like complete garbage, however, other was definitely written by someone who is much more knowledgeable than I am. Another thing I didn't think of before is that I somehow need to find a way to ignore duplicates. A lot of search results just list the same code for all the fifty quadrillion forks or more. That's a bit annoying. Yeah, one piece of code showed up literally over 40 times already.

Oh nice, this reduction is quite an improvement I wouldn't have guessed. And yes, faster programs are always great. Fully agree here.
@david Currently, tt rounds to the next minute. But it shouldn't be very hard to go to the next five minutes, no. The only problem here is that I manually have to track that I don't create duplicates in the sense of timestamps. Already have an item on my todo list that tt will help with that by coloring the timestamp field if a duplicate is found. I'm always posting from the future. Or am I!?!? @movq Maybe because they look nice. :-P
@movq So you put your grandpa's keyboard in a display cabinet? I think I never touched a real one, but looking at the build quality it's probably impossible to ruin it with your drinks. ;-)
@prologic Yes, but @movq's point is, that the User-Agent header is not verified either. So you can advertise your shitty spam feed this way. If the attacked feeds happen to look at their log files.
@david Nice shell script! It's crazy that one needs quite a bit of code for such a trivial problem.
All I need is a repo browser. No fancy pages, wikis, bug reports, merge requests, CI/CD pipelines, etc. I had gitweb a few years back, that was exactly that if I recall correctly. I should try it again.
The saying goes that any chicken can install Debian. Just place the seeds on the Enter key.
I managed to reproduce this in the debugger (pudb FTW!) with dateutil.parser.parse("2022--31T23:59:00+01:00") where the day is missing. Turns out I'm running version 2.8.1 and somebody fixed this bug already half a year ago in version 2.8.2. In my virtual environment I setup on Friday I already had the fix, but not on my system level Python installation. The Debian package even for sid still ships the outdated version with the bug. Instead I had to use pip to upgrade. Sigh.
Whoops, this is long. Verrrrrrrrrrrrrrrrry long. It doesn't even fit on one page in tt. I will try to split this up next time.
Alright, I now made the interval at which composed twts are automatically backed up configurable in, well, the configuration file. This also brings me back to my original twt from yesterday night, that got destroyed when I wanted to publish it. But first, let's quickly talk about the crash. In tt the creation timestamp of a twt can be changed, in case one wants to. And I certainly do. Because of privacy reasons I *fancy*. My timestamps are all (with one single, but important exception) in five minutes granularity. Yup, since the very beginning. You probably haven't noticed, because you don't care too much about these timestamps anyway. So it's alright that I continue this fashion, you might consider silly. And now some of you got curious and checked my raw feed. Got you! ;-)

Last night I also wanted to fiddle with the creation timestamp and somehow something went wrong. At some place in the `dateutil` library, which I also mentioned in said blown up twt. No wonder it was cursed. The error didn't happen in my own code but rather occurred in the dateutil library when it tried to handle an error about an invalid timestamp. Very weird, I wasn't able to reproduce this ever since. No idea what went wrong here. The stripped and annotated stacktrace is as follows:


    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 655, in parse
        ret = self._build_naive(res, default)
      File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 1238, in _build_naive
        if cday > monthrange(cyear, cmonth)[1]:
      File "/usr/lib/python3.9/calendar.py", line 124, in monthrange
(3)     raise IllegalMonthError(month)
(4) calendar.IllegalMonthError: bad month number 0; must be 1-12

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      …cut off for brevity…
      File "/usr/lib/python3/dist-packages/urwid/widget.py", line 461, in _emit
        signals.emit_signal(self, name, self, *args)
      File "/usr/lib/python3/dist-packages/urwid/signals.py", line 265, in emit
        result |= self._call_callback(callback, user_arg, user_args, args)
      File "/usr/lib/python3/dist-packages/urwid/signals.py", line 295, in _call_callback
        return bool(callback(*args_to_pass))
      File "/usr/local/bin/tt", line 552, in update_preview
        preview_widgets, rows_calculating_delegate_widget = self._render_new_twt()
      File "/usr/local/bin/tt", line 565, in _render_new_twt
        created_at = self._created_at
      File "/usr/local/bin/tt", line 627, in _created_at
        created_at = dateutil.parser.parse(self._created_at_edit.edit_text)
      File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 1374, in parse
        return DEFAULTPARSER.parse(timestr, **kwargs)
      File "/usr/lib/python3/dist-packages/dateutil/parser/_parser.py", line 657, in parse
(1)     six.raise_from(ParserError(e.args[0] + ": %s", timestr), e)
(2) TypeError: unsupported operand type(s) for +: 'int' and 'str'


So as seen in (1) e.args[0] must have been an integer rather than a string (2) as it was expected by the dateutil programmer and so the TypeError was raised by the Python interpreter. To me it appears as if the calendar.IllegalMonthError from above in (3) was the culprit. Okay, it wasn't expected to be caught down there at around (1) and (2). Maybe. Judging by its message (4), the bad month number 0 is the first and only argument, as seen in the constructor call in (3).

If everything had gone to plan, the ParserError in (1) would have been caught in tt and everything would have been dandy. The field would have just appeared in red and the "Publish" command button deactivated. But I just caught the ParserError, not the TypeError. So it blew apart.

Now again, I wasn't able to reproduce this so far. No luck whatsoever. Writing this twt gave me an idea that I could now look into the code to see how the calendar.IllegalMonthError will be triggered in the first place. I have the slight feeling that this could be the ticket. So please excuse me now, I have to get my scuba gear, I'm about to dive deep. The original twt will be reconsidered another time.

On a closing note, since starting this post exactly 45 minutes have passed. I will hit the "Publish" button in a bit more than 20 seconds to avoid another lost twt.
Now that I lost my by far longest twt yesterday night just before publishing it, I implemented a crude automatic backup of composed twts. Every 20 seconds the text will be saved to disk if it changed from the previous snapshot. This way I'm able to recover manually from a crashed tt in the future. Let's see if I find some motivation today, to write it up all again what I lost last night. Wasted an exact hour to the minute.
@prologic Well, they do! Got NameError after NameError. :-D
@movq There are two reasons: First, I wanted to have a look at this async/await stuff for several years now. This is the first time I actually get after it. During this endeavor I came across this nice What color is your function article. Highly recommended. And so far I completely agree with the author, Go's model using goroutines is much nicer to work with compared to the explicit style declaring where the task can be switched. But I'm far from being used to async/await. So maybe once I wrap my head around it, it's getting comparably easy.

And lastly, it's supposed to integrate well with urwid's event/IO loop which I rely on in tt. I finally try to fetch the feeds on my own, so I can rip out the twtxt reference implementation. Still a very long way to go, but I have to start somewhere, and why not directly at the root. :-) So far I thought the interoperability between asyncio and urwid would be really elegant, but turns out it's a bit more complicated than I imagined (probably because of Python 2 and ancient Python 3 versions support). But maybe I just don't know the hidden tricks.

Anyways, to not block the user input, I believe I have to do it this way, there's not much choice. Threads in Python are a joke with the GIL, so I don't want to open that can of worms. If tt wasn't a user driven program, I'd just fetch the feeds synchronously. No need for this more involved stuff if it runs in a cronjob.

On a closing note, once I finally fetch and process the feeds myself, I can also support Gopher/Gemini feeds and implement parts of the metadata spec. Currently, there's absolutely nothing available in the cache, that is written by the reference implementation and read by tt. Looking forward to that.
@movq Must be an awesome work mate. Now you have two Model Ms!? One for the hands one for the feet. That's how you easily double efficiency! Sadly, this long lasting life won't happen to any of the modern keyboards.
Python's aiohttp.web.Response has absolutely no way to exclude the Content-Type header in responses, it will always send one by falling back to application/octet-stream, regardless of what you do. For testing purposes I'd like to omit this response header, though. So now I monkey-patched my test server handler in the unit tests like this. Let's see when this falls apart with a future aiohttp version:

async def http200_no_content_type(request):
original_write_headers = request._payload_writer.write_headers
async def write_headers(status_line, headers):
del headers["Content-Type"]
await original_write_headers(status_line, headers)
request._payload_writer.write_headers = write_headers
return aiohttp.web.Response(body="abcäöüß".encode("utf-8"))=
@movq Oh cool, who did you steal her from? :-)
@screem Very nice! Much cooler this way. I even found three more reasons: It can be versioned much easier than another remote file, you also save on additional HTTP requests in that particular case and editing works with every editor. The last and fourth one I sadly forgot in the meantime.
I'm glad I don't have to hand over punchcards to the operator and wait one day for the results to come back. Just had to fix like seven typos in identifiers. My goodness!
@screem I'd add all these in text form rather than images. This has three advantages: It's less bytes, searchable and can be copied.
@lyxal Haha, yes, you're right. It's some kind of monster with a hunch and an antagonistic stare..
@lyxal Haha, yes, you're right. It's some kind of monster with a hunch and an antagonistic stare.
@movq Yeeha, what a wonderful scenery! The birds are spreading the word of the new blessing. How cool is that?!
@david Hui, I certainly couldn't do short sleeves in this weather. Not unless I ran up the mountain like there is no tomorrow..
I visited my sister in prison today. Barbed wire on a concrete post

Naah, just kidding. Went on a five hours hike to flee the chainsaw noise from the neighbor's roof. They get rafters and roofing tiles replaced. Weather could have been worse, sight was poor in the beginning, but got better later on. Explored some new paths I've never been to, mostly dead ends as it turned out. Was good fun, though. When I unsuspectingly took off my socks I discovered two huuuge blisters on my heals at home.

For your viewing pleasure I stripped the 437 shots to just 44. Head over if you didn't/don't plan to get off the coach today and want to waste even more time.
@david Finally, winter in Florida. We had 5°C today. It was very windy, making it feel like negative figures. On Thursday it's supposed to even climb through the roof to 8°C. Let's see. Actually, I don't mind the low temperatures. Just a dressing thing.
@prologic @david Previously, people were free to enter an e-mail address or not. Now everybody is forced to enter an e-mail address. Just want to point that out.
@movq Wouldn't be anything for me either. He has put the cursors and the number block on the home row and swears by the neo layout.
@movq A friend uses Ergodox EZ, not sure whether that's something for you.
@movq Wow, that's a very cool tent. I'm pretty certain, I couldn't type a single word on that thing, though. ;-) I'm using standard keybaords, nothing fancy whatsoever. So what exactly is the issue with the rubber keys? Keys are not returning to their home positions? The keys are sticky?
@david Picking the sheep would have spoiled the nice guessing game for sure. :-) Never heard of that directional mowing before. 01 shows different ones, but there are indeed two main orientations. I will try to keep an eye on that in the future to search for (counter) evidence. @movq Yeah, sheep are nice, it also smelled a lot of them. Not so super nice. But it's a tradeoff. Worthwhile in my opinion. The shepherd and her dog were peacefully watching them. You could have just approached and petted them, there was no fence. Snow is left only at the mountain starting around 640 NHN I'm guessing. Down here everything is long gone.
@david Didn't look at the article but to my "knowledge" the current belief is that there is frozen water at both poles. You you'd better bring a torch when you plan to go missing on Mars. And maybe some kind of juice, you most likely will not find that there naturally. Cheers!
In today's episode of enjoying 5°C sunshine in nature we dive into two creatures, both white. What could they be? You will also have a look at the previously closed trail because of tree removal. It was passable again and the Grim Reaper took that opportunity to get up there and look after the flag. Fastidious, Quark, Homer and David will all disagree with this selected image of the ragged flag to show off that gallery To close with a nice sunset, you have to get over there to see nine more photos.
@ullarah Hahaha, this is lovely. :-) Thanks for taking the hard efforts of sharing this, even though this site is for some inexplicable reason completely missing a Twtxt share button. How dare they!
D'accord, mon français est trés, trés mouvais. J'ai immédiatement reconnu la phrase de @movq comme finnoise, mais je ne peux pas. Comment as-tu commencé avec ça ? Et la conversation est fou, oui, oui. Très amusant. ¡@https://netbros.com/user/david/twtxt.txt>, eso suena maravilloso! Jeg krydser begge fingre, @darch.
@movq This is cool!
@darch Hvad laver din københavnske bande? Er hun kun interesseret i pixelbilleder via pixelblog?
@darch So it depends a little bit on your requirement whether you want to *somehow* preserve the original filename or if it is okay to just come up with a "random" one, that has nothing to do with the user-supplied one. For the latter you could just use UUIDs, they're unique and you're done. Collissions are super unlikely.

Maybe even just use the current Unix timestamp in milli-, micro- or nanoseconds. Seconds-only precision increases the danger of collission at parallel uploads. In any case you should check for duplicate filenames in case of clock adjustments. It's super simple and fast, though.

Or you could hash the data and use that as the filename, again checking for duplicates. That has the advantage that you can detect identical file uploads. Not entirely sure if that property is something you really want, but might work out in your favor. Uploading the exact same image is probably not of much use. Any hashing algorithm will do, cryptographic ones should be favored. Hashing does not come for free, some computational effort is required which heavily varies with the selected algorithm.

Now, if you want to keep as much from the original filename as possible for whatever reason then basename($filename) is a very good start. Limiting even further to only alphanumeric characters including dot (.), underscore (_) and dash (-) makes the result a tad better. (Make sure to put the dash as the last character in the choice of the regular expression.) But then you also need to check for duplicates and handle them somehow, since höllo.jpg and høllo.jpg would both be truncated to the same (hllo.jpg). Might be completely different images, though. Your filename might also end up (quite) empty or just consists of your extension (depending on order of checks). You easily can see there are quite some things to be aware of with that whitelist approach.

So unless you really have to, I'd strongly recommend to go the generated filename route. It'll make your life easier. Pick one approach whose properties suit your use case. Personally, I'd select UUIDs or hashing (probably SHA-1 or even successors).
Hihi, stimmt gar nicht. Der gute David hält uns für viel wohlerzogener. Oder verdrängt schnell. Ich hab nun eben mal nachgezählt und bin auf siebzehn gekommen. Vielleicht hab ich auch was übersehen, gut möglich. Das ist also die achtzehnte deutsche Nachricht, die ich dem lieben @movq schreibe. Und nun grüße ich auch alle – allen voran unseren ausgewanderten Spanier – die sich die Mühe gemacht haben, meine sinnlose Trollmeldung zu übersetzen. :-)
@prologic Just add service network stop in the start script.
@lyxal @david Nah, give her a pile of rocks instead! On a serious note, when I was a kid my parents had an old TV that one day started to slowly fade out the image. So tapping it just brought back the image as though nothing had happened. After a long time without any issues, the fade out was back. So they tapped it again and everything was fine. But it reoccurred over and over in shorter and shorter intervals. Finally, one had to stand right next to it and keep hammering the old thing to get a halfway clear image. Shortly after they got rid of it, before it had a chance to implode on us.
On the web I always use trailing slashes (unless I messed up) just as explained in the article. On the file system on the other hand I usually omit them, because my shell does, too.
@adi I wouldn't want to have my home directory cluttered with Go stuff, namely _pkg_ and _bin_ directories, so GOPATH=$HOME wouldn't suit me. On the other hand, _src_ in _~_ is what I do, too. Except Go sources, which in fact bothers me a bit. So actually, while writing this, I think I could change my mind and might give this a try. For the rm='rm -i ' alias the space at the end is superfluous. :-) Other than that, very tidy. I should clean up my stuff, too.~
@eaplmx This means you made progress on your COBOL time machine, cool!
@david Hahaha, don't eat and read, it's a dangerous territory out here! :-D
@david These are very lovely indeed. Reminds me of biology class in fifth grade or something around that era. We looked at all kind of different things with microscopes. Pretty nice.
@movq That's some pretty cool idea, but I will immediately get eye cancer if I tried to use this for real.
@david WTF, just WTF. I don't know what else to say about it.
@david Hahahaha, this is brilliant! "Oh the bright side, you're the first successful multiple suicide." Laughing my ass off! :'-D