« first day (1517 days earlier)      last day (3495 days later) » 

5:00 PM
@HackToHell oh, another thing to keep in mind; while you're doing your testing, you will want to get some software that injects itself at the network layer on your test client, and randomly decides to drop packets and increase latency, so you can observe how your software copes with adverse network conditions
a company called Shunra sells proprietary software for this purpose, but if you need FOSS, I think there's a Linux kernel module that does it.
 
Bob
@allquixotic or literally run it on a laptop on GSM travelling through the countryside :P
 
@Bob you use less fuel by modprobeing the kernel module ;p
 
@allquixotic I was thinking an android phone for now until we can find a lower cost hardware solution
 
Bob
106
Q: Simulate delayed and dropped packets on Linux

AlecI would like to simulate packet delay and loss for UDP and TCP on Linux to measure the performance of an application. Is there a simple way to do this?

 
@allquixotic ooh Okay
And I'm thinking of writing the backend using Go and mysql
 
5:02 PM
@HackToHell looks like the best answer to that question Bob just posted will work great on Android (probably, you may have to recompile the kernel)
 
Though I am a bit scared of mysql
 
130
A: Simulate delayed and dropped packets on Linux

ephemientnetem leverages functionality already built into Linux and userspace utilities to simulate networks. This is actually what Mark's answer refers to, by a different name. The examples on their homepage already show how you can achieve what you've asked for: Examples Emulating wide area n...

@HackToHell for 1k requests per second, stay the flying fuck away from MySQL
3
just don't
use Postgres
hell, use a KV non-SQL database; use anything; just don't use MySQL
 
Why would I even need a relational database anyway.
 
Bob
10
Q: How do I simulate packet loss on an Android device?

fejdI'd like to simulate packet loss on a rooted Android device to see how different levels affect video streaming quality. I've tried netem and iptables, without success: netem: # tc qdisc change dev rmnet0 root netem loss 0.1% tc qdisc change dev rmnet0 root netem loss 0.1% Android does not suppo...

 
@HackToHell all you really need is KV
Key = ID; Value = double[] or float[]
 
Bob
5:04 PM
@allquixotic how well do current KV implementations scale, anyway?
I've never looked into that
 
looks up KV
 
Bob
most major RDBMSes have been tested under extremely high loads and they stand up well
 
@Bob extremely well, as long as the write operations you're performing on them are fairly simple... in this case, the process of storing the data is trivial in HackToHell's planned project, and in general DBs only ever struggle with write perf; read perf is generally great
 
Holycrap there are a lot of no-sql databses
 
a KV database would suck if you had to update the value of many keys very frequently, depending on values changed in other keys, etc
but in this case each key is literally independent and can be updated in parallel with no locking
and the read is just, well, read... it'll be lightning fast, not a bottleneck
 
Bob
5:06 PM
@allquixotic it'll be painful when time comes to query the data, though
unless you want to convert to a different format first
if you want real-time queries, KV probably isn't what you want (e.g. GPS bus-trackers)
 
@Bob generating statistics will probably have to involve something like pulling a static copy of the entire DB into RAM (if there's enough RAM) or streaming it out to JSON or XML on disk (if there's not enough RAM), then either processing it a la DOM or a la streaming (depending on the size of the dataset) on a separate server, so as not to disturb the DB server
I'm going to concede that Postgres and an optimized SQL statement would probably result in faster stats generation :P
but for just getting the shit in the database quickly, KV likely wins
 
I could push the database into a KV and then slowly(?) add it to a postgresql server ?
 
Bob
@allquixotic Hm. I'd test that, but I really can't be bothered doing anything right now.
 
So that it can be queried later and such
@Bob I am going to :D
As soon as I get a hang of this posgresql anyway
Phew so the backend is Go+Postgresql
Time to write some codez
 
Bob
@allquixotic I mean, if you want pure write speed you could just append to a file... just hope you never need to read it! :P
 
5:13 PM
@Bob at least a KV database will provide O(logish) lookup time for a specific key
traversing the entire dataset is probably going to be slow, though
one thing you could efficiently do with a KV is provide an individual user, upon request, a webpage displaying their stats for their specific vehicle
look up their key (super fast whee) --> pull out the values --> process --> render page
no problem there. the problem comes when you need to generate stats across ALL the vehicles
like SELECT * FROM stats WHERE speed > 120;
doing that in Postgres would be fast, but painfully slow (without some kind of in-memory data structure) in the KV
 
Bob
@allquixotic but if you need to store a history of positions...
that's actually relational data
you could store it with a key of id_timestamp, but then you'd be performing an O(n) traversal to find all possible timestamps anyway
 
oh... with the history you probably need to record time, too
 
fuck forgot about that
 
now, in an RDBMS, you could have a composite key of id and timestamp
 
The time too is needed :|
 
5:17 PM
the more I think about it, the more I feel that having a relational database server with 172 GB of RAM is going to be your (ultimate / production-grade) ideal backend
 
Bob
@allquixotic and it'd be easy to select * from stats where id = 123 order by timestamp
 
Postgres would work
 
Bob
or most recent 10, or where timestamp within last day, etc.
 
@Bob yeah, and since DBs' storage format and algorithms are extremely finely tuned to do stuff exactly like that as fast as possible, you don't have to reinvent the wheel by figuring out how to do that after you extract data from the KV
 
Can the database be split amongst different computers ?
 
5:19 PM
only thing you have to bear in mind is that, IF the statistics-gathering load becomes too severe, you might want to either have a replicated database, or take periodic static copies of the master DB into a separate stats DB, to save the CPU of the poor production DB
 
I could split the data based on Bus Ids
 
in other words, if tons of users like to hit your website and look up their stats and query stuff to and fro, that's going to use up CPU that your primary DB server should be using for storing data
so a static copy or replication would help
 
Oh boy, building a scalable app is no easy thing
 
Bob
incidentally, at 1k/second, you're looking at ~2.5 GB of writes per day: this is a link dammit markdown
that's... not much at all
 
!! s/markdown/commonmark/
 
5:21 PM
@allquixotic incidentally, at 1k/second, you're looking at ~2.5 GB of writes per day: this is a link dammit commonmark (source)
 
Bob
(that's assuming a 128-bit GUID, and 32-bit numbers for location and accel)
 
@HackToHell if it were easy, they wouldn't pay people at Amazon, GOOG, etc. high values of 6 figs salary to think of this stuff
 
Bob
(add 32 bits for timestamp, bringing it up a little bit, and add a bit for indexing etc)
 
@Bob even if you increased that by a factor of 10, an SSD and a commodity Ivy Bridge Xeon should be able to handle that, no?
 
Bob
5:22 PM
@allquixotic seems like it
 
@allquixotic That's pretty decent
Google moves it from Google Code to github
 
there's a difference between designing for scalability and overengineering though -- to start out with, when you have 0 customers, you SHOULD really be running everything on a single, smallish server or VPS... only AFTER you start to get significant customer demand should you scale... your purpose in designing for scalability is to be ready to add servers or upgrade your server once the demand comes
 
Bob
in other words, good abstraction
 
and hopefully, scaling up won't require you to write any code, just tweak a few configuration files
 
Bob
you could even start off with just writing to sqlite
 
5:25 PM
yeah, for sure
 
Thing is it's just a Proof Of Concept kinda thingy
 
your code's use of threading or multiprocessing is going to play a big role in the performance though, so always think in terms of how you're going to deal with many simultaneous requests
 
Bob
with a scheme as simple as yours, it really doesn't matter how you store the data just yet
 
you're a Proof of Concept!
 
And it's better if I show them it works and it can be scaled
 
Bob
5:26 PM
make sure it's easy to change your code to use a different storage mechanism, and that's all
@allquixotic eh, depends
 
@allquixotic C++ and OpenMP ftw ? :D
 
Bob
the ideal model is more-or-less how current HTTP servers work
single thread listening on a socket, passing input off to worker threads that update the DB
but you don't have to start off with multiple threads - make it work first with a single thread! (just make sure you separate your DB, processing and listening code and it should be easy to split it up when the time comes)
 
Okay, I'll start with a simple implementation and then add the code for handling a lot of users
 
@Bob nginx does that, but it spawns several separate processes each with their own listening thread
doesn't it?
!! s/add/rewrite/
 
@allquixotic Okay, I'll start with a simple implementation and then rewrite the code for handling a lot of users (source)
 
5:32 PM
just being realistic
 
uh huh
And I'm going to go with Go
Cause apparently it's fast and all
 
Bob
@allquixotic eh, I'm not too sure about the implementation details
nor why that would be a good idea :\
 
> func add(x int, y int) int {
return x + y
}
return type comes later in Go
Why would they do that o_0
 
@HackToHell func
 
Bob
> The only reason nginx uses multiple processes, is to make full use of multi-core, multi-CPU and hyper-threading systems. Even with SMP support, the kernel cannot schedule a single thread of execution over multiple CPUs. It requires at least one process or thread per logical CPU.
...I still don't see why it needs processes.
 
5:38 PM
play that funcy music white boay!
 
Bob
@HackToHell well you chose the language :P
strangely, I'd actually seriously consider nodejs for this
it seems quite popular these days :P
(ffsync, ghost, ...)
hm
 
@allquixotic I don't get it o0
 
nodejs also has a much better selection of libraries
 
@Bob so is Go :D
 
almost on the scale of ruby :D
 
Bob
5:39 PM
now I suddenly realise I have no idea what language I'd use for a similar project
C# is usually my go-to, but it's not quite as easy on *nix
also probably not great when you're looking at processing 1k r/s :S
hm. now I want to test that.
 
@Bob Start with Java :D
 
Bob
@HackToHell nothanks
 
@Bob I'm sure v8 could handle it ;p
 
@Bob hehe
 
I wonder how much faster my Ruby program could run on NodeJS? or if it would be faster at all?
 
Bob
5:43 PM
I like my TAP
 
I'm using MRI 1.9.3. the bottleneck seems to be in running Tarjan's algorithm over the directed graphset every time I add a node.
 
Bob
(used the wrong abbriev... dammit)
 
Why would they even do that
Debugging Go code must be hell
I am too used to super strict Java :|
 
Bob
> the difference between node and async c# is 10-15% either way depending upon what you're doing
 
I need help thinking about this algorithm...
 
Bob
5:48 PM
hm
@allquixotic quack?
 
:D
yes. thanks.
my problem: on a dataset of ~7000 nodes of a polytree (connected digraph), whose keys are represented by an integer, my task is to ensure that a cycle is never introduced into the digraph -- firstly because it causes infinite loops in arbitrary parts of the graph API, and secondly because I need to detect cycles in the data and report them as problems, and remove the minimum number of nodes to restore the rest of the graph as non-cyclic.
to do this, currently, I use Tarjan's algorithm to sort the entire polytree each time I add a node, before accessing any properties of it; the algorithm throws an exception if a cycle is found
the problem is that the sorting and the cycle detection go hand in hand with this algorithm, and you can't really have one without the other; furthermore, if I don't try and sort the entire polytree each time I add a node, I could hit one of those infinite loop conditions
so I can't wait until after I've compiled the entire tree and then do a sort, because I have to access properties of the nodes during tree construction
so it's the O(Tarjan's Algorithm * n) -- it's the * n part that is killing me
it's taking 25 minutes to run (some of that time is spent parsing XML, but a lot of it is being spent sorting the polytree)
 
Bob
@allquixotic could you detect a loop while trying to access said properties?
 
@Bob the only reliable way I know of to do that would be to run Tarjan's algorithm before each property access, which will be even slower
based on the complexity of the graph, I can't look at any specific number of iterations of the internal loops of the properties (many of which attempt to traverse the entire tree, which is when they get caught in a cycle) and say "aha! it's looped too many times, so that must be a cycle!"
 
Bob
@allquixotic but wouldn't it be a cycle if it encounters the same node more than once?
 
it could be acyclic but just take a really complicated route to traverse
 
Bob
5:56 PM
so "too many times" => n > 1
 
hm...
so you'd have to keep a list of every node you've traversed during property access (preferably a hash, for lookup performance), and each time you encounter a new node, add it to the hash if it's not there, and if it's already there, throw an exception
that sounds pretty algorithmically complicated, though easy to implement :S
 
Bob
unless some condition has changed; if you start a deterministic traversal from one state and end up at that state again, you're in a cycle
(where a state includes current node and anything that might affect choice of descendants to traverse)
 
yeah, but the problem is detecting that isn't very easy or fast, and I'm trying to avoid paying the cost of the cycle detection so often, but it seems that in attempting to avoid Tarjan's I end up reinventing a cycle detection algorithm of my own :P
instead it seems I'd be writing the naive cycle detection algorithm (as I described above)
 
Bob
@allquixotic well, how often does a cycle occur?
if it's frequent, then checking with Tarjan's every time might be more efficient
 
@Bob it's a bit of an edge case. but, OTOH, if it's not detected, it can hang the program and make it nearly impossible to diagnose.
 
Bob
6:00 PM
if it's rare, then it might be more efficient to assume no cycles (no explicit Tarjan's, just a check-as-you-traverse) and simply check once at the end
@allquixotic the goal of cycle detection during traversal would be to prevent a non-terminating traversal, not detect the existence of any cycle in the graph
 
it's pretty rare in the test data that I have, but if I don't check, I'll be maintaining hashes and doing repeated additions and lookups in them as I traverse and add, which will be almost as bad as doing Tarjan's each time (or worse, if Tarjan's is faster than that)
 
Bob
if your traversal does not cover all possible paths, then it could be more efficient than Tarjan's (which guarantees no cycles in the entire graph)
@allquixotic but is Tarjan's faster than that?
I would've thought that to be pretty cheap
especially if the paths you cover during your property access is a small subset of all paths
 
the complexity of Tarjan's is on the order of linear with the number of edges and nodes of the graph
 
Bob
of course, you lose the short-circuiting behaviour of an explicit Tarjan's check since you might miss a cycle until the final check
@allquixotic So... did you ever profile just how much of that 25 mins it took?
And what's the constant? (linear... and? is the constant considerably greater than maintaining a hash table? which will be O(no. of property accesses * path length))
 
@Bob no, but that entire 25 minutes was consumed by in-memory operations (no disk, no network), and the process wasn't swapped out (no memory pressure), so it would have been either that, or Ruby's hashmap methods being slow... I think the XML was already processed before then too
 
Bob
6:06 PM
@allquixotic But how much time did Tarjan's algo take compared to time taken for property accesses, adding nodes, etc?
 
good point; I should probably measure that with ruby-prof
 
Bob
If it's insignificant, then you're looking in the wrong place.
 
@Bob profiling now :D
 
Bob
I... never knew about this.
This is awesome! :D
And it works on mono! :D
@allquixotic ^
dumping IIS => fast C#/.NET webserver
 
6:22 PM
@Bob Yeah, I'm reading the article now. It looks nice.
 
Bob
@allquixotic the guy who wrote it apparently got a job at SE shortly after that post O_O
about two months after
 
@Bob lol nice
 
So speedtest.net shows my download speed as "10 Mbps", but the Windows 10 Technical Preview ISO is downloading at 855Kbps...why?
 
Bob
is that 855Kbps or 855KB/s?
!! s/K/k/g
 
@Bob is that 855kbps or 855kB/s? (source)
 
Bob
6:37 PM
@DemCodeLines ^
 
KB/sec
 
@DemCodeLines Because it is working as intended.
 
Then what does the download speed mean?
 
Hm.... Data throughtput into your computer?
speedtest measures in megabits per second, downloaders usually measure in kilobytes per second (or megabytes)
 
Bob
37
A: What is the difference between a kibibyte, a kilobit, and a kilobyte?

squircle1 KiB (Kibibyte) = 1,024 B (Bytes) (2^10 Bytes) 1 kb (Kilobit) = 125 B (Bytes) (10^3 Bits ÷ (8 bits / byte) = 125 B) 1 kB (Kilobyte) = 1,000 B (Bytes) (10^3 Bytes) It's the same way with any SI prefix; k (1x103), M (1x106), G (1x109), so, by extension: 1 MiB (Mebibyte) = 1,048,576 B (Byte...

simply: 8 bits in a (modern/x86) byte
 
6:41 PM
Yeah, that
 
Bob
@allquixotic well... good luck with your graph
I'm gonna try to get some sleep :P
 
@Bob aww :(
the threads that spend all their time sleeping can effectively be discarded as not relevant
aaaand I spend 61.51% of my time doing Array.concat -_-
 
Bob
@allquixotic fine, fine, I'll come back :P
 
Bob
I have no idea how to read that O_O
 
6:53 PM
all the busy work happens in Thread ID: 30154800
%self is the percentage of total CPU time of the program (across all threads) that was spent, BUSY, on that method
%self      total      self      wait     child     calls  name
61.51   1036.495  1036.495     0.000     0.000 26098607   Array#concat
that sums it up, basically
 
Bob
gimme a sec gonna run it through a couple filters
 
I've determined that you can ignore all the data except for Thread ID: 30154800 (do a find for that)
and only the top 10 or so entries from that list are even worth considering
 %self      total      self      wait     child     calls  name
 61.51   1036.495  1036.495     0.000     0.000 26098607   Array#concat

	called from:  Tree::TreeNode#each (C:/MyCode/runtime/lib/ruby/gems/1.9.1/gems/rubytree-0.9.4/lib/tree.rb:522)

  3.05   1543.689    51.338     0.109  1492.242     9247   Tree::TreeNode#each
  C:/MyCode/runtime/lib/ruby/gems/1.9.1/gems/rubytree-0.9.4/lib/tree.rb:522
	called from:  Tree::TreeNode#tsort_each_node (C:/MyCode/tools/MyCode/RestApi.rb:14)  MyCode::RestApi#getSubfolders (C:/MyCode/tools/MyCode/RestApi.rb:399)
there, that's all that's really needed from that ~250kb log
 
Bob
@allquixotic So where's the other 30%?
 
@Bob other threads, sleeping, little 0.01%s here and there (hundreds of them), etc
 
Bob
Though, that's mostly insignificant compared to the Array.concat...
 
6:58 PM
    # Traverses each node (including this node) of the (sub)tree rooted at this node
    # by yielding the nodes to the specified block.
    #
    # The traversal is *depth-first* and from *left-to-right* in pre-ordered sequence.
    #
    # @yieldparam node [Tree::TreeNode] Each node.
    #
    # @see #preordered_each
    # @see #breadth_each
    #
    # @return [Tree::TreeNode] this node, if a block if given
    # @return [Enumerator] an enumerator on this tree, if a block is *not* given
    def each(&block)             # :yields: node
that code, specifically, the 5th or 6th line from the bottom (depending on if you count whitespace), calls concat so many times that it literally is accounting for 61% of the CPU time of the entire process
and that's with a very large amount of XML being processed in the same process space, network I/O, etc
in fact, the XML stuff is so fast that it's in the noise
 
Bob
@allquixotic And what calls this function?
Can you minimise those?
 
@Bob crap. Tarjan's algorithm calls it.
Tarjan's is a mixin that implements itself partially by calling each
 
Bob
Welp.
(I was kinda expecting that)
 
it would appear that Tarjan's itself may not be all that painfully intensive, but asking the rubytree to each its nodes is painful
come to think of it, that code block I just pasted looks pretty stupid, doesn't it?
I mean, why do you need to dynamically allocate an array and concatenate a bunch of nodes onto it just to get a stack of nodes based on the children of the current node?
if this were C, you'd use pointers. bam, done.
 
Bob
shrug
 
7:04 PM
(this isn't my library; you can view the code online here)
 
Bob
a LL would be better here
 
@Bob not sure you can represent a digraph with a linked list
interestingly, the clone that method calls is eating up about 1% of the CPU, too. well, that makes sense, since clone is memory allocation
 
Bob
@allquixotic node_stack
you'd avoid having to resize (and possibly copy) the array
 
hmmmmmmmm you're right
 
Bob
or maybe if you can reserve a larger capacity?
 
7:07 PM
will have to look at the Ruby impl of Array.concat too
 
Bob
would it hurt to allocate an array with the max number of elements in the graph?
6
A: Ruby Array concat versus + speed?

Chris CashwellThe answer lies in Ruby's underlying C implementation of the + operator and the concat methods. Array#+ rb_ary_plus(VALUE x, VALUE y) { VALUE z; long len, xlen, ylen; y = to_ary(y); xlen = RARRAY_LEN(x); ylen = RARRAY_LEN(y); len = xlen + ylen; z = rb_ary_new2(len);...

@allquixotic You might also save a bit with array.push, but that's seriously microoptimising where LL or reserving capacity is likely better
 
wait, if all concat is doing is splicing two arrays together by making a pointer from one to the next, isn't it almost like a linked list?
 
Bob
@allquixotic Hm. The pseudocode of the latter link says otherwise
determine new length as ary.length + other_ary.length
if new length makes ary over capacity
  increase ary capacity
copy other_ary into ary
 
ahhhh
 
Bob
1450 static void
1451 rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
1452 {
1453     long rlen;
1454
1455     if (len < 0) rb_raise(rb_eIndexError, "negative length (%ld)", len);
1456     if (beg < 0) {
1457         beg += RARRAY_LEN(ary);
1458         if (beg < 0) {
1459             rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
1460                      beg - RARRAY_LEN(ary), -RARRAY_LEN(ary));
1461         }
1462     }
1463     if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) {
 
7:13 PM
looks like some memory copying to me
it seems to work vaguely similar to Java's ArrayList.Add
 
Bob
@allquixotic Looks like the behaviour of rb_array_splice is to resize and push, not link.
ary_double_capa(ary, alen);
@allquixotic reserving capacity is probably the easiest course of action
> An array can also be created by explicitly calling ::new with zero, one (the initial size of the Array) or two arguments (the initial size and a default object).
You'll still have some copying going on, but that can't be avoided without modifying the implementation of node.children
 
well, even though Kernel.clone takes up 1.59% of the time, I honestly don't think it's worth trying to not clone shit... I'll continue letting it clone when it wants to; if I can improve the perf of the Array.concat by using a list instead, that would be huge
 
Bob
Hm, actually... you can avoid .clone by directly reading node.children and turning that into a LL
not sure if it'll be faster or slower than reserving capacity
certainly more difficult
 
I think Array.unshift creates a linked list
 
Bob
Once you learn that shift/unshift are like push/pop on the other end of the array, you can mentally drop the 'f' from the name of the methods to remember which one 'dumps' elements and which one 'inserts' them. :) — Phrogz Jan 21 '11 at 17:37
lol
 
7:18 PM
node_stack.unshift(current.children.clone) ?
 
Bob
@allquixotic apparently not
I cbf digging into the actual impl code
Ugh. Looks like the 'initial size' crap doesn't work as hoped
there doesn't seem to be a direct equivalent to .NET's .Capacity
pity. that would've solved this pretty well
@allquixotic looks like you might be stuck iterating over current.children and converting it to a LL, if you want to go that path
I'm not sure how much faster that would be, if any
on one hand, you're avoiding a lot of resize + copy (assuming node_stack grows quite big)
on the other, you're replacing C resize + copy with ruby loops... the latter likely won't be as well optimised
 
@Bob interestingly, the node_stack is never returned to the caller; it's simply used to keep track of where this code is in the stack
the line yield current basically calls an anonymous method ("block") provided by the caller, passing current as a parameter
 
Bob
@allquixotic hm? pretty standard, isn't it?
 
that's what the caller cares about
the caller doesn't care how we keep track of the child nodes internally
 
Bob
it's basically a translation of recursion into a loop with a stack variable
the problem is ruby doesn't give you any easy way to prevent excessive resizing, and no native LL implementation either
@allquixotic Though, if this is mostly called through Tarjan's, and accounts for 60% of CPU usage, would the earlier suggestion of checking for cycles during traversal be better?
 
7:26 PM
maybe -_-
 
Bob
Would the use of hash tables there account for >50% of current time taken? If not, then that's a better way to go.
Again, you lose short-circuiting behaviour of repeated Tarjan's (if there's an unnoticed path, it'll only be detected by the final check at the end), but since that's supposedly rare then it should be better overall
 
hmmm
 
Bob
I suppose the next thing to do would be to compare LL here against avoiding Tarjan's.
The former should be better than resizing arrays, but replacing native code with interpreted code might take make it worse. The latter... pretty much test and see? :P
 
yeah
thanks :P you should sleep now
 
Bob
lol
good luck
 
7:57 PM
Anyone else on this already?
 
Adding it to my WDS server now.
 
@OliverSalzburg Windows 10? O.o
 
@ThatBrazilianGuy Yeah. preview.windows.com
 
But... What about Windows 9?
Did they just skip?
In 1983, Microsoft announced the development of Windows, a graphical user interface (GUI) for its own operating system (MS-DOS). The product line has changed from a GUI product to a modern operating system over two families of design, each with its own codebase and default file system. The 3.x and 4.x family includes Windows 3.0, Windows 3.1x, Windows 95, Windows 98, and Windows ME. Windows for Workgroups 3.11 added 32-bit networking and 32-bit disk access. Windows 95 added additional 32-bit capabilities (however, MS-DOS, some of the kernel, and supplementary utilities such as Disk Defragme...
They did.
 
@ThatBrazilianGuy They "explained" that in the introduction. It's not an incrementally improving product, it's so mindblowingly revolutionary, that it's 2 versions better
 
8:16 PM
@OliverSalzburg so, Java 5? :P
from Java 1.4 to Java 5 :P
 
I like it so far
...he says after 5 minutes of use
 
8:32 PM
IT'S ALIIIIIIIIIIVE
Liking it, liking it.
the Metro apps don't open full screen :')
 
Still waiting on my download. Damn slow interwebz.
 
"use the start menu rather than the start screen" oh niiiiiiiiiice
 
At about 7:30 PM Firefox told me it was going to take 1 hour 45 minutes to download. It still has 1GB to go and will take another "40 minutes"
 
8:54 PM
@tombull89 the return of windows ? what a concept
 
9:07 PM
@OliverSalzburg Yes, but I boot from VHD. :D
 
@TomWijsman Forgot you could do that, any link to a guide?
 
@Mokubai: Only step 1 and 2 of technet.microsoft.com/en-us/library/hh825691.aspx and then bcdboot V:\Windows
Fairly easy to accomplish; create and format VHD, apply image, make it available in BCD.
 
Awesome, cheers :)
 
You can change the default or lower timeout of the boot menu in msconfig.
 
Was going to put it in a VM, but VHD would probably be better...
 
9:16 PM
Did the same when Windows 8 came out; I was almost about to not try Windows 10, until I remembered Boot from VHD.
Not sure if all Windows 8(.1) versions can do Boot from VHD; IIRC, it was introduced as a professional feature in Windows 7.
 
I have Win8 Pro (actually paid for it) so I should be fine.
 
Y'all still downloading Win10?
yesterday, by DemCodeLines
"Because 7 ate(8) 9"... sigh
This is what it says on Windows feedback page:
> And don’t worry about hurting our feelings—be honest!
lol
 
9:50 PM
0
Q: Flag as off topic - move to linux/unix community is missing

KamilI have tried to flag this question as off-topic, to move it into Unix & Linux community. However there is no option for that (or I don't see it?): Is this missing on purpose? I know there is Linux tag in here, but I would move that anyway, because people probably can get better Linux support...

 
10:34 PM
"I just assumed that the EXE is a download manager for the ISOs, like I've seen in the past. Next thing I know my CURRENT machine is rebooting to update to Windows 10!" answers.microsoft.com/en-us/windows/forum/… Is it wrong to laugh :-)
 
10:50 PM
I should test the thing and provide feedback, so Ignoble Detractors Ignoring Obvious Trouble Spread do not set my destiny.
 
Root access huh?
rm -rf /
...Not working.
 
" go back to the windows 7 start menu, my wife has to play Solitare, and it isnt on windows 8" :-)
 
11:14 PM
@Psycogeek Good point... I thought it was just gonna download an ISO too, but I'm glad I saw that question before I rebooted my work PC
 

« first day (1517 days earlier)      last day (3495 days later) »