Writes books (all the time), makes YouTube (sometimes) and plays games (sometimes)
396 stories
·
1 follower

A Parts Bin Cyberdeck Built for Satellite Hacking

1 Share

While there’s little in the way of hard rules dictating what constitutes a cyberdeck, one popular opinion is that it should be a piecemeal affair — a custom rig built up of whatever high-tech detritus the intrepid hacker can get their hands on, whether it be through trades or the time-honored tradition of dumpster diving. It should also be functional, and ideally, capable of some feats which would be difficult to accomplish with a garden variety laptop.

If you’re looking for an example that embraces these concepts to the fullest, look no further than the Spacedeck built by [saveitforparts]. Combining a touch screen all-in-one computer pulled from a police cruiser in the early 2000s, an RTL-SDR, and the contents of several parts bins, the rig is designed to work in conjunction with his growing collection of motorized satellite dishes to sniff out signals from space.

As you can see in the build video below, the design for this mobile satellite hacking station was originally very different, featuring considerably more modern hardware with all the buzzword interfaces and protocols you’d expect. But [saveitforparts] couldn’t get all the parts talking satisfactorily, so he went in the closet and dug out one of the surplus police terminals he’d picked up a while back.

He didn’t have the appropriate connector to power the machine up, but by cracking open the case and tracing out the wires, he figured out where he needed to inject the 12 V to get it spun up. From there he installed a new Mini PCI WiFi adapter, loaded up an era-appropriate build of Linux, and got the standard software-defined radio tools up and running.

What really sets this build apart are the two custom panels. The top one offers access to the various ports on the computer, as well as provides a sort of switchboard that connects the RTL-SDR to various onboard filters. The lower panel includes the hardware and controls necessary to aim different styles of motorized satellite dishes, as well as a USB hub and connector that leads into a commercial satellite meter tucked into the case.

At the end of the video [saveitforparts] demonstrates the various capabilities of the Spacedeck, such as the ability to pull in imagery from weather satellites. Considering the sort of satellite sniffing we’ve seen him pull off in the past, we have no doubt this machine is going to be listening in on some interesting transmissions before too long.

Read the whole story
hexdsl
399 days ago
reply
/home/hexdsl
Share this story
Delete

Tiny-C Compiler (2001)

1 Share
#include #include /* * This is a compiler for the Tiny-C language. Tiny-C is a * considerably stripped down version of C and it is meant as a * pedagogical tool for learning about compilers. The integer global * variables "a" to "z" are predefined and initialized to zero, and it * is not possible to declare new variables. The compiler reads the * program from standard input and prints out the value of the * variables that are not zero. The grammar of Tiny-C in EBNF is: * * ::= * ::= "if" | * "if" "else" | * "while" | * "do" "while" ";" | * "{" { } "}" | * ";" | * ";" * ::= "(" ")" * ::= | "=" * ::= | "" * ::= | "+" | "-" * ::= | | * ::= "a" | "b" | "c" | "d" | ... | "z" * ::= * * Here are a few invocations of the compiler: * * % echo "a=b=c=23;" | ./a.out * a = 1 * b = 1 * c = 1 * % echo "{ i=1; while (i100) i=i+i; }" | ./a.out * i = 128 * % echo "{ i=125; j=100; while (i-j) if (i= '9') { int_val = 0; /* missing overflow check */ while (ch >= '0' && ch = '9') { int_val = int_val*10 + (ch - '0'); next_ch(); } sym = INT; } else if (ch >= 'a' && ch = 'z') { int i = 0; /* missing overflow check */ while ((ch >= 'a' && ch = 'z') || ch == '_') { id_name[i++] = ch; next_ch(); } id_name[i] = '\0'; sym = 0; while (words[sym] != NULL && strcmp(words[sym], id_name) != 0) sym++; if (words[sym] == NULL) if (id_name[1] == '\0') sym = ID; else syntax_error(); } else syntax_error(); } } /*---------------------------------------------------------------------------*/ /* Parser. */ enum { VAR, CST, ADD, SUB, LT, SET, IF1, IF2, WHILE, DO, EMPTY, SEQ, EXPR, PROG }; struct node { int kind; struct node *o1, *o2, *o3; int val; }; typedef struct node node; node *new_node(int k) { node *x = (node*)malloc(sizeof(node)); x->kind = k; return x; } node *paren_expr(); /* forward declaration */ node *term() /* ::= | | */ { node *x; if (sym == ID) { x=new_node(VAR); x->val=id_name[0]-'a'; next_sym(); } else if (sym == INT) { x=new_node(CST); x->val=int_val; next_sym(); } else x = paren_expr(); return x; } node *sum() /* ::= | "+" | "-" */ { node *t, *x = term(); while (sym == PLUS || sym == MINUS) { t=x; x=new_node(sym==PLUS?ADD:SUB); next_sym(); x->o1=t; x->o2=term(); } return x; } node *test() /* ::= | "" */ { node *t, *x = sum(); if (sym == LESS) { t=x; x=new_node(LT); next_sym(); x->o1=t; x->o2=sum(); } return x; } node *expr() /* ::= | "=" */ { node *t, *x; if (sym != ID) return test(); x = test(); if (x->kind == VAR && sym == EQUAL) { t=x; x=new_node(SET); next_sym(); x->o1=t; x->o2=expr(); } return x; } node *paren_expr() /* ::= "(" ")" */ { node *x; if (sym == LPAR) next_sym(); else syntax_error(); x = expr(); if (sym == RPAR) next_sym(); else syntax_error(); return x; } node *statement() { node *t, *x; if (sym == IF_SYM) /* "if" */ { x = new_node(IF1); next_sym(); x->o1 = paren_expr(); x->o2 = statement(); if (sym == ELSE_SYM) /* ... "else" */ { x->kind = IF2; next_sym(); x->o3 = statement(); } } else if (sym == WHILE_SYM) /* "while" */ { x = new_node(WHILE); next_sym(); x->o1 = paren_expr(); x->o2 = statement(); } else if (sym == DO_SYM) /* "do" "while" ";" */ { x = new_node(DO); next_sym(); x->o1 = statement(); if (sym == WHILE_SYM) next_sym(); else syntax_error(); x->o2 = paren_expr(); if (sym == SEMI) next_sym(); else syntax_error(); } else if (sym == SEMI) /* ";" */ { x = new_node(EMPTY); next_sym(); } else if (sym == LBRA) /* "{" { } "}" */ { x = new_node(EMPTY); next_sym(); while (sym != RBRA) { t=x; x=new_node(SEQ); x->o1=t; x->o2=statement(); } next_sym(); } else /* ";" */ { x = new_node(EXPR); x->o1 = expr(); if (sym == SEMI) next_sym(); else syntax_error(); } return x; } node *program() /* ::= */ { node *x = new_node(PROG); next_sym(); x->o1 = statement(); if (sym != EOI) syntax_error(); return x; } /*---------------------------------------------------------------------------*/ /* Code generator. */ enum { IFETCH, ISTORE, IPUSH, IPOP, IADD, ISUB, ILT, JZ, JNZ, JMP, HALT }; typedef char code; code object[1000], *here = object; void g(code c) { *here++ = c; } /* missing overflow check */ code *hole() { return here++; } void fix(code *src, code *dst) { *src = dst-src; } /* missing overflow check */ void c(node *x) { code *p1, *p2; switch (x->kind) { case VAR : g(IFETCH); g(x->val); break; case CST : g(IPUSH); g(x->val); break; case ADD : c(x->o1); c(x->o2); g(IADD); break; case SUB : c(x->o1); c(x->o2); g(ISUB); break; case LT : c(x->o1); c(x->o2); g(ILT); break; case SET : c(x->o2); g(ISTORE); g(x->o1->val); break; case IF1 : c(x->o1); g(JZ); p1=hole(); c(x->o2); fix(p1,here); break; case IF2 : c(x->o1); g(JZ); p1=hole(); c(x->o2); g(JMP); p2=hole(); fix(p1,here); c(x->o3); fix(p2,here); break; case WHILE: p1=here; c(x->o1); g(JZ); p2=hole(); c(x->o2); g(JMP); fix(hole(),p1); fix(p2,here); break; case DO : p1=here; c(x->o1); c(x->o2); g(JNZ); fix(hole(),p1); break; case EMPTY: break; case SEQ : c(x->o1); c(x->o2); break; case EXPR : c(x->o1); g(IPOP); break; case PROG : c(x->o1); g(HALT); break; } } /*---------------------------------------------------------------------------*/ /* Virtual machine. */ int globals[26]; void run() { int stack[1000], *sp = stack; code *pc = object; again: switch (*pc++) { case IFETCH: *sp++ = globals[*pc++]; goto again; case ISTORE: globals[*pc++] = sp[-1]; goto again; case IPUSH : *sp++ = *pc++; goto again; case IPOP : --sp; goto again; case IADD : sp[-2] = sp[-2] + sp[-1]; --sp; goto again; case ISUB : sp[-2] = sp[-2] - sp[-1]; --sp; goto again; case ILT : sp[-2] = sp[-2] sp[-1]; --sp; goto again; case JMP : pc += *pc; goto again; case JZ : if (*--sp == 0) pc += *pc; else pc++; goto again; case JNZ : if (*--sp != 0) pc += *pc; else pc++; goto again; } } /*---------------------------------------------------------------------------*/ /* Main program. */ int main() { int i; c(program()); for (i=0; i26; i++) globals[i] = 0; run(); for (i=0; i26; i++) if (globals[i] != 0) printf("%c = %d\n", 'a'+i, globals[i]); return 0; }

Adblock test (Why?)

Read the whole story
hexdsl
399 days ago
reply
/home/hexdsl
Share this story
Delete

An end to typographic widows on the web

1 Share

Another value in the specification is text-wrap:pretty. If it’s ever implemented, this might – as an outcome – reduce widows and orphans in running text. For decades there have been sophisticated algorithms for wrapping text across multiple lines. For performance purposes, browsers use the most basic approach, the so-called first-fit/greedy algorithm, which takes one line at a time, wrapping if it’s too long, and moving on to the next. In typographers’ eyes this gives sub-optimal results, and is one of the reasons text justification is so awful on the web.

Better algorithms, such as Knuth-Plass, take into account entire paragraphs and achieve a more nuanced approach to text wrapping by reducing and increasing spacing between words. The spec says that as optimal results often take more time, pretty is offered as an opt-in to take more time for better results. The pretty value is intended for body text, where the last line is expected to be a bit shorter than the average line. [… The browser] should bias for better layout over speed, and is expected to consider multiple lines, when making break decisions.

Algorithms such as Knuth-Plass won’t necessarily eliminate widows and orphans, but might go some way to doing so. The reluctance to using such approaches is understandable, however, as they can be extremely demanding: the processing requirements increase quadratically with the paragraph length. That said, a value such as pretty gives the option to choose different text wrapping procedures depending on conditions (resident processing power, length of text, etc). Once day perhaps. Meanwhile I’d settle for direct control over widows and orphans in text blocks.

Adblock test (Why?)

Read the whole story
hexdsl
399 days ago
reply
/home/hexdsl
Share this story
Delete

Fans are already modding the Resident Evil 4 Remake demo

1 Share

The demo has only been out for a few days, but the talented modding community is already putting its skills to work and switching up Capcom's Resident Evil 4 remake.

Having played the demo in its standard form, I headed over to Nexus mods to see what was what. And I was not disappointed.

First up, we have the "Banana gun and spoon knife" mod uploaded by Stevebg23. This chap does exactly what it says on the tin - it replaces the Standard Handgun and the Survival Knife with a banana and a spoon.

Read more

Read the whole story
hexdsl
399 days ago
reply
/home/hexdsl
Share this story
Delete

Everything Everywhere All At Once, and the Gen X Oscars

2 Shares
John Scalzi

One, I’m delighted that it won, it was my favorite film of the last year, and more widely, it was the most “this story could only be done as a movie” movie of 2022, so a win at the awards that are meant to celebrate the singular nature of the medium is pretty great. And I’m especially delighted by Michelle Yeoh’s Best Actress win. She has been terrific in so many things for so long.

Two, I’m also delighted that we’re in a place in the multiverse where a film like this – indie, genre, Asian, immigrant and queer – could win. Not too long ago, this film would have nailed the Film Independent Spirit Awards (and, in fact, did), but would have been kept to a couple categories (mostly technical) at the Oscars at best. Here in 2023, a film like this wins seven Oscars, including three acting categories. Good job, multiverse!

Three, by being its own weird and authentic self, this film stands as a rebuttal to the wave of racist, nativist and homophobic hate that’s sweeping this country, packaged as politics. As Ke Huy Quan suggested as he picked up his own Oscar, after having been away from acting for 20 years, this is the American Dream. It’s a far better American Dream than the one so many right-wing politicians and professional propogandists are trying to shove the country toward, in their own fear and hate and ambition.

Four, hey, Academy, give James Hong an honorary Oscar next year, okay?

Beyond but including EEAAO, this felt like a real Gen X Oscar night: Quan, Michelle Yeoh, Jamie Lee Curtis and of course Brendan Fraser are either part of or icons beloved by that generation. This is not to take away from the Millennial-ness of Daniels (who won screenwriting, directing and producing awards, damn), but the night was infused by the pasts of these actors in particular, who Gen X grew up seeing in The Goonies and Encino Man, and in Indiana Jones and slasher films, and in Hong Kong action films that felt like secret knowledge until, suddenly, they weren’t. There was also the fact that these actors were all ignored, minimized or underestimated for large portions of their career, which, well. Feels pretty Gen X, too. I did not expect this collection of actors to ever hoist their Oscars in triumph, much less on a single night. It’s, again, delightful. I’m glad to have been able to see it.

(Edited to add: Oh! And! Sarah Polley! Screenwriting award! GenXer! Who also did a stint as an actress in formative Gen X films and came back on the other side of the camera! Hooray!)

The only miss for me on Oscar night this year is that my pal Pamela Ribon did not get the statuette for her terrific animated film My Year of Dicks. But you know what? She was in the room, and appreciated and celebrated all the way into that room. As someone who was nominated for a major industry award several times before getting to go up on the stage to hoist it and thank people, I can tell you being in the room is a win in itself. I’m pretty confident she will be back. I will cheer for her again when that happens.

— JS

Read the whole story
hexdsl
399 days ago
reply
/home/hexdsl
Share this story
Delete

Steampunk survival game Volcanoids has been invaded by drones

1 Share
I think it might be seriously time to play a whole lot more Volcanoids, with the new Ground Support update adding in special drones you can build and it looks awesome.
Read the whole story
hexdsl
399 days ago
reply
/home/hexdsl
Share this story
Delete
Next Page of Stories