Ken Thompson gave a pretty famous speech called "Reflections about Trusting Trust" that explained how one could use compilers to spread infection to new applications. It was a pretty radical idea at the time.
It's a little different from standard virus infection, but the techique could be easily modified. Here's a short description of the technique, and here's the full text of the speech (with slides).
Well, look at it this way: if your background traffic is random noise, and your "signal" cannot be differentiated from random noise, one must question what kind of signal actually is present.
It's really, really hard to mask a legitimate messages in random noise and hope that the bad guy won't be able to differentiate the two.
Re:Nope: You've just given the bad guy your key.
on
Optical Cryptography
·
· Score: 2, Insightful
This is called traffic masking, and is a useful, known tool. However, it can also be viewed as security through obscurity, typically a bad thing. (tm)
Actually, I think this is not at all true. Wired's quality has degraded so much in the last few years, it's almost pointless to spend any time there. On the other hand, while not all articles on/. are amazingly good, the vast majority are interesting and keep my attention.
If however, there's something on Wired (or any other news site) that's interesting, why not discuss it here?/. offers a unique forum and audience for discussion of topics that interest us all.
The problem is that the number of possible chess positions is on the order of 10^40 -- the branching factor for a decision tree is around 36, I believe. This means that for anything but the most trivial games, storing the full decision tree in memory is not possible with today's technology. Even if you put the problem in a vastly distributed network -- that 10^40 is really big.
This is why typical algorithms used in chess include limited frontier search -- you want to reduce the number of states you consider by use of a heuristic function. This function is informed by the pieces involved in the game, the positions of those pieces, etc.
*Please*, don't go to a school that thinks a CS degree means you can program, in any language, whetehr it's VB,C,C++,Java, etc. Computer Science is not about programming -- as has been reiterated above. It's about understanding the core principles and paradigms of algorithms, theory of computation, operating systems, and language. It's about networks and about compilers, not about code. Computer Scientists are linguists, operations researchers, mathetmaticians, and prophets. They are not primarily coders. Don't confuse computer science with computer programming!
Well, the internal IP stack won't change unless it was embedded in the modem (which I kind of doubt.) However, perhaps ethernet is better supported by the underlying WinCE?
On your #2 though, if you're not doing NAT, your dreamcast would be a targetable host though. Sure, it would be going through your [cable/dsl] modem, but that's just effectively a router.
Typical ADSL installations that use PPP utilize PPPoe (PPP over Ethernet) which is listed as being supported. They also say that they *do* support DHCP. Now, all I need is for them to make this baby wireless, and I can connect it up to the rest of my 802.11 network! =)
This isn't quite accurate. There are two flavors of 802.11 -- Frequency Hopping and Direct Sequence. I believe the author specified 802.11b which is the Direct Sequence flavor used by Lucent's WaveLAN and the Airport. (I may be wrong about which letter is which.) Frequency hopping equipment will indeed cause interference with the direct sequence equipment, since it's hopping through the ranges used for direct sequence pretty frequently. In the lab we've seen about 30% packet loss on WaveLAN when streaming full speed over 802.11a using the Raytheon 802.11 chipset used in WebGear Aviators. The Aviators seem to be pretty resilient though, and aren't affected significantly the other way.
Try dropping the middle of an MPEG frame on the wire... try running a network level adaptation on the protocol. You can't, not without serious horsepower in the middle. If you'd like to be able to handle network congestion control and adaptation at the router level, MPEG is less than optimal.
This is a good solution -- as any networks student can tell you. But, with the goal of any movie, anywhere, anytime, multicast isn't necessarily the right answer. Say I want to see Episode 23 of X-Files at 2:13 am -- there may be someone else who wants a similiar offering, but I'll wager that there will be fairly few. Now -- maybe a combination of unicast and multicast would be interesting. But then you also need to talk about network congestion, and security, etc.... Not to mention codecs. Will mpeg-2 be the future of streaming video? Probably not -- Microsoft ASF? Wavelet based encoding? It's a very interesting research area.
if by "buying hardware" and "doing weird stuff" you mean you have to have a TRG SuperPilot board and a custom bootloader, then sure... it'd be nice to have a Pilot with memory flashable by the user. I agree wholeheartedly. uCLinux makes a nice jumping off point for small embedded systems.
Linux on the PalmPilot's been done. Check out http://www.uclinux.org. That's Kenneth Albanowski and Jeff Dionne's group. They've got some cool stuff, in addition to the PalmPilot work, they've got a version of linux that runs on a processor and chipset the size of a SIMM stick. Check it out!
There is a separate Indication of Interest part of the website for letter holders, that has already opened. The general Indication of Interest has *not* yet opened. So if you received a letter, you can access the password/email address protected part of the IPO site.
Actually, E*trade does check (purportedly) against the invitee list. When I submitted my interest, it asked me for the email account address that the invitation was sent to, and said that fraudulent attempts to sign up would be blacklisted. This does make it sound more like an invitation than a public announcement.
Right -- cuz there's no way I want a 16 GB removable media on my computer! Sheeit. I'm more than happy with 750Mb CDs -- oh, and yeah, why bother watching DVD's on my 1600x1200 monitor when I can get 320 whole scan lines on my low res tv. (Or alternatively, I can spend several thou and get an HDTV...hmmm let me think....)
/* I noticed shuffle isn't hooked in yet. Here's a quick fix to enable shuffle. It's not an ideal fix, but it'll work until we see another release! My apologies if the formatting gets screwed up. */
Wait a sec...The ACM is a professional organization. They offer really great services, including reduced fees to conferences, SIG memberships, etc. The prices they charge are very reasonable for the services they offer. I'm a member of SIGOPS, and SIGLINK, and SIGART -- I receive valuable publications, as well as being allowed to access their full text archives. Just because they charge a reasonable fee to allow access to their archives, they don't "suck dick."
Should a professional organization like the ACM provide free access to their archives? Why?
If you read the actual commentary in the congressional record, the point of the copyright extension was to make our copyright protection laws consistent with European laws.
Will targeting the U.S. alone actually make a difference? Otherwise, Open Source Book projects still won't be able to legally export their texts outside the U.S.
The presentation is here.
/.'ed, there's a cached copy of the HTML of the paper itself available here.
Since the site is
It's a little different from standard virus infection, but the techique could be easily modified. Here's a short description of the technique, and here's the full text of the speech (with slides).
Well, look at it this way: if your background traffic is random noise, and your "signal" cannot be differentiated from random noise, one must question what kind of signal actually is present.
It's really, really hard to mask a legitimate messages in random noise and hope that the bad guy won't be able to differentiate the two.
This is called traffic masking, and is a useful, known tool. However, it can also be viewed as security through obscurity, typically a bad thing. (tm)
Actually, I think this is not at all true. Wired's quality has degraded so much in the last few years, it's almost pointless to spend any time there. On the other hand, while not all articles on /. are amazingly good, the vast majority are interesting and keep my attention.
/. offers a unique forum and audience for discussion of topics that interest us all.
If however, there's something on Wired (or any other news site) that's interesting, why not discuss it here?
The problem is that the number of possible chess positions is on the order of 10^40 -- the branching factor for a decision tree is around 36, I believe. This means that for anything but the most trivial games, storing the full decision tree in memory is not possible with today's technology. Even if you put the problem in a vastly distributed network -- that 10^40 is really big.
This is why typical algorithms used in chess include limited frontier search -- you want to reduce the number of states you consider by use of a heuristic function. This function is informed by the pieces involved in the game, the positions of those pieces, etc.
*Please*, don't go to a school that thinks a CS degree means you can program, in any language, whetehr it's VB,C,C++,Java, etc. Computer Science is not about programming -- as has been reiterated above. It's about understanding the core principles and paradigms of algorithms, theory of computation, operating systems, and language. It's about networks and about compilers, not about code. Computer Scientists are linguists, operations researchers, mathetmaticians, and prophets. They are not primarily coders. Don't confuse computer science with computer programming!
Well, the internal IP stack won't change unless it was embedded in the modem (which I kind of doubt.) However, perhaps ethernet is better supported by the underlying WinCE?
On your #2 though, if you're not doing NAT, your dreamcast would be a targetable host though. Sure, it would be going through your [cable/dsl] modem, but that's just effectively a router.
Typical ADSL installations that use PPP utilize PPPoe (PPP over Ethernet) which is listed as being supported. They also say that they *do* support DHCP. Now, all I need is for them to make this baby wireless, and I can connect it up to the rest of my 802.11 network! =)
This isn't quite accurate. There are two flavors of 802.11 -- Frequency Hopping and Direct Sequence. I believe the author specified 802.11b which is the Direct Sequence flavor used by Lucent's WaveLAN and the Airport. (I may be wrong about which letter is which.) Frequency hopping equipment will indeed cause interference with the direct sequence equipment, since it's hopping through the ranges used for direct sequence pretty frequently. In the lab we've seen about 30% packet loss on WaveLAN when streaming full speed over 802.11a using the Raytheon 802.11 chipset used in WebGear Aviators. The Aviators seem to be pretty resilient though, and aren't affected significantly the other way.
Try dropping the middle of an MPEG frame on the wire... try running a network level adaptation on the protocol. You can't, not without serious horsepower in the middle. If you'd like to be able to handle network congestion control and adaptation at the router level, MPEG is less than optimal.
This is a good solution -- as any networks student can tell you. But, with the goal of any movie, anywhere, anytime, multicast isn't necessarily the right answer. Say I want to see Episode 23 of X-Files at 2:13 am -- there may be someone else who wants a similiar offering, but I'll wager that there will be fairly few. Now -- maybe a combination of unicast and multicast would be interesting. But then you also need to talk about network congestion, and security, etc.... Not to mention codecs. Will mpeg-2 be the future of streaming video? Probably not -- Microsoft ASF? Wavelet based encoding? It's a very interesting research area.
I guess this forces us to ask if the beads be multi-threaded?
*duck*
if by "buying hardware" and "doing weird stuff" you mean you have to have a TRG SuperPilot board and a custom bootloader, then sure... it'd be nice to have a Pilot with memory flashable by the user. I agree wholeheartedly. uCLinux makes a nice jumping off point for small embedded systems.
Linux on the PalmPilot's been done. Check out http://www.uclinux.org. That's Kenneth Albanowski and Jeff Dionne's group. They've got some cool stuff, in addition to the PalmPilot work, they've got a version of linux that runs on a processor and chipset the size of a SIMM stick. Check it out!
Not to flame, but isn't it w-i-e-r-d? You know, "i before e" and all that.
There is a separate Indication of Interest part of the website for letter holders, that has already opened. The general Indication of Interest has *not* yet opened. So if you received a letter, you can access the password/email address protected part of the IPO site.
Actually, E*trade does check (purportedly) against the invitee list. When I submitted my interest, it asked me for the email account address that the invitation was sent to, and said that fraudulent attempts to sign up would be blacklisted. This does make it sound more like an invitation than a public announcement.
Right -- cuz there's no way I want a 16 GB removable media on my computer! Sheeit. I'm more than happy with 750Mb CDs -- oh, and yeah, why bother watching DVD's on my 1600x1200 monitor when I can get 320 whole scan lines on my low res tv. (Or alternatively, I can spend several thou and get an HDTV...hmmm let me think....)
=)
/*
r op)) o n);
) ;
" ))
r eamp,cfg.equalizer_bands);
o n);
y ->length/60000,(entry->length/1000)%60);
l ength()); s t,node)+1,entry->filename);
e rOfEntries")) 1 ]=='\n') e )-1]=='\n') line[strlen(line)-1]='\0';
i st_sort_by_title_cmpfunc);
i st_sort_by_filename_cmpfunc);
i st_sort_by_path_cmpfunc);
I noticed shuffle isn't hooked in yet. Here's a quick fix to enable shuffle. It's not an ideal fix, but it'll work until we see another release!
My apologies if the formatting gets screwed up.
*/
//playlist.c
#include "x11amp.h"
GList *playlist=NULL;
GList *playlist_position;
void playlist_clear(void)
{
GList *node;
PlaylistEntry *entry;
if(playlist)
{
if(get_input_playing()) input_stop();
node=playlist;
while(node)
{
entry=(PlaylistEntry *)node->data;
if(entry->filename) g_free(entry->filename);
if(entry->title) g_free(entry->title);
node=node->next;
}
g_list_free(playlist);
playlist=NULL;
playlist_position=NULL;
}
}
void playlist_delete(gboolean crop)
{
gboolean restart_playing=FALSE,set_info_text=FALSE;
GList *node=playlist,*next;
PlaylistEntry *entry;
while(node)
{
entry=(PlaylistEntry *)node->data;
next=g_list_next(node);
if((entry->selected&&!crop)||(!entry->selected&&c
{
if(playlist_position==node)
{
set_info_text=TRUE;
if(get_input_playing())
{
input_stop();
restart_playing=TRUE;
}
if(g_list_next(playlist_position))
playlist_position=g_list_next(playlist_position);
else if(g_list_previous(playlist_position))
playlist_position=g_list_previous(playlist_positi
else if(node!=playlist)
playlist_position=playlist;
else
playlist_position=NULL;
}
if(entry->filename)
g_free(entry->filename);
if(entry->title)
g_free(entry->title);
playlist=g_list_remove_link(playlist,node);
g_free(entry);
g_list_free_1(node);
}
node=next;
}
playlistwin_update_list();
if(set_info_text)
mainwin_set_info_text();
if(restart_playing)
{
if(playlist_position)
playlist_play();
mainwin_set_song_info(0,0,0);
}
}
void playlist_select_all(void)
{
GList *node;
node=playlist;
while(node)
{
((PlaylistEntry *)node->data)->selected=TRUE;
node=node->next;
}
playlistwin_update_list();
}
void playlist_select_none(void)
{
GList *node;
node=playlist;
while(node)
{
((PlaylistEntry *)node->data)->selected=FALSE;
node=node->next;
}
playlistwin_update_list();
}
void playlist_inverse_selection(void)
{
GList *node;
node=playlist;
while(node)
{
((PlaylistEntry *)node->data)->selected=!((PlaylistEntry *)node->data)->selected;
node=node->next;
}
playlistwin_update_list();
}
void playlist_add(gchar *filename)
{
PlaylistEntry *entry;
gchar *ext;
entry=g_malloc0(sizeof(PlaylistEntry));
entry->length=-1;
entry->filename=g_strdup(filename);
if(!playlist)
{
playlist=g_list_append(NULL,entry);
playlist_position=playlist;
}
else
g_list_append(playlist,entry);
}
void playlist_add_dir(gchar *path)
{
DIR *dir;
struct dirent *dirent;
struct stat statbuf;
gchar *filename;
if(dir=opendir(path))
{
while(dirent=readdir(dir))
{
if(dirent->d_name[0]!='.')
{
filename=g_strconcat(path,"/",dirent->d_name,NULL
stat(filename,&statbuf);
if(S_ISDIR(statbuf.st_mode))
playlist_add_dir(filename);
else
playlist_add(filename);
g_free(filename);
}
}
}
}
/*
* I'm not sure if this is the correct way to do it but it seems to work fine
*/
void playlist_add_url_string(gchar *string)
{
gint i=0,start;
gchar *temp,*ext;
struct stat statbuf;
printf("%s\n",string);
while(*string)
{
temp=strchr(string,'\n');
if(temp)
{
if(*(temp-1)=='\r')
*(temp-1)='\0';
*temp='\0';
}
if(!strncasecmp(string,"file:",5))
{
stat(string+5,&statbuf);
if(S_ISDIR(statbuf.st_mode))
playlist_add_dir(string+5);
else
{
ext=strrchr(string+5,'.');
if(ext)
{
if(!strcasecmp(ext,".m3u")||!strcasecmp(ext,".pls
playlist_load(string+5);
else
playlist_add(string+5);
}
else
playlist_add(string+5);
}
}
else
playlist_add(string);
if(!temp)
break;
string=temp+1;
}
}
void playlist_play(void)
{
PlaylistEntry *entry;
gchar *ptr;
if(get_playlist_length()==0)
return;
entry=(PlaylistEntry *)playlist_position->data;
if(get_input_playing()) input_stop();
input_play(entry->filename);
if(input_get_time()!=-1)
input_set_eq(cfg.equalizer_active,cfg.equalizer_p
}
void playlist_set_info(gchar *title,gint length,gint rate,gint freq,gint nch)
{
PlaylistEntry *entry;
entry=(PlaylistEntry *)playlist_position->data;
if(entry->title)
g_free(entry->title);
entry->title=g_strdup(title);
entry->length=length;
mainwin_set_song_info(rate,freq,nch);
mainwin_set_info_text();
playlistwin_update_list();
}
void playlist_next(void)
{
if(!playlist) return;
if(!cfg.shuffle) {
if(g_list_next(playlist_position))
playlist_position=g_list_next(playlist_position);
}
else
playlist_position=g_list_nth(playlist,rand() % get_playlist_length());
if(get_input_playing())
{
input_stop();
playlist_play();
}
else
{
mainwin_set_info_text();
playlistwin_update_list();
}
}
void playlist_prev(void)
{
if(!playlist) return;
if(g_list_previous(playlist_position))
playlist_position=g_list_previous(playlist_positi
if(get_input_playing())
{
input_stop();
playlist_play();
}
else
{
mainwin_set_info_text();
playlistwin_update_list();
}
}
void playlist_set_position(gint pos)
{
if(!playlist) return;
playlist_position=g_list_nth(playlist,pos);
if(get_input_playing())
{
input_stop();
playlist_play();
}
else
{
mainwin_set_info_text();
playlistwin_update_list();
}
}
void playlist_eof_reached(void)
{
input_stop();
if(!cfg.shuffle) {
if(!g_list_next(playlist_position))
{
playlist_position=playlist;
if(!cfg.repeat)
{
mainwin_set_song_info(0,0,0);
mainwin_set_info_text();
return;
}
}
else
playlist_position=g_list_next(playlist_position);
}
else
playlist_position=g_list_nth(playlist,rand() % get_playlist_length());
playlist_play();
}
gint get_playlist_length(void)
{
if(!playlist)
return 0;
return g_list_length(playlist);
}
gchar *playlist_get_info_text(void)
{
PlaylistEntry *entry;
gchar *text=NULL,*title,*tmp,*tmp2;
gint i;
if(playlist)
{
entry=(PlaylistEntry *)playlist_position->data;
if(entry->title)
title=entry->title;
else
{
title=strrchr(entry->filename,'/');
if(!title)
title=entry->filename;
else
title++;
}
text=g_malloc(strlen(title)+20);
if(entry->length!=-1)
sprintf(text,"%d. %s (%d:%-2.2d)",get_playlist_position()+1,title,entr
else
sprintf(text,"%d. %s",get_playlist_position()+1,title);
if(cfg.convert_underscore)
while(tmp=strchr(text,'_'))
*tmp=' ';
if(cfg.convert_twenty)
while(tmp=strstr(text,"%20"))
{
tmp2=tmp+3;
*(tmp++)=' ';
while(*tmp2)
*(tmp++)=*(tmp2++);
*tmp='\0';
}
}
return text;
}
int playlist_get_current_length(void)
{
PlaylistEntry *entry;
if(!playlist) return 0;
entry=(PlaylistEntry *)playlist_position->data;
return entry->length;
}
gboolean playlist_save(gchar *filename)
{
PlaylistEntry *entry;
GList *node;
FILE *file;
gchar *ext;
gboolean is_pls=FALSE;
if(file=fopen(filename,"w"))
{
ext=strrchr(filename,'.');
if(ext)
if(!strcasecmp(ext,".pls"))
{
is_pls=TRUE;
fprintf(file,"[playlist]\n");
fprintf(file,"NumberOfEntries=%d\n",get_playlist_
}
node=playlist;
while(node)
{
entry=(PlaylistEntry *)node->data;
if(is_pls)
fprintf(file,"File%d=%s\n",g_list_position(playli
else
fprintf(file,"%s\n",entry->filename);
node=node->next;
}
fclose(file);
return TRUE;
}
return FALSE;
}
gboolean playlist_load(gchar *filename)
{
FILE *file;
gchar *line,*ext,key[10];
gint i,noe;
int linelen=1024;
ext=strrchr(filename,'.');
if(!ext) ext=".m3u";
if(!strcasecmp(ext,".pls"))
{
if(line=read_ini_string(filename,"playlist","Numb
{
noe=atoi(line);
g_free(line);
}
else
return FALSE;
for(i=1;i=noe;i++)
{
g_snprintf(key,10,"File%d",i);
if(line=read_ini_string(filename,"playlist",key))
{
playlist_add(line);
g_free(line);
}
}
return TRUE;
}
else
{
if(file=fopen(filename,"r"))
{
line=g_malloc(linelen);
while(fgets(line,linelen,file))
{
while(strlen(line)==linelen-1&&line[strlen(line)-
{
linelen+=1024;
line=(gchar *)g_realloc(line,linelen);
fgets(&line[strlen(line)],1024,file);
}
while(line[strlen(line)-1]=='\r'||line[strlen(lin
playlist_add(line);
}
fclose(file);
return TRUE;
}
}
return FALSE;
}
GList *get_playlist(void)
{
return playlist;
}
gint get_playlist_position(void)
{
return g_list_position(playlist,playlist_position);
}
gint playlist_sort_by_title_cmpfunc(PlaylistEntry *a,PlaylistEntry *b)
{
gchar *a_title=NULL,*b_title=NULL;
if(a->title)
a_title=a->title;
else
{
if(a->filename[0]='/')
a_title=strrchr(a->filename,'/')+1;
if(!a_title)
a_title=a->filename;
}
if(b->title)
b_title=b->title;
else
{
if(b->filename[0]='/')
b_title=strrchr(b->filename,'/')+1;
if(!b_title)
b_title=b->filename;
}
return strcasecmp(a_title,b_title);
}
void playlist_sort_by_title(void)
{
playlist=g_list_sort(playlist,(GCompareFunc)playl
}
gint playlist_sort_by_filename_cmpfunc(PlaylistEntry *a,PlaylistEntry *b)
{
gchar *a_filename=NULL,*b_filename=NULL;
if(a->filename[0]='/')
a_filename=strrchr(a->filename,'/')+1;
if(!a_filename)
a_filename=a->filename;
if(b->filename[0]='/')
b_filename=strrchr(b->filename,'/')+1;
if(!b_filename)
b_filename=b->filename;
return strcasecmp(a_filename,b_filename);
}
void playlist_sort_by_filename(void)
{
playlist=g_list_sort(playlist,(GCompareFunc)playl
}
gint playlist_sort_by_path_cmpfunc(PlaylistEntry *a,PlaylistEntry *b)
{
return strcasecmp(a->filename,b->filename);
}
void playlist_sort_by_path(void)
{
playlist=g_list_sort(playlist,(GCompareFunc)playl
}
void playlist_reverse(void)
{
playlist=g_list_reverse(playlist);
}
Wait a sec...The ACM is a professional organization. They offer really great services, including reduced fees to conferences, SIG memberships, etc. The prices they charge are very reasonable for the services they offer. I'm a member of SIGOPS, and SIGLINK, and SIGART -- I receive valuable publications, as well as being allowed to access their full text archives. Just because they charge a reasonable fee to allow access to their archives, they don't "suck dick."
Should a professional organization like the ACM provide free access to their archives? Why?
If you read the actual commentary in the congressional record, the point of the copyright extension was to make our copyright protection laws consistent with European laws.
Will targeting the U.S. alone actually make a difference? Otherwise, Open Source Book projects still won't be able to legally export their texts outside the U.S.