[quote]
The paste utility concatenates the corresponding lines of the given input
files, replacing all but the last file's newline characters with a single
tab character,
[/quote]
tab
Oh.
Name:
Anonymous2012-04-13 19:49
Why should I use Plan 9 if I have Haiku?
Name:
Anonymous2012-04-13 20:13
I'm using open genera, a LISP OS made for programming
>>19
That doesn't matter. The language and the programs either performs its job at controlling the computer or it doesn't. Limbo works and Inferno works.
It's running on top of the Android Loonix kernel because of PROPRIETARY DRIVERS THAT DO NOT RESPECT YOUR FREEDOM, but Inferno was always meant to run virtually on many different platforms.
Name:
Anonymous2012-04-14 5:33
The GUI is simple and beautiful
Ha-ha. No. It's uglier than xterm. Also it lacks software.
Because Plan 9 is a great environment for programmers to learn and explore, and is not diluted by attempts to make it practical for or popular with lay users.
Name:
surrealdeal2012-04-15 20:30
It's benefits aren't all that compelling, and anyone that would be interested in it is already fluent enough in *nix not to give a fuck about it
The GUI is a good idea, it's just too much of a paradigm shift from the WIMP stuff we're all used to. And that's a bad thing.
It is kind of cool as an historic interest though, much like the Blit.
Name:
Anonymous2012-04-16 5:57
>>28
Literally any resource you can access in a Plan 9 system is a file. Network resources can be easily accessed by mounting the remote system into an empty directory. These two powerful features means that Plan 9 systems are very flexible and yet, easy to use for a huge number of modern use cases.
>>32 Literally any resource you can access in a Plan 9 system is a file. Network resources can be easily accessed by mounting the remote system into an empty directory.
So how do I mount /prague/ somewhere?
Name:
Anonymous2012-04-16 10:50
>>34
Actually, I don't know how to do that. I'll need to look into that.
Name:
Anonymous2012-04-16 11:04
Because I can install GNU/Linux on any computer on the side of the road too.
webfs[1] already exists; writing a progfs on top of it would be trivial.
One might use it like this:
% progfs
% ls /mnt/prog/frontpage
free programming classes
why arent you using plan 9
sepples
jews enslave us
aaa penis
excel function
multithreading for fagstorms
anus
% ls '/mnt/prog/frontpage/why arent you using plan 9'
date
count
posts
% cat '/mnt/prog/frontpage/why arent you using plan 9/count'
39
% cat '/mnt/prog/frontpage/why arent you using plan 9/posts/38'
38 Name: Anonymous : 2012-04-16 19:31
>>37
Doing it the Plan 9 way is a matter of implementing a progscrape filesystem (or a more general httpfs).
%
Now that I wrote all this I think I want to go implement it!
Not really what we were talking about, but here's a FUSE progfs. You'll need http://code.google.com/p/fusepy/.
It's twice as slow as balls and it doesn't properly set mtime/ctime/atime because it does very little caching and I don't want getattr to instigate a web request every time, but it kind of works. Someone else can figure out how to export it over 9P.
#!/usr/bin/python
import argparse
import errno
import json
import os
import re
import stat
import sys
import time
import urllib2
def parse_path(path):
"""
Paths are at most three levels deep. This always returns a three-member
list and fills the blanks with None.
"""
path = filter(None, path.split('/'))
if len(path) > 3:
raise fuse.FuseOSError(errno.ENOENT)
while len(path) < 3:
path.append(None)
return path
def parse_name(name):
"""
Takes the contents of the name field and returns ['name!trip', 'email'].
"""
m = re.match(name,
'^([^<]*)<a href="mailto:([^"]*)">([^<]*)</a>(.*)$',
re.DOTALL)
if m is None:
return '', ''
else:
return ''.join(m.group(1), m.group(3), m.group(4)), m.group(2)
class HeadRequest(urllib2.Request):
"""Makes a HEAD request rather than GET."""
get_method = lambda self: 'HEAD'
def _get_subject_txt(self):
"""
Checks if subject.txt has changed, and if so, fetches the new file
and updates the threads table.
"""
r = urllib2.urlopen(HeadRequest(self.subject_url))
if self.last_modified >= unix_time(r.headers.getheader('last-modified')):
# No change. Stop now.
r.close()
return
r.close()
r = urllib2.urlopen(self.subject_url)
self.last_modified = unix_time(r.headers.getheader('last-modified'))
regex = re.compile(u"""
^(?P<subject>.*) # Subject
<>
.*? # Creator's name
<>
.*? # Thread icon
<>
(?P<id>-?\d*) # Time posted/thread ID
<>
(?P<replies>\d*) # Number of replies
<>
.*? # ???
<>
(?P<last_post>\d*) # Time of last post
\\n$""", re.VERBOSE)
for line in r.readlines():
# FIXME this loop is slow as balls
# Replacing the regex with split('<>') is faster, but Shiichan is
# full of corner cases and that loses /prog/ threads.
thread = regex.match(line).groupdict()
if thread['id'] not in self.threads:
self.threads[thread['id']] = {}
self.threads[thread['id']]['title'] = thread['subject']
self.threads[thread['id']]['last_modified'] = \
float(thread['last_post'])
self.threads[thread['id']]['posts'] = \
int(thread['replies'])
r.close()
if path[1] == 'title' and not path[2]:
# Thread title file
return {'st_mode': (stat.S_IFREG | 0444),
'st_ctime': float(path[0]),
'st_mtime': float(path[0]),
'st_atime': float(path[0]),
'st_size': 1024,
'st_uid': os.getuid(),
'st_gid': os.getgid()}
try:
path[1] = int(path[1])
except ValueError:
# Not a post folder
raise fuse.FuseOSError(errno.ENOENT)
if path[1] < 1 or path[1] > self.threads[path[0]]['posts']:
# Post index out of range
raise fuse.FuseOSError(errno.ENOENT)
if not path[2]:
# Post folder
# TODO fetch post for accurate times
return {'st_mode': (stat.S_IFDIR | 0555),
'st_ctime': self.threads[path[0]]['last_modified'],
'st_mtime': self.threads[path[0]]['last_modified'],
'st_atime': self.threads[path[0]]['last_modified'],
'st_uid': os.getuid(),
'st_gid': os.getgid()}
if path[2] not in ('poster', 'email', 'body'):
raise fuse.FuseOSError(errno.ENOENT)
# Post data file
# TODO fetch post for accurate times
return {'st_mode': (stat.S_IFREG | 0444),
'st_ctime': self.threads[path[0]]['last_modified'],
'st_mtime': self.threads[path[0]]['last_modified'],
'st_atime': self.threads[path[0]]['last_modified'],
'st_size': 1024 * 1024,
'st_uid': os.getuid(),
'st_gid': os.getgid()}
if path[1] < 0 or path[1] > self.threads[path[0]]['posts']:
raise fuse.FuseOSError(errno.ENOENT)
return ['.', '..', 'poster', 'email', 'body']
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-b', '--board', action='store',
help='board')
parser.add_argument('mountpoint', action='store',
help='mount point')
parser.add_argument('-f', '--foreground', action='store_true',
help='run in the foreground (useful for debugging)')
args = parser.parse_args()
fuse = fuse.FUSE(ProgFS(args.board or 'prog'),
args.mountpoint,
foreground=args.foreground)
Name:
Anonymous2012-04-17 5:16
I've used both Haiku and Plan9, to me there's no difference to operating systems really, they all do the same things pretty much, except Windows 7 that have
that go that extra mile that really really maters when it comes down to business.
That's it.
Name:
Anonymous2012-04-17 15:06
If I had a time machine and wanted to be nice, I would go back to Bell Labs in 1969, show them an Ipad, and tell them ``this runs UNIX''.
If I had a time machine and wanted to be mean, I would go back to Bell Labs in 1989, show them an Ipad, and tell them ``this runs UNIX''.
>>42
If I had a time machine and wanted to be mean, I would go back to Bell Labs in 19xx, show them an Ipad, and tell them ``this only runs one app at a time''.
The only thing it's missing is drivers for modern hardware, but it will run great on a VM or a free computer found on the side of the road.
If drivers are an issue has Plan 9 been ported to ARM boards like RasPi or BeagleBoard?
>>51
The boot process is fairly awkward and requires a humongous binary blob to be loaded before control is given to the operating system. Given my advanced case of paranoia, I fear that that binary blob might secretly contain software that violates my privacy (it would be very difficult to check, since the GPU architecture specs haven't been published).
Name:
Anonymous2012-06-18 22:06
>>52
How odd, though I suppose no different to the BIOS on any standard PC.
Name:
Anonymous2012-06-18 22:09
>>53
The beagleboard(/pandaboard?) doesn't have the same issue (though you can't drive the 3D accelerator without binary blobs).
>>56
Become a productive citizen and give up the internet. You will be surprised how infrequent the internet is actually needed. but I need to look up stuff for information's sake
You can download a tarball of the Wikipedia database (about 20GB last I checked) and plug it into Mediawiki/MySQL/PHP a local server. The MSDN library is about 3GB. You can also write scrapers for sites like EnterpriseOverflow and sync your collections whenever you find a connection. but I need email
Just check it at work/school only, where there is a connection. If it's really urgent, people can call you (btw all you need is a non-smart cell phone, better yet a prepaid one for max privacy). but I need social networking
No you don't. but I need to read and post on chans
No you don't. but where will I get my music?
Just horde once a month or some such interval where you dedicate one day to synchronizing your local copies of various informative websites.
Congratulations, you just saved the cost of a home internet connection!
C++ is a good language. It is not a perfect language because it inherits from C. C is a flawed language where many things are left undefined. C is an ancient artifact that serves no purpose outside of the domain of kernel design. Because of the improvements made upon C to form C++, beginning programmers and veteran programmers alike may be led astray, thinking that modern C usage is a good idea. It is a mistake to believe the success of C++ justifies the continued use and popularity of C. Just because C++ is successful does not mean the language it has inherited from is of high quality.