It is 2018 and this error message is a mistake from 1974
twitter.com
twitter.com
The problem was introduced, IIRC, in MS-DOS.
The basename (without the extension) had certain reserved names such as CON, PRN, AUX, PTR, PUN, etc. Originally these names always had a trailing colon to identify them as devices, but MS/DOS dropped that. MS/DOS kept the trailing colons for disk drive identification, but not much else.
This capability could be used to make a batch files (.BAT) without any editor on the system. One could type: COPY CON RUNME.BAT, and then type in the wanted lines of the batch file. The end-of-file character (^Z 0x1A) was the same on CP/M and DOS, unlike (^D 0x04) on Unix.
https://gordonbell.azurewebsites.net/Digital/RT-11%20System%...
coughs in Unix
(udev assumes they live under /dev. I'm not sure if /dev is hardcoded in udev or configurable. But you don't have to use udev anyway, you can create device nodes manually.)
So there's actually a good reason for being able to create device nodes outside /dev.
You either have persistent files with special attributes that identify it as a device, or you namespace your devices with characters that cannot be used in a file name. But you don't allow your devices to be valid file names and have them invisible on the file system.
I never thought about it, but when you consider ‘:’ as the device suffix, this makes directory structures make more sense to me on Windows.
C:\foo\bar makes more sense to me if it is the ‘C:’ device. Calling it a ‘C drive’ with a separate namespace never made sense to me. Somehow thinking of it the ‘C:’ device in an anonymous global hierarchy makes more sense to me.
You'll still be able to create named pipes (mkfifo), but mknod will fail.
This is handy for filesystems with a poorly developed sense of user ownership and permissions, say, msdos or vfat.
I tend to mount my /tmp space nodev and nosuid, as occasionally you'll find poorly-written, or nefariously-intended programs attempting to do such things there.
You can even get it using the Unix path slashes in the 2.11 source code.
This does bring back fond memories. In the early days of Windows 1.x, the way to get debug/log output was with the OutputDebugString() function. This wrote the output to the AUX device, which would be a serial terminal or printer. I didn't have one of those, but did have the IBM Monochrome display sitting idle while Windows ran on the CGA or EGA display.
So I wrote a little DOS driver called AUX.SYS (with source code in AUX.ASM) to redirect AUX output to the Monochrome display.
That did not work very well! I couldn't even edit my source file.
After a while I figured out the problem and renamed the driver to OX.SYS and OX.ASM for the source. Homophones to the rescue!
only after the last 32-bit version of Windows 10 goes out of support will some of these things begin to get fixed. and even then it will not be a priority.
With no logging... But invariably, they would not want log files created in their production environment...
So, we would add at least an OutputDebugString() to the catch... prepare a build - then in the production environment we would use the Sysinternals "DebugView" to find out why things were breaking... (And typically - it was a missing dependency or DLL version miss-match from dev to production)
Fun times.
https://github.com/geary/OX.SYS
And as usual, Raymond Chen has some insights on why these special filenames "worked" regardless of file extension or directory location:
https://devblogs.microsoft.com/oldnewthing/20031022-00/?p=42...
I have no idea whether it works in FreeDOS, and I don't have a monochrome display to test it on. But if you try it, I would be very curious to know if it works! (You can reply to this message and I will get notified.)
As for why default to uppercase instead of lower case, I think just a matter of style. Unix and C favour lower case, FORTRAN and COBOL and your keyboard keycaps favour upper case.
probably to make sensible use of limited display abilities of early hardware, fitting characters in 8x8 boxes and making it readable on blurry fat beam glowing green screens quickly becomes a problem with lowercase (size, readability, ascenders, descenders, baseline), whereas uppercase is comparatively easy.
but why uppercase rather than lowercase, you might ask? well, http://wiki.c2.com/?CapitalizingGod has the following story, but i don't know if it is correct.
We may remember that ancient teletypes, printers, and terminals would bang out their output in all upper case. When this technology was first being standardized, the researchers did usability studies and found that people read lowercase text more easily than uppercase. But management decided to use uppercase instead. The reason? If only lowercase was shown, then there would be no means for CapitalizingGod.
anyway, by the time people started putting screens and pixels on computers in the 01960s to 01980s, the uppercase-only tradition was very well established.
Some years ago I was working on an embedded system that involved DisplayPort. For those unaware, DP's control channel is called AUX. One day, my new co-worker who used Windows asked me, who used Linux, why my AUX-related code wasn't checked in - which it most certainly was.
And that, folks, is how I learned about this absurd property of Windows that exists to this day.
C:\>echo foo > con
foo
I can only assume IBM pitched a fit and made MS remove it like they did with SWITCHAR.
If you didn't know about SWITCHAR it allowed you to change DOS to use Unix's "-" switch delimiter instead of "/". This is why DOS/Windows also accepted either "/" or "\" as path separators (and still do).
I wonder why the blame is put on IBM; what problem did they have with this?
I wonder why didn’t they instead add a switch to bring back the requirement of a colon after the device name.
I'll guess that you didn't knew that DOS 1.x don't have any concept of directories. It's essentially a novo terra for DOS applications, and makes sense considering that Unix also standardised at /dev.
DJGPP even has a FAQ item about a similar issue: <http://www.delorie.com/djgpp/v2faq/faq22_21.html> (though that one is caused by DJGPP’s own Unix emulation layer)
For system apps like cmd.exe or explorer.exe, a registry key would be a better solution. That way the end user or sys admin can turn it on or off, whereas the exe manifest is fixed at build time.
That said, it should be theoretically possible, but I believe any approach other than hooking into high level IO call will be problematic, and you'd probably lose access to many things like serial/parallel ports etc. (as applications wouldn't know the names you renamed them under).
The big problem here is bare device names, and device names with an extension – e.g. "COM1", "COM1.TXT". Device names with a colon, e.g. "COM1:", are not such a big problem, because colon is not an allowed character in file names on Windows (it is reserved as syntax to specify a drive or stream.) And while colon is a valid character in Unix file names, it is rarely used in practice, so Windows not supporting it is less of a problem than Windows not supporting files named "aux" or "con" is. So if they still recognised the device names with a colon, that would work fine for some programs that already use the colon, and for those that don't it should be an easy fix to just add it before updating the EXE manifest to opt-in to this feature.
Actually there is another fix – in Win32 programming you are recommended to prefix device names with "\\.\" anyway. That is actually mandatory when dealing with more than 9 serial ports (e.g there are multiport serial cards with more than 10 ports, or you might have two 8-port serial cards in your system). If you want to access COM10, you have to prefix it with "\\.\". And it is best practice to use those prefixes even with COM1-9. So programs already following that best practice would need no change. (And few programs directly use serial or parallel ports nowadays anyway.)
We ran into this recently when a bug in Ardour ended up creating files on disk named like "recorder:N". They were created correctly on the disk, and in the Ardour instance that had created them and thus had file handles for them, they could be read without issues. But ... close the program and restart it ... errors about not being able to find the files.
Fortunately, Notepad (I think) is one of the few applications that can handle these names (I have no idea why), and so it could be used to open and save the files under a "better" name.
ps. after 35 years in computing, I have not used Windows for more than 30 minutes in total. This account is based on being a developer of a cross-platform application who reads bug reports and interacts with users.
I think you are getting confused by stream names. If you try to create a file called "foo1.txt:bar", some Windows tools let you. But that is not an example of a file name containing a colon. The filename is "foo1.txt". In Windows NT (and its successors), a file can be composed of multiple named streams, and ":" separates the file name from the stream name. So "foo1.txt:bar" is actually the the stream named "bar" of the file named "foo1.txt", not a file named "foo1.txt:bar"
So let me rephrase. An application can attempt to create a file using the name "foo:bar" and this will result in a new entity in the filesystem that can sometimes be successfully accessed using the name "foo:bar", but generally not.
That is seen even in some programs shipped with Windows. For example, cmd.exe. Some of the built-in commands in cmd.exe, for example "del", "type" and "copy", refuse to work with file streams. But that's because cmd.exe's code is detecting the colon and rejecting it as bad filename syntax. If Microsoft would just comment that validation code out, and pass the name including the colon down to the core Windows APIs, those commands would work. But that said, other parts of the cmd.exe code can handle them. The "dir" built-in command even has an option to display file streams, "dir /r". You can also read/write streams using redirection in cmd.exe, e.g. "echo foo > bar:baz" will write the string "foo" to the file stream "bar:baz". And "more < bar:baz" can be used as a workaround for the fact that "type bar:baz" doesn't work. Even though "copy" doesn't understand streams, "copy foo bar" will copy "foo" with its streams intact (assuming both target and destination are on filesystems that support streams), since even though "copy" doesn't understand streams the underlying Windows file copy API it calls does.
Microsoft is unlikely to fix the limitations in cmd.exe since cmd.exe is now considered a legacy component. New features all go in PowerShell. And PowerShell has much better support for streams, it can do everything with them.
So the "generally not" really depends on which applications you are using.
(Well, strictly speaking you might argue it could be the default unnamed data stream of a file called "COM1". But almost nobody ever refers to the unnamed data stream explicitly like that, just using the bare file name to do so; and if one must, the canonical name for it is to include the stream type, giving the default unnamed stream of the file "COM1" a name of "COM1::$DATA". That's obviously not a reference to the "COM1" device, since it violates the "path name must be blank" rule)
I'd be more interesting on how the "ignore extension" part happened. Wouldn't be surprised to find some ancient option support there...
DOS required extensions and most early DOS apps just always appended their own extensions automatically and only took in the base name. The system ignoring the file extension made it easier to use the devices in every DOS app, not just ones aware of the devices.
I don't have time to do any detailed testing of this right now, but I believe that `CreateFileA("COM1",...)` and `CreateFileA("COM1:",...)` are equivalent, and both work identically. Am I wrong about that?
I wonder if they should only exist for command line apps although I wonder if there aren't still GUI apps that control industrial machinery by opening "COM1" as a file.
You can even demonstrate this with cmd.exe (which uses the Win32 API, it doesn't directly access the NT API)
`mkdir c:\con` will not work, says `The directory name is invalid.`
`mkdir \\?\c:\con` does work. But then to delete you have to use the \\?\ prefix again. And `cd \\?\c:\con\` doesn't work, you get the `CMD does not support UNC paths as current directories` error. (Win32 does, this is a cmd.exe limitation only)
My proposal was to have a way of getting the `\\?\` behaviour without having to explicitly provide that prefix.
Actually, not quite. There is one aspect of `\\?\` which is undesirable. The NT API only supports backslash as a directory separator. The Win32 API supports forward slash as well, it automatically converts forward slash to backslash. But `\\?\` turns that conversion off. I think you'd still want the forward to backslash conversion on, to maximise compatibility with Unix.
The less obvious part is that for a very long time, it has been a contract for all Win32 functions that return PATHs, that the maximum size of the returned path is MAX_PATH. So there are a lot of apps that basically allocate a buffer of that size and assume that it'll always be enough. So functions like GetFullPathName can't just start returning longer names, because it would break those apps. Instead, they rely on the presence of "\\?\" prefix in the input path as an indicator that the calling app understands those longer paths, and is ready to accept them as outputs as well.
You are talking about (1), and I agree it has some problems, yet Microsoft already has an EXE manifest option to bypass maximum path length without \\?\.
Whereas, I am proposing (2), which could exist without (1). They could add an EXE manifest option and/or registry key to tell the Win32 API to ignore bare device names, or device names with extensions, when converting Win32-to-NT paths, even while keeping the MAX_PATH limitation. So you wouldn't need \\?\ to access a file/directory with a reserved device name. But you might still need it to access a long path. The two issues are orthogonal and could be controlled by different settings.
WIN32_FIND_DATA only returns a file name, not a full path, and the "\\?\" prefix does not remove any limits for individual path components.
If anybody knows of anyone using those special files in programs running on modern Windows, I'd love to hear about it.
"2011-10-05T14:48:00.000Z" - Excel: I have no idea what this is.
Excel: when's that?
Ctrl+A then Alt H N T E enter to make the whole spreadsheet "Text" by default instead of "General". (Or Ctrl+A Alt H N A enter to default everything to "Accounting" if you are just going to be typing in a bunch of dollar amounts, etc.)
The tools are there to "opt out" of "I'm too lazy to set a data type so guess for me" mode and always have been.
I never, EVER, want to see another number in scientific notation unless I tell it too.
We don't get data _that_ often. But when we do, there's 75% chance it's got this problem somewhere. So much so we've created stock template guides.
I'm sick of it. So sick of it.
Sure. I can go through the document one cell at a time and fix the issues. But I don't want to. It's a waste of my week.
If I could count the man hours I've wasted on this over my 10 years at this company....
I definitely appreciate both sides of the frustration: "General" exists for a lot of good reasons that people are lazy and don't want to learn how to operate the software they use every day correctly, they just want it to read their minds.
For similar, but different reasons, because it is hard to train people everyone else builds elaborate work arounds (renaming genes, coming up with silly naming conventions and separators that won't be confused with dates or numbers, always passing spreadsheets over to "that IT guy who knows how to fix it/clean it up" before doing anything critical with them, etc). It's funny how many of those workarounds become so much more work (as they get concretized into bureaucratic processes) overall than learning to hit the one big Number Format dropdown at the top of the screen sometimes.
Both problems exist because people are inherently lazy and don't want to learn how to use their tools properly, and no one is really at fault on either side ("General" has a right to exist and has existed since Visicalc; People are free to live/die by the illusion that processes are cheaper than education), but a lot of us get stuck uncomfortably in the middle both knowing the tools and being unable to get people to use them right.
No. That's definitely not it. We deal with people who know excel inside and out. They are human. They might not notice a cell on row 11593 has an issue. They might forget. It's Excel's fault for not understanding that it is software for humans.
That's why they still work. For the same reason as other DOS Aliases, like C:
If you use UNC paths, you can bypass alias names, because your path will be unambiguous - however if you write such name into one of the "classic" visible name spaces, software that uses classic paths (for example because people are familiar with them, and because rewriting all strings to ensure you use UNC is annoying) might... Find issues ;-)
I was just pointing out that COPY was not the only use :)
But it wasn't insane to begin with. The insane part is never changing it.
cat /dev/urandom | aplay
Still works well on my machine, and I use it all the time to test :)Also, why 260?
You can have paths exceeding 260 chars for a long time now. The problem is that the older Win32 APIs that deal with files have structs with TCHAR[MAX_PATH] field in them, so changing that length would be a binary breaking change for apps.
So the new APIs allow for longer paths, but code has to be specifically written to take advantage of them. Some languages and frameworks - e.g. Node.js and Python - had that support for a while; others are still catching up.
But yeah, WSL may be the driving force.
Or for older Windows versions you can use UNC paths and skip the fixed-size Unicode normalization buffer than introduces the `MAX_PATH` limitation: https://docs.microsoft.com/en-us/dotnet/standard/io/file-pat...
Even remotely, <img src="file://c:/con/con"> on a website
Those were fun times
There are a bunch of these special files. [0]
[0] A list is deep on this page: https://docs.microsoft.com/en-us/windows/win32/fileio/naming...
So, for example, `C:\Users\ChrisSD\AUX` will be resolved to `\??\AUX`.
Even more surprisingly, any filename that starts with `aux.` will also be affected by this. E.g. `C:\Users\ChrisSD\aux.txt`.
azure-pipelines.yml
This is the 1980s holdout that bothers me much more. It's 2021 and Microsoft still clings to three-letter filename extensions? Curiously, they did abandon the 8 in 8.3, but not the 3.Yup, that's a timeless message :-)
A fun dive into windows history and backwards compatibility.
I thought they found a bug in ALGOL60 code or something, which would have been funny as last week's pentest was written in an arcane language like that and likely last updated around the same time (not something we see every day; quite the opposite in terms of reinventing the wheel actually).
It might not be a great feature anymore, but it's not a bug. A 40 year old bug is things like TCP didn't have timeouts in all states, so LAST_ACK sockets should stay around forever if you follow the spec, or that if the two peers get mixed up about where the seq and ack are, each ack will elicit an ack from the other side, and if the peers are near enough to each other, that can result in gigabits of useless ack traffic that never results in data exchange (thankfully this isn't a common state; I've only seen it as a result of a bug in one OSes syncookies that was fixed, and it is likely to end with a timeout)
The error message says that the file is too large for the destination file system (despite being under 10KB). It's unambiguously a bug.
https://news.ycombinator.com/item?id=20081056
> so given this is a choice between two options, I can either: 1. make rambly tweet-threads that some people hate and wish were blogs 2. make no blog posts
> I am sorry that I am picking #1, but it's really best for everyone.
But what if he was a "bad" (in quotes) guy? Like the CEO from the recent repl.it debacle. What if he asks to stop linking to his bullying tweets? Nobody would side with him.
So.. where's the line? Is anything public fair play? Who decides if someone is bad or good? The collective internet mob? Surely nothing can go wrong with that.
JWZ's site sends you to a hairy testicle if an article on his website is linked from this site.
They aren't manipulating anyone... they're just making it known they'd prefer not to be linked to from another platform.
Is this a reasonable expectation? I'm not sure -- my gut says probably not. Is it a reasonable request? IMO yes.
Contrived scenario for expository purposes: lets say I'm an expert in pre-civil war era southern cuisine. If I find out that people on stormfront are linking to and discussing my posts for their own agenda, do I have a right to make them stop? Of course not. Is it reasonable for me to say "I'd prefer if your platform didn't link to my blog"? Of course it is.
It is a reasonable request to ask your neighbor to take down their billboard that says "THE GUY NEXT DOOR WROTE ${THIS} BLOG POST AND IS A REAL PIECE OF SHIT", even though they aren't obligated to do so. It becomes unreasonable when you expect that they take it down.
Obviously depends on the jurisdiction.
Everything depends on jurisdiction, that's the very nature of law in and of itself.
Personally I just follow foone on twitter, since their an interesting person.
Foone is more than competent enough to publish to the web with whatever access control they find agreeable. jwz is, as well, and doesn't like being linked from HN either, for example.
Posting on Twitter publicly is consent to be linked to, regardless of what other words are said.
If you invite people to a party, are you the jerk for telling the person you know to be vegan that by going to the party they consent to having to eat meat? Clearly, the vegan person could simply not go to the party and not consent to it, but it still kinda makes you a jerk for even making this a problem, you could have either made a vegan meal or not invite them (and inform them why if they're a close friend maybe).
I think not inviting someone to a meat party because they're vegan is way more of a jerk move than saying "hey, I'm having a meat party, I know you're vegan but you can still come if you want" and them not coming. Give people the option to make their own choices.
Foone chose to publish things unauthenticated to the web on Twitter. That's affirmative consent to anyone on the web reading the URL by visiting it.
No it's not. It means it's out there but the wishes of a person may still go contrary. That is perfectly fine and like in the above example, maybe you should give people options instead of taking them away.
If everyone took everything I ever said I "kinda wish" as a solid preference, I wouldn't be at all happy.
Here is a temporary solution to I am using to fetch the JSON from the command line and make simple HTML. I did try Nitter but found that sometimes instances were exceeding rate limits.
json_reformat is from https://github.com/lloyd/yajl
this uses stunnel and nc but can easily be adapted to use openssl, bssl, haproxy, or whatever other ssl solution you prefer
example usage - read twitter.com/foone
1.sh foone > 1.json
1.sh < 1.json > 1.htm
firefox ./1.htm
#!/bin/sh
case $# in :)
;;0) # make simple html;
sed -n /{\"data\"/p|json_reformat|tr -cd '\12\40-\176'|sed -n -e 's/ *//' -e 's/\\n/ /g' \
-e '/created_at/p;/sation_id_str/p;/full_text/p'|grep -B2 full_text \
|sed 's,https://[^ \"]*,<a href=&>&</a>,g;s/\",$/&<br>/g;s/^--/&<br>/'
;;1) # fetch json;
M="GET"; V="HTTP/1.1";H="host: twitter.com";I="104.244.42.129:443";C="connection: close";
A="authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA";
P1="/i/api/graphql/Vf8si2dfZ1zmah8ePYPjDQ/UserByScreenNameWithoutResults?variables=%7B%22screen_name%22%3A%22$1%22%2C%22withHighlightedLabel%22%3Atrue%7D";
S1(){ printf "%s\n%s\n%s\n%s\n%s\n" "pid=$HOME/1.pid" "[ $$ ]" "accept=127.0.0.7:80" "client=yes" "connect=$I"|stunnel -fd 0;};
S2(){ kill -9 $(cat $HOME/1.pid);};
N(){ nc -n 127.7 80;};
S1;x=$(printf "%s %s %s\r\n%s\r\n%s\r\n\r\n" "$M" "/" "$V" "$H" "$C"|N|grep -o "gt=[^;]*"|sed 's/gt=//');t="x-guest-token: $x";
y=$(printf "%s %s %s\r\n%s\r\n%s\r\n%s\r\n%s\r\n\r\n" "$M" "$P1" "$V" "$H" "$A" "$t" "$C"|N|grep -o "rest_id\":\"[^\"]*"|sed 's/.*\"//');
p2="/i/api/graphql/Bn2jPG0Cy8VAOakAoyV_kA/UserTweets?variables=%7B%22userId%22%3A%22$y%22%2C%22count%22%3A500%2C%22withHighlightedLabel%22%3Atrue%2C%22withTweetQuoteCount%22%3Atrue%2C%22includePromotedContent%22%3Atrue%2C%22withTweetResult%22%3Afalse%2C%22withUserResults%22%3Afalse%2C%22withVoice%22%3Afalse%2C%22withNonLegacyCard%22%3Atrue%2C%22withBirdwatchPivots%22%3Afalse%7D";
printf "%s %s %s\r\n%s\r\n%s\r\n%s\r\n%s\r\n\r\n" "$M" "$p2" "$V" "$H" "$t" "$A" "$C"|N;S2;
esac # 1.sh username > 1.json
# 1.sh < 1.json > 1.htm
# or
# 1.sh username|1.sh > 1.htm
# firefox ./1.htm (zoom in)
case $# in :)
;;1)
public_ip=104.244.42.129:443;
public_host="Host: twitter.com";
public_token="Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA";
printf "%s\n%s\n%s\n%s\n%s\n" "pid=$HOME/1.pid" "[ $$ ]" "client=yes" "accept=127.0.0.7:80" "connect=$public_ip"|stunnel -fd 0;
x=$(printf "GET / HTTP/1.1\r\n%s\r\nConnection: close\r\n\r\n" "$public_host"|nc -vvn 127.7 80|grep -o "gt=[^;]*"|sed 's/gt=//');
echo gt $x >/dev/stderr;y=$(printf "GET %s HTTP/1.1\r\n%s\r\n%s\r\n%s\r\nConnection: close\r\n\r\n" \
"/i/api/graphql/Vf8si2dfZ1zmah8ePYPjDQ/UserByScreenNameWithoutResults?variables=%7B%22screen_name%22%3A%22$1%22%2C%22withHighlightedLabel%22%3Atrue%7D" \
"$public_host" "$public_token" "X-Guest-Token: $x"|nc -vvn 127.7 80|grep -o "rest_id\":\"[^\"]*"|sed 's/.*\"//');
echo rest_id $y >/dev/stderr;printf "GET %s HTTP/1.1\r\n%s\r\n%s\r\n%s\r\nConnection: close\r\n\r\n" \
"/i/api/graphql/Bn2jPG0Cy8VAOakAoyV_kA/UserTweets?variables=%7B%22userId%22%3A%22$y%22%2C%22count%22%3A500%2C%22withHighlightedLabel%22%3Atrue%2C%22withTweetQuoteCount%22%3Atrue%2C%22includePromotedContent%22%3Afalse%2C%22withTweetResult%22%3Afalse%2C%22withUserResults%22%3Afalse%2C%22withVoice%22%3Afalse%2C%22withNonLegacyCard%22%3Atrue%2C%22withBirdwatchPivots%22%3Afalse%7D" "$public_host" "$public_token" "X-Guest-Token: $x"|nc -vvn 127.7 80
kill -9 $(cat "$HOME"/1.pid)
;;0)
x=$(echo x|exec tr x '\34');
sed -e 's/\\"/\"/g;s/\\n/ /g' -e "s/\"legacy\":/$x/g" \
|exec tr -cd '\34\11\12\40-\176'|exec tr -d '\12'|exec tr '\34' '\12' \
|exec grep -Eo '("created_at":"[^"]*)|("conversation_id_str":"[^"]*)|("url":"[^"]*)|("expanded_url":"[^"]*)|("full_text":"[^"]*)' \
|exec sed '/"created_at":"/s//<br>/; /"conversation_id_str":"/s///;/"url":"/{s///;s/"//g; s/.*/<a href=&>&<\/a>/;};
/"expanded_url":"/{s///;s/.*/<a href=&>&<\/a>/;};/"full_text":"/s///; s| https://[^ ]*| <a href=&>&</a> |g;s/> />/g;
/^RT @/s/$/ (RETWEET)/;s/$/<br>/;s/\\u.\{4\}//g'|uniq
esacMight be interesting, but feels like the wrong format.
I don't have ADHD but I certainly find a Twitter thread much more distracting than a blog post to read. I need to untrain my mind that the entire message isn't done by the end of the tweet. And ignore all the other crap that Twitter is trying to get me to click on in the trending topics. I have to be extremely interested in a Twitter thread to read it. It's just a horrible format.
It's the only place that I come back to consistently for enough novel scraps of textual information to hold my attention, the community and culture is welcoming enough for the most part, and the comment box is a single click from the home page. By the time my attention has shifted to article X and the following HN discussion, I usually have enough mental inertia to leave my thoughts at that point. It's a different mindset than if I had to use a separate website to write blog posts on, without any sort of original context.
I remember there was an HN post about static websites and it was filled with comments about how people were wanting to get around to setting it up but they had to go through hosting and theming, and were ultimately sucked into the trap of overengineering. Depending on how your brain is built, for some people this kind of problem is not just a minor annoyance they could solve on any given day, but a persistent obstacle.
But then I could just ask: "Do I actually care about writing?" I would say, to a certain extent, yes. I want recognition that my thoughts existed at one point, inside this mind that's a part of me, regardless of what medium they were conveyed with. If HN commenting is the only form of writing that holds my attention long enough for me to get my thoughts out of my head, then I don't see a problem with it. Otherwise a lot of the parts that make up my whole would die with me, all alone.
I'm sure some of what I've written would make good blog posts if I got around to researching and editing for more than a single session. But because that's not how I write, if I want my voice to be heard then this is about the only way that works consistently enough for me: writing it all at once, before my interest fades and I forget about it later.
So I have a lot of sympathy towards the author. I personally would not use Twitter for this purpose, because it feels like screaming into the void to me, and I wouldn't expect the same kind of responses I could receive on HN, but I share much the same sentiment.
I guess I could link things I want to reply to in my blog, sort of like Daring Fireball, but without an existing readership it seems really lame to try to force it when I can reply in an HN or Twitter comment instead.
its all so tiresome