• Zum Inhalt springen
  • Zur Seitenspalte springen

Technik News

Das Blog zu IT, Mobilfunk & Internet

DEFCON 14 – A hacker’s paradise

August 20, 2006 von Harald Puhl

I have just returned from a vacation, interluded by a couple of trips – one of them to DEFCON, the world’s largest hacker conference. This year, it ran at the Riviera hotel and casino in Las Vegas at the beginning of august.

There was plenty to see and do, from conferences as interesting as war-rocketing to an insight into the US-VISIT program, and it’s plans to implement RFID tags into the green visa waivers, or the 2D barcode receipts given out at airports.

I participated in the wardriving events, organised by Thorn, and which consisted of the Running Man and Fox Hunt competitions. Our team was led by Renderman, and we had some backup that put up some noise (fake APs, floods, etc.) to make the contest more interesting.

The Running Man started well, but unfortunately the other team tripped casino security by walking past their booth with a magmount omni antenna on each shoulder, a laptop, several WiFi cards dangling from their belts, a YellowJacket, and other gear – apparently, the IT guys freaked out, and they wanted the contest shut down. After the intervention of Ross and Priest, we were allowed to carry on, but limiting the search area to the venue, and not the whole casino. After the contest resumed, we found the Running Man in around 15 minutes, and won!

The second contest, Fox Hunt, consisted of a hidden WRT54G that was only on for 15 seconds every minute. One was supposed to locate the fox, connect to it, and change the SSID after brute-forcing admin account. 15 seconds to do all that is not a lot! So, our plan was to locate the fox….and make a run with it to a safe place, so we could kill the 15 second timer circuit, reduce the amount of RF leaking out and have a go at changing the SSID. The first part of the plan went well, but then the other team got slightly miffed, called Thorn, who in turn called us to go back to the contest table with the WRT so the other team could also have a go at it.

Interestingly, Thorn had taped the admin password to the bottom of the router, but neither team noticed it! In fact, the other team ended up brute-forcing the AP and changing the SSID. We contested that since when we removed and reapplied power to the AP, the SSID went back to its default, we had in fact won, but Thorn wasn’t having any of it. The contest was a tie, which was decided by the question “Who owns the OID 00:00:00?”, the answer to which is Xerox. We got it wrong, and so we lost. Next year we will be better prepared for sure.

Here are a few pictures from the event:

215968623_41bb4d0a52

Thorn and Renderman giving their presentation on the Church of Wifi, with CoWPatty, the WPA rainbow table generator, and the WRT54G mods, which included my WaRThog.

215972088_93d246f6a7

The war-rocketing guys, and their awsome rocket. I wonder how they got that thing past airport security.

219943777_5f1822fcfd

The WaRThog on the left, with two more of CoWF’s modified WRT54Gs.

219943269_35eee99859

If you used DEFCON’s wireless network to check your email, access your corporate network, etc., but didn’t use any form of security (VPN, SSH…), you are bound to be in the Wall of Sheep. It displays captured user names, passwords, domains and access methods – I actually had the two colleagues travelling with me show up here, even though I told them to not even open their laptops while at the con.

See you next year!

Unix Course: More Shell Programming – Lecture 3

August 19, 2006 von Harald Puhl

The Insides of Athena Unix

Today we will discuss Shell Scripts.  I will start by discussing how and why they are used. 

You will find that most shell scripts are written for the bourne shell.  The reason for this is that all unix systems have the bourn shell, wehreas not all of them have the c shell.  It is possible to write a shell script that runs under the c shell, though, by putting

#!/bin/csh

On the first line of the script.  I will only discuss bourne shell programming here, and you should refer to the man page for the c shell for information on how to write shell scripts which use it.

Simple shell programs are often only one line long.  If there is a command line that you type frequently (often that involves piping the output of one command into another) you can enter that line into a file, and use it as a shell script which can be invoked by its name. For example, suppose you wanted a command that listed all the places you are logged in on a given cluster.

One way to do this would be to issue the command:

rwho | grep {your username}

Now suppose that instead you wanted to do this whenever you typed the command „findme“.  You would then create a file „findme“ containing the line above.  Before you can execute the shell script, you have to tell UNIX that the file findme is in fact a program and not just a text file.  You can do this by changing is mode to allow execute access:

chmod a+x findme

At this point, typeing „findme“ would perform those commands.  This could have been done using the alias feature instead, so what is so special about shell scripts?  Well, to start with, next time you log in, this command will still be there.  Further,  other people can use the new command you just defined (if they can access the file).
Shell scripts also can be much more complex (several pages for example.

—–
[] arguments

The next useful ability with shell scripts is arguments.  Suppose that you wanted to do the same as we did above, but you want to specify the user on the command line.  Lets call that command „findu“.  If I want to see where bcn is logged in I should be able to say „findu bcn“. Well, this is simple.  Instead of your username, you use the value „$1“.  $1 in a shell script expands to the value  of the first argument.  Similarly, $2 is the second argument, $3 the third and $0 is the name of the command itself.

So findu would look as follow:

rwho | grep $1

Note that arguments are used in the same manner that variables are used.

—
[] for, while do, if then else, and case

Like any other programming language, shell scripts allow various looping and selection constructs.  One of these is the „for“ statement.

It’s format is:

for variable in list_of_values
do
  statemtns
done

the list of variables can use *s to select file names.  If you leave out the in list_of values, the for statement will iterate through the arguments given to the shell.    

—
The form of the while do statement is:

while condition
do
  statements
done

This is like the while do statement in most programming languages, so I won’t go into details about it.

—
Then there is the if then else statement.
Its form is:

if condition
then
statements
[elif condition then]
statements
[else]
fi

The elif (else if) and the else statements are optional.  The if statements does just what you would expect.  If the condition is true, then it executes the then part.  If it is false, and if the is an elif, then it check that condition, and executes the then clase of it. If none of the conditions are ture, it executes the else clause.

 The last construct I will talk about is the case statement.  Its form is:

case $variable in

 v1) statement
  break;;
 v2)
  statement
  break;;
 *)

esac
There is also an until statement which is similar to the while statement.

———
[] test

So far, I have mentioned condition, but I haven’t mentioned how to specify conditions.  Conditions are really only the exit status of a program.  Hence, the way you specify a condition is to run a program which will return an error if a condition is face, and will return successfully if it is true.  This program is the test program.  I will very briefly describe the test command.  For more information you can say „man test“ when logged in.

Arguments for test are of the form N <primitive> M where N and M are variables or constants, and the promitive is

-eq, -ne, -gt, -lt, -ge, -le    for numbers
= and != for strings.

Alternatively you can say test -f filname to test for existance of a file, -s to check that the file isn’t empty.  -d checks if a file is a directory, -w if it is writable, and -r checks if it is readable. These aren’t all the options to test though. 

In many shell scripts, you may see square brackets around what looks like a test statement.  If square brackets are used, you don’t have to say test.  In other words,

[-f file] 

is equivilant to

test -f file

 
[] use of /tmp

When writing shell scripts, one will often need to use temporary files.  When doing so, a good place to sture these temporary file is in /tmp.  It is important that the temporary file you create has a different name than any file already in tmp.  To do this, you can use the shell variable $$ which translates into the current process number.  In fact, a good name to use is $0$$ which is the name of the current shell script followed by the process ID.  Ussing this name will prevent conflicts with other programs, or different invocations of the same program.

Another thing which is important is to have your shell script remove the file when it is done using it.  This way, /tmp does not fill up.
Files in /tmp in theory are deleted periodically, but the policy is different on different systems.  It never hurts to delete a temporary file that you no longer need.
———
[] interrupts

The trap command is useful for dealing with interrupts such as ^C or hanging up the phone line.   The form for the trap command is:

trap ‚command arguments‘ signal1 signal2

for example

trap ‚rm $tmp* ;exit‘ 2 1
———
[] exit

This brings us to the last command I want to describe.  The exit command.  The exit command alows one to exit a shell script.  Exit takes an argument, and returns that value.  A zero value usually indicated that the command has run successfuly, whereas a value of 1 usually indicates that an error has occured.

  • Unix Course: Introduction, Shell Commands – Lecture 1
  • Unix Course: The Shell, and Shell Programming – Lecture 2
  • Unix Course: More Shell Programming – Lecture 3
  • Unix Course: Unix Security – Lecture 4

My last day as a Fonero – bye FON, hello future

August 1, 2006 von Harald Puhl

Today is my last day as a Fonero, which is the way people registered in FON’s network are called (IMHO a rather ugly name). Why this decision? There are a number of reasons, and I have chosen to simply make a list.

  • The most important reason is that I have taken a position at a company that makes it unethical for me to continue participating in FON. I will no longer post on their forums; however, I will continue to post my thoughts about FON on my blog, and replying to Martin Varsavsky in his blog when I see it appropriate.
  • FON has been a downhill experience from day one. I ordered my “social” router, and got charged by PayPal, but no confirmation from the company, no tracking number, nothing. I emailed their support address, no reply. It eventually arrived, admitedly faster than the month or two some people were reporting on the forums. After a few futile attempts at configuring the router to work with my DSL line, and a couple of completely ignored emails to FON support, I simply gave up. The router is now waiting for a PCB to turn it into a WaRThog.
  • Every time I see a new crazy idea in Martin’s blog I feel more depressed about the FON project – does he really think WiFi is the way for homeless people to make a living, reselling VoIP services over Bluetooth? (don’t ask!). Where would he send them the money? Then there are the times when he takes a product and claims it was designed by FON, sometimes in secret collaboration with his backers Skype or Google. The latest is the Skype-compatible WiFi phone made by an Accton subsidiary – this is a design that Accton started way before FON even saw it, and way before Martin could have his logos photoshopped onto the mockups. As a matter of fact, out of the box this phone will not work at FON hostspots, as it lacks the browser required to perform user login – so they will have to work some magic.
  • The english and spanish forums are another source of disappointment, with daily posts from people complaining about the extremely poor support that FON is providing them. Some have even taken to posting comments on Martin’s blog to air their issues, something blogtiquette considers a no-no. I posted a few days ago about this particular issue.
  • They have followed an ill-conceived path to gaining publicity through bloggers, resulting in serious backslash from the spanish blogosphere (see here and here). Martin seems to think that by surrounding himself with top bloggers in exchange for dubious stock options or a seat in the board will get him a free ticket to stardom.
  • I believe that FON serves two purposes – one is to give a personal vehicle of shininess to Martin’s ego. See this post by Glenn Fleishman on FON’s crazy deal announcements, later called off as a lie by Speakeasy – typical example of how he manipulates a phone conversation into front-line news. Om Malik also reported on this particular issue. Martin is someone who cannot be seen as co-founding anything, but as a leader and innovator.
    Secondly, FON serves as an experiment for Skype and Google, who somehow convinced Index and Sequoia to go along. I don’t believe the two VC firms are into experiments, but FON would certainly provide good feedback to S & G about socializing WiFi, hardware distribution, and the adoption of the Bill model as a viable way to extend a WiFi network. Other stuff such as amount of logins at each location/router, number of registered users, daily passes sold, etc. would make nice colored graphs in the resulting corporate presentation.
    But, the problem is that FON is a huge fiasco in terms of hardware distribution, firmware development, public relations, and costumer support. I thus question the validity of any figures that come out of this rather expensive experiment.
  • Their firmware development process seems to be a closely guarded secret – but not for the same reasons Apple safeguards its own developments. FON started working with Brainslayer, the creator of DD-WRT, a free Linux distribution for Linksys (and other) routers. Apparently, Brainslayer was not very well treated by FON, and he parted to work in the Sputnik project, amongst other developments.
  • Just as Mark Evans did, I have voiced my concerns about FON’s business model and strategy – now that they finally launched the Bills, it looks more ill-fated than ever.

I find it really amazing how FON, with the $21.7 million they got in funding, cannot manage to hire a competent team of support personnel, outsource their obviously ill router redistribution system, and get some muscle behind the community effort. Martin Varsavsky is known in Spain for starting companies, pumping them up, and selling at the best possible gain – then leaving them behind with serious problems. Just look at what people think of Jazztel, or what troubles the Ya.com portal went through.

For me, the FON adventure is over, and a new, better adventure is starting. We will start disclosing things around the end of August, so if you want to stay updated, you are welcome to subscribe to the RSS feed.

My smelly trip from Romania, and why deodorants are more dangerous than lithium batteries (not!)

Juli 31, 2006 von Harald Puhl

Last week I had to go to Romania for a meeting with a team of coders, landing at Cluj-Napoca on Tuesday. Scheduled to return on Wednesday, I duly turned up at the airport by 08:00, joining the long line leading to the security checkpoint. Wait. A long line? We’re talking about an airport with a single runway, one transfer bus (you could actually walk the 50 yards to the plane, but hey, if they have it they might aswell put it to some use!), about a dozen flights a day, all of them small turboprops with a capacity for around 60 people – which usually fly half empty.

So, what was the reason for the holdup? An overzealous security guard, who stared at each bag on the x-ray monitor while squinting his eyes as if it would bring more detail to the picture. After the long radioactive scrutiny, he would open the bags, shout a few things to their owners, and sometimes pull things out of them. Dangerous stuff such as sticks of SEMTEX I though.

When my turn arrived, some forty minutes later, I was rather curious apart from annoyed at what was captivating this guard. I should have guessed. Romania must have a healthy black market for….spray deodorants. My tiny Nivea sample spray tin was also taken, with a bad boy stare from the guard.

According to international safety regulations, flammable sprays are not allowed on board aircraft (albeit agencies such as the TSA allow toiletries in small quantities), just as dangerous chemicals, explosives, live ammunition, and a whole bunch of other nasty stuff. This guy had the right to take away my little piece of odour-fighting equipment – but was it really necessary to do so? I had almost calmed down, fearing I would miss my connection at Vienna, when I noticed the also tiny duty-free shop, which looked recently refurbished. On a closer look, they were selling…yep, you guessed it – a truckload of flammable products, from large hair sprays ten times larger than my former deodorant, to cologne with a high alcohol content. I could have just bought one and carried on with my world domination plans just as well, but all I wanted was to get to Vienna.

This got me thinking about the recent hubbub about exploding Dell laptops, basically when their batteries vented with flame and smoke, as it is technically defined. Laptop batteries are made of lithium-cobalt, or more recently, lithium-manganese oxide. This type of chemistry is very efficient at holding charge, and making it available at high rates, without damage or aging to the battery. The drawback is that they are very dangerous. A lithium battery can explode violently, sending chemicals and debris out at high speed and causing a lot of damage. They can also vent with flame and smoke, as seen in Dell’s promotional footage. For a great explanation of battery technologies, visit the Battery University.

The TSA officially allows laptops and their batteries in both checked and cabin luggage, so do we have to worry? If you ever find yourself sitting next to a burning laptop on a flight, take this comforting thought with you: there is nothing on the plane that can put out a lithium chemical fire.

Happy flying!

A model of leader election in the Firewire protocol

Juli 25, 2006 von Harald Puhl

Adapted from:

[DG+01] M.C.A. Devillers, W.O.D. GriAEoen, J.M.T Romijn, and F.W. Vaandrager. Verification of a leader election protocol — formal methods applied to IEEE 1394. Technical Report CSI-R9728, Computing Science Institute, University of Nijmegen, December 1997. Also, Formal Methods in System Design, 2001.

This model describes a leader election protocol used in Firewire, an IEEEstandard for connecting consumer electronic devices. The model is a straightforward translation into Alloy of a model [DG+01] developed in Lynch’s IO Automata which has been analyzed using PVS, a theorem prover, but which, as far as we know, has not been subjected to fully automatic analysis. We are able to express the key correctness property — that exactly one leader is elected — more directly, as a trace property rather than a refinement property, and can check it without the need for the 15 invariants used in the more traditional proof. And the analysis does not hardwire a particular topology, so would be tricky to do with a standard model checker.

The network is assumed to consist of a collection of nodes connected by links. Each link between a pair of nodes is matched by a link in the other direction. Viewing a link and its dual as a single, undirected edge, the network as a whole is assumed to form a tree. The purpose of the algorithm is to construct such a tree; in the model, this is achieved by labelling some subset of the links as parent links (each pointing from a node to its parent), and by marking a single node as the root.

The algorithm, described in detail elsewhere [DG+01], works briefly as follows. When a node detects that all of its incoming links (or all but one) has been marked as a parent link, it sends a message on each outgoing link, either an acknowledgment (indicating its willingness to act as parent), or a request (indicating its desire to be a child), according to whether the dual of the outgoing link has been marked or not. Leaf nodes (with only one incoming link) may thus initiate the algorithm by sending requests to their adjacent nodes. Performing this action changes a node’s status from {\em waiting} to {\em active}. A node that is still waiting, and which receives a message on a link, may label that link a parent link. Once active, a node that receives an acknowledgment on a link may also label the link, but if it receives a request, instead changes its node status to {\em contending}. The resolving of contentions is modelled simplistically by a single action that arbitrarily
labels one of the two links a pair of contending nodes. Finally, a node all of whose incoming links are parent links designates itself a root.

The specification is given below. Each signature introduces a basic type and some relations whose first column has that type:

\begin{itemize}

\item {\em Msg} represents the type of messages. {\em Req} is the request message and {\em Ack} is the acknowledgment message; these are actually declared as singleton (keyword {\em static}) subsets of {\em Msg}, the set of all messages, that form a partition (keyword {\em part}).

\item {\em Node} represents the nodes of the network. The relations {\em to} and {\em from} associate each node with a set of incoming and outgoing links
respectively.

\item {\em Link} represents the links. The relations {\em target} and {\em source} map a link to its end nodes; {\em reverse} maps a link to its dual. The
facts in the signatures {\em Node} and {\em Link} ensure that all these relations are consistent with one another: that the incoming links of a node are those whose target is that node, etc.

\item {\em Op} introduces a set of names for the operations of the protocol. This is merely for convenience; it allows us to ask for an execution in which named operations occur, or example.

\item {\em State} represents the global states. Each state has a partition of the nodes into one of four statuses: {\em waiting} to participate, {\em active} (having sent messages on outgoing links), {\em contending} (having sent a request on a link and received a request on its dual), and {\em elected} (having designated itself as a root). A set of links are labelled as parent links. There is a message queue associated with each link. Finally, the state is associated with the operation that produced it.

\item {\em Queue} represents the message queues. Each queue has a slot that optionally contains a message; the relation {\em slot} is a partial function from queues to messages. In our first attempt at a model, we represented a queue as a sequence (a partial function from a prefix of the integers to messages), but having checked that no queue ever contained more than one message, we simplified the model. The {\em overflow} field is included just in case this was a mistake; a write to a queue that already contains a message puts an arbitrary value there, which is easily detected.

\end{itemize}

The {\em facts} record the assumptions about the topology. The one named {\em Topology} says that there is some partial function on nodes and some root such
that (1) every node is reachable from the root ({\tt *r} being the reflexive transitive closure of the relation {\tt r}); (2) there are no cycles (expressed by saying that the transitive closure has no intersection with the identity relation on nodes); and (3) the relation obtained by following the {\em source} relation backwards (from a node to the link for which it is a source), and then the {\em target} relation forwards (from the link to its target) is this relation, plus its transpose (so that each tree edge becomes two links). Although the quantifier appears to be higher-order, it will be skolemized away by the analyzer.

The {\em functions} of the model are parameterized formulas. The function {\em Trans} relates a pre-state {\tt s} to a post-state {\tt s‘}. It has a case for each operation. Look at the clause for the operation {\em WriteReqOrAck}, for example. If this operation is deemed to have occurred, each of the constraints in the curly braces must hold. The first says that the labelling of links as parent links is unchanged. The second constraint (the quantified formula) constrains with respect to the node at which the operation occurs. The subformulas, from first to last, say that the node belongs to the waiting set before and the active set afterwards; that there is at most one ({\em sole}) link that is incoming but not a parent link in the pre-state; that there are no changes to node status except at this node; that a message is queued onto each outgoing link; and that queues on all other links are unchanged.

An ‚invoked‘ function is simply short for the formula in its body with the formal arguments replaced by the actual expressions. {\em WriteQueue}, for example, says that if the queue’s slot is not filled in the pre-state, then the new queue in the post-state (given the local name {\tt q}) contains the message {\tt m} in its slot, and has no message in its overflow. Otherwise, some message is placed arbitrarily in the overflow, and the slot is unconstrained. In {\em WriteReqOrAck}, the arguments {\tt s} and {\tt s‘} are bound to the {\tt s} and {\tt s‘} of {\em Trans}; {\tt x} is bound to one of the outgoing links from the set {\tt n.from}; and {\tt msg} is bound either to the acknowledgment or request message.

The function {\em Execution} constrains the set of states. It makes use of a library module that defines a polymorphic ordering relation. The expression {\tt Ord[State]} gives an ordering on all states. The two formulas of the function say that {\tt Initialization} holds in the first state, and that any pair of adjacent states is related by {\tt Trans}. The function {\em NoRepeats} adds the constraints that there are no equivalent states in the trace, and that no stuttering occurs.

The three assertions are theorems for which the analyzer will search for counterexamples. They assert respectively that: in every state of the trace, there is at most one node that has been elected; that there is some state in which a node has been elected; and that no queue overflows.

The rest of the model is a collection of commands executed to find instances of the functions or counterexamples to the theorems. We started by presenting a variety of functions as a sanity check; here, only one is given, that asks for an execution involving 2 nodes, 4 links, 4 queues and a trace of 6 states. The standard semantics of these {\em scope} declarations in Alloy is that the numbers represent an upper bound, so an instance may involve fewer than 4 queues, for example. The ordering module (not shown here), however, for technical reasons, constrains the ordered set to match its scope, so a trace with fewer than 6 states will not be acceptable.

We then established some bounds on the diameter of the state machine for various topology bounds. For 2 nodes and 2 links, for example, there are no non-repeating traces of length 4; checking traces of length 3 is thus sufficient in this case. The number of queues was limited to 5, to accommodate the empty queue, a queue containing an {\tt Ack} or {\tt Req}, and each of these with overflow. For 3 nodes and 6 links, a trace length of 8 suffices.

We then checked that for these various topology bounds, the queues never overflow. Finally, we checked the correctness properties, taken advantage of the earlier results that justify the short traces and queues. We are thus able to verify the properties for all topologies involving the given number of nodes and links, without any assumptions about trace length, queue size or the particular topological structure.

*/

module firewire_leader_election
open models/ord

sig Msg {}
static part sig Req, Ack extends Msg {}

sig Node {to, from: set Link} {
 to = {x: Link | x.target = this}
 from = {x: Link | x.source = this}
 }

sig Link {target, source: Node, reverse: Link} {
 reverse::source = target
 reverse::target = source
 }

— at most one link between a pair of nodes in a given direction
fact {no disj x,y: Link | x.source = y.source && x.target = y.target}

— topology is tree-like: acyclic when viewed as an undirected graph
fact Topology {
some tree: Node ?-> Node, root: Node {
 Node in root.*tree
 no ^tree & iden [Node -> Node]
 tree + ~tree = ~Link$source.Link$target
 }
}

sig Op {}
static disj sig Init, AssignParent, ReadReqOrAck, Elect, WriteReqOrAck,
ResolveContention, Stutter extends Op {}

sig State {
 part waiting, active, contending, elected: set Node,
 parentLinks: set Link,
 queue: Link ->! Queue,
 op: Op — the operation that produced the state
 }

fun SameState (s, s‘: State) {
 s.waiting = s‘.waiting
 s.active = s‘.active
 s.contending = s‘.contending
 s.elected = s‘.elected
 s.parentLinks = s‘.parentLinks
 all x: Link | SameQueue (s.queue[x], s‘.queue[x])
 }

fun Trans (s, s‘: State) {
 s‘.op != Init
 s‘.op = Stutter => SameState (s, s‘)
 s‘.op = AssignParent => {
  some x: Link {
   x.target in s.waiting & s‘.waiting
   NoChangeExceptAt (s, s‘, x.target)
   ! IsEmptyQueue (s, x)
   s‘.parentLinks = s.parentLinks + x
   ReadQueue (s, s‘, x)
   }}
 s‘.op = ReadReqOrAck => {
  s‘.parentLinks = s.parentLinks
  some x: Link {
   x.target in s.(active + contending)
    & if PeekQueue (s, x, Ack) then s‘.contending else s‘.active
   NoChangeExceptAt (s, s‘, x.target)
   ! IsEmptyQueue (s, x)
   ReadQueue (s‘, s, x)
   }}
 s‘.op = Elect => {
  s‘.parentLinks = s.parentLinks
  some n: Node {
   n in s.active & s‘.elected
   NoChangeExceptAt (s, s‘, n)
   n.to in s.parentLinks
   QueuesUnchanged (s, s‘, Link)
   }}
 s‘.op = WriteReqOrAck => {
  — note how this requires access to child ptr
  s‘.parentLinks = s.parentLinks
  some n: Node {
   n in s.waiting & s‘.active
   sole n.to – s.parentLinks
   NoChangeExceptAt (s, s‘, n)
   all x: n.from |
    let msg = if x.reverse in s.parentLinks then Ack else Req |
     WriteQueue (s, s‘, x, msg)
   QueuesUnchanged (s, s‘, Link – n.from)
   }}
 s‘.op = ResolveContention => {
  some x: Link {
   let contenders = x.(source + target) {
    contenders in s.contending & s‘.active
    NoChangeExceptAt (s, s‘, contenders)
    }
   s‘.parentLinks = s.parentLinks + x
   }
  QueuesUnchanged (s, s‘, Link)
  }
}

fun NoChangeExceptAt (s, s‘: State, nodes: set Node) {
 let ns = Node – nodes {
 ns & s.waiting = ns & s‘.waiting
 ns & s.active = ns & s‘.active
 ns & s.contending = ns & s‘.contending
 ns & s.elected = ns & s‘.elected
 }}

sig Queue {slot: option Msg, overflow: option Msg}

fun SameQueue (q, q‘: Queue) {
  q.slot = q‘.slot && q.overflow = q‘.overflow
 }
 
fun ReadQueue (s, s‘: State, x: Link) {
— let q = s‘.queue[x] | no q.(slot + overflow)
 no s‘.queue[x].(slot + overflow)
 all x‘ != x | s‘.queue[x‘] = s.queue[x‘]
 }

fun PeekQueue (s: State, x: Link, m: Msg) {
 m = s.queue[x].slot
 }

fun WriteQueue (s, s‘: State, x: Link, m: Msg) {
        let q = s‘.queue[x] |
 no s.queue[x].slot =>
  ( q.slot = m && no q.overflow),
  some q.overflow
 }

fun QueuesUnchanged (s, s‘: State, xs: set Link) { 
 all x: xs | s‘.queue[x] = s.queue[x]
 }

fun IsEmptyQueue (s: State, x: Link) {
 no s.queue[x].(slot + overflow)
— let q = s.queue[x] | no q.(slot + overflow)
 }
 
fun Initialization (s: State) {
 s.op = Init
 Node in s.waiting
 no s.parentLinks
 all x: Link | IsEmptyQueue (s, x)
 }

fun Execution () {
 Initialization (Ord[State].first)
 all s: State – Ord[State].last | let s‘ = OrdNext(s) | Trans (s, s‘)
 }

fun NoRepeats () {
 Execution ()
 no disj s, s‘: State | SameState (s, s‘)
 no s: State | s.op = Stutter
 }

fun NoShortCuts () {
 all s: State | — remove this to speed up analysis – Ord[State].last – OrdPrev (Ord[State].last) |
  ! Trans (s, OrdNext(OrdNext(s)))
 }

assert AtMostOneElected {
 Execution () => all s: State | sole s.elected
 }

assert OneEventuallyElected {
 Execution () => some s: State | some s.elected
 }

assert NoOverflow {
 Execution () => all s: State, x: Link | no s.queue[x].overflow
 }

run Execution for 1 Ord[State],  7 Op, 2 Msg,
 2 Node, 4 Link, 4 Queue, 6 State

— solution for 3 State but not for 4 State
run NoRepeats for 1 Ord[State],  6 Op, 2 Msg,
 2 Node, 2 Link, 2 Queue, 4 State

— solution for 8 but not 9 State
run NoRepeats for 1 Ord[State],  6 Op, 2 Msg,
 3 Node, 6 Link, 6 Queue, 9 State

— only 5 queues needed: just count
— no solution: establishes at most 3 queues needed
check NoOverflow for 1 Ord[State],  6 Op, 2 Msg,
 3 Node, 6 Link, 5 Queue, 9 State

check AtMostOneElected for 1 Ord[State],  6 Op, 2 Msg,
 3 Node, 6 Link, 3 Queue, 9 State

check OneEventuallyElected for 1 Ord[State],  6 Op, 2 Msg,
 3 Node, 6 Link, 3 Queue, 9 State

OpenOffice – no go on Mac OS X

Juli 24, 2006 von Harald Puhl

Today I received an email with some technical specs I was supposed to review, but the document came in OpenOffice Write format (.odt), and since on my MacBook I only had Office installed, there was no way to open it.

Checking the OpenOffice.org site, it appeared a version was available for OS X, but in the traditional open source way, I was met with thinks like:

“en-US builds for Intel based Macs will be listed here as soon as they passed QA. In the meantime please” (The phrase really ends like this, I am quoting vervatim!)

…please…what? What am I supposed to do in the meantime? Ask the guy who sent me the document to re-send it in Word format? Oh, wait, here is the solution:

“The builds use X11 and are meant for the user who doesn’t care that much about look but functionality and cross plattform integration and usability. Other prospects are the Darwin community and the Unix-savvy MacOS X user community and forming a platform for us to build the Quartz and Aqua tracks for the traditional Mac user.”

I thought Intel Macs had only been around for a few months, so how can there be a tradition? Last, but not least, the list of mirrors for the english version were empty. No problem for German or French users, so congrats to you, lucky people! The fact it was empty explained the “in the meantime” statement.

What is this rant all about? The discussion I had the other day with a diehard opensource defender – the type that scream “Linux will conquer the desktop next year, really, this time” any chance they get. I think it is really great that people are willing to donate their time to contribute to opensource projects, some as large as Linux or OpenOffice, but they have to think in terms of reality, not utopia. To think Linux will take over Windows on the desktop, or that OpenOffice will replace Office, at least in the short or medium term, is wishful thinking.

I expect to be beaten to death by the diehard Linux fans, but there is no way my mother would know how to “vi your X86 configuration file to change the video adapter so that it works”. Until Linux or OpenOffice offer similar experiences than Windows or Office, there will stay in niche or very specific target groups. Companies are migrating to these operating systems and office suites, yes, but they usually have the resources to implement the transition, both from technical and training standpoints.

So, good luck with the project, I honestly wish it every success, and I am sorry that I am not a competent UNIX programmer so I can contribute. But from a user’s perspective, it has some way to go.

  • « Vorherige Seite aufrufen
  • Seite 1
  • Weggelassene Zwischenseiten …
  • Seite 66
  • Seite 67
  • Seite 68
  • Seite 69
  • Seite 70
  • Weggelassene Zwischenseiten …
  • Seite 72
  • Nächste Seite aufrufen »

Seitenspalte

Tags

3D-Drucker Amazon AOL Apple asus memo pad Blackberry Dell DSL E-Book E-Book-Reader Ebay Elster Facebook Google Google Android Handy Hardware Hotmail IBM Internet Makerbot Microsoft mobiles Internet Netbook Prism Quantencomputer Rundfunkbeitrag Samsung samsung galaxy fame Samsung Galaxy Mega Samsung Galaxy Tab SchülerVZ Skype Smartphone Software sony xperia tablet z Suchmaschine Tablet Tintenpatronen Twitter Typo3 WebOS WhatsApp Xing Yahoo

Technik News Kategorien

Ausgewählte Artikel

LTE tilgt weiße Flecken und drückt aufs Tempo

LTE steht für Long Term Evolution und zugleich für den Vorstoß des mobilen Internets in die erste Liga der Breitband-Internetverbindungen. [...]. Heutige Angebote für mobiles Internet bringen 3,6 oder gar 7,2 MB/sec. Der Zugang erfolgt dabei meistens über einen Internet Stick der dank USB-Schnittstelle sowohl an einem Laptop wie auch am Desktop-Computer verwendet werden kann.


Externe Festplatte mit 3,5 Zoll, 2,5 Zoll oder 1,8 Zoll

Angeschlossen wird die externe Festplatte über USB, Firewire, eSATA oder einen Netzwerk-Anschluss. Vorsicht: Bei manch einer externen Festplatte stört ein lärmender Lüfter. Die kleineren Notebook-Festplatten sind 2,5-Zoll groß. Eine externe Festplatte mit 2,5-Zoll nimmt in den meisten Fällen über den USB-Anschluss Kontakt zum Computer auf und wird über dasselbe Kabel auch gleich mit Strom versorgt.

Inhaltsverzeichnis | Impressum und Datenschutzerklärung