<!-- html-header type=current begin -->
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Render IE9 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<script id="before-content" type="text/javascript">
(function () {
if (typeof window.sdmedia !== 'object') {
window.sdmedia = {};
}
if (typeof window.sdmedia.site !== 'object') {
window.sdmedia.site = {};
}
var site = window.sdmedia.site;
site.rootdir = "//slashdot.org";
}());
var pageload = {
pagemark: '704783923921398854',
before_content: (new Date).getTime()
};
function pageload_done( $, console, maybe ){
pageload.after_readycode = (new Date).getTime();
pageload.content_ready_time = pageload.content_ready - pageload.before_content;
pageload.script_ready_time = pageload.after_readycode - pageload.content_ready;
pageload.ready_time = pageload.after_readycode - pageload.before_content;
// Only report 1% of cases.
maybe || (Math.random()>0.01) || $.ajax({ type: 'POST', data: {
op: 'page_profile',
pagemark: pageload.pagemark,
dom: pageload.content_ready_time,
js: pageload.script_ready_time
} });
}
</script>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="fb:admins" content="100000696822412">
<meta property="fb:page_id" content="267995220856">
<meta name="robots" content="noindex">
<meta name="viewport" content="width=1000, user-scalable=yes, minimum-scale=0, maximum-scale=10.0" />
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" type="text/css" media="screen, projection" href="//a.fsdn.com/sd/classic.ssl.css?fc755fff6459136e" >
<!--[if IE 8]><link rel="stylesheet" type="text/css" media="screen, projection" href="//a.fsdn.com/sd/ie8-classic.ssl.css?fc755fff6459136e" ><![endif]-->
<link rel="stylesheet" type="text/css" media="screen, projection" href="//a.fsdn.com/sd/u2.ssl.css?fc755fff6459136e" >
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen, projection" href="//a.fsdn.com/sd/ie7-classic.ssl.css?fc755fff6459136e" ><![endif]-->
<!-- -->
<!-- SMACKS: NEW CSS -->
<link rel="stylesheet" href="//a.fsdn.com/sd/css/app.css?fc755fff6459136e">
<script src="//a.fsdn.com/con/js/sftheme/cmp-slashdot.js?2026-08-07"></script>
<script>// country.js converted to inline by CF Snippet
window.is_euro_union = 0;
window.country_code2 = "US";
window.region = "CA";
window.prebidOptions = {uids: {ip: "68.99.187.44" }};</script>
<script>
window.bizx.cmp.init({
cmp_id: 12126,
geo: window,
gam_gdpr_technical_delivery: true,
});
bizx.uids.gather();
window.prebidOptions = window.prebidOptions || {};
window.prebidOptions.uids = window.prebidOptions.uids || {};
window.prebidOptions.uids.hem = bizx.uids.getHem();
</script>
<link rel="stylesheet" href="//a.fsdn.com/con/css/sftheme/sandiego/cmp.css?2026-08-07" type="text/css">
<script type='text/javascript'>
var _gaq = _gaq || [];
</script>
<script>
window.SD = {};
window.SD.Ads = {};
var googletag = window.googletag || {};
googletag.cmd = googletag.cmd || [];
</script>
<!-- AdBlock Check -->
<script>
var sdAdBlockActive = true; var sdUboActive = true;
</script>
<script src="//a.fsdn.com/sd/js/scripts/admanager.js?fc755fff6459136e"></script>
<script src="//a.fsdn.com/sd/js/scripts/asg_embed.js?fc755fff6459136e"></script>
</head>
<body class="anon users2 u2">
<script src="//a.fsdn.com/sd/all-minified.js?fc755fff6459136e" type="text/javascript"></script>
<script type="text/javascript">
(function(){
var regexp=/\s*(?:\d+|many)\s+more\s*/i;
var auto_more_count = 1;
function auto_more(){
var $more_link = $('#more-experiment a');
$more_link.each(function(){
var $lastitem = $('#firehoselist>article.fhitem:visible:last');
if ( Bounds.intersect(window, $lastitem) ) {
!--auto_more_count && (auto_more=undefined);
// don't allow a call till the next paginate gets built and |more_possible|
$(document).unbind('scroll', call_auto_more);
}
});
};
function call_auto_more(){ auto_more && auto_more(); }
$('#more-experiment a').
live('more-possible', function( event ){
var $more_link=$(this);
if ( regexp.test($more_link.text()) ) {
$(document).bind('scroll', call_auto_more);
} else {
$(document).unbind('scroll', call_auto_more);
}
});
})();
</script>
<!--[if lt IE 9]><script src="//a.fsdn.com/sd/html5.js"></script><![endif]-->
<!-- index2_variant ||-->
<!-- html-header type=current end --><!-- header type=current begin -->
<link rel="top" title="News for nerds, stuff that matters" href="//slashdot.org/" >
<link rel="search" title="Search Slashdot" href="//slashdot.org/search.pl">
<link rel="alternate" title="Slashdot RSS" href="https://rss.slashdot.org/Slashdot/slashdotMain" type="application/rss+xml">
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<div id="top_parent"></div>
<a name="topothepage"></a>
<div class="container">
<div class="nav-wrap">
<nav class="nav-primary" role="navigation" aria-label="Global Navigation">
<h2 class="logo">
<a href="//slashdot.org"><span>Slashdot</span></a>
</h2>
<ul class="nav-site">
<li><a href="//slashdot.org"><i class="icon-book" title="Stories"></i><span>Stories</span></a></li>
<li>
<ul class="filter-firehose">
<li class="nav-label">Firehose <i class="icon-angle-right"></i></li>
<li><a href="//slashdot.org/recent">All</a></li>
<li><a href="//slashdot.org/popular">Popular</a></li>
</ul>
</li>
<li><a href="//slashdot.org/polls"><i class="icon-chart-bar" title="Polls"></i><span>Polls</span></a></li>
<!--
<li><a href="//ask.slashdot.org"><i class="icon-question-circle"></i><span>Ask</span></a></li>
<li><a href="//events.slashdot.org"><i class="icon-calendar"></i><span>Events</span></a></li>
-->
<li><a href="https://slashdot.org/software/"><i class="sd-mini"></i> <span>Software</span></a></li>
<li><a href="//slashdot.org/content/"><span>Thought Leadership</span></a></li>
</ul>
<a href="//slashdot.org/submission" class="btn btn-success">Submit</a>
</nav>
<nav class="nav-user" role="navigation" aria-label="user access and account controls">
<div id="main-top-nav-wrapper">
<form id="search" class="form-inline nav-search-form" method="get" action="//slashdot.org/index2.pl">
<!-- //slashdot.org/index2.pl" -->
<div class="form-group">
<label class="sr-only" for="sitesearch">Search Slashdot</label>
<div class="input-group">
<input type="text" id="" class="" name="fhfilter" value="" placeholder="Search">
</div>
</div>
<button type="submit" class="btn icon-search"></button>
</form>
<ul class="user-access">
<li >
<a href="//slashdot.org/my/login" onclick="show_login_box(); return false;"><i class="icon-login"></i><span> Login</span></a>
</li>
<li class="nav-label">or</li>
<li >
<a href="//slashdot.org/my/newuser" ><i class="icon-user-add"></i><span> Sign up</span></a>
</li>
</ul>
</nav>
</div>
<div class="nav-secondary-wrap">
<nav class="nav-secondary" role="secondary-navigation">
<ul>
<li class="nav-label">Topics: </li>
<li><a href="//devices.slashdot.org">Devices</a></li>
<li><a href="//build.slashdot.org">Build</a></li>
<li><a href="//entertainment.slashdot.org">Entertainment</a></li>
<li><a href="//technology.slashdot.org">Technology</a></li>
<li><a href="//slashdot.org/?fhfilter=opensource">Open Source</a></li>
<li><a href="//science.slashdot.org">Science</a></li>
<li><a href="//yro.slashdot.org">YRO</a></li>
<!-- <li><a href="//slashdot.org/topics.pl">more...</a></li> -->
</ul>
</nav>
<nav class="nav-social" role="social navigation">
<ul>
<li class="nav-label">Follow us:</li>
<li><a href="https://rss.slashdot.org/Slashdot/slashdotMain" target="_blank" rel="nofollow"><i class="icon-rss-squared"></i><span class="sr-only">RSS</span></a></li>
<li><a href="https://www.facebook.com/slashdot" target="_blank" rel="nofollow"><i class="icon-facebook-squared"></i><span class="sr-only">Facebook</span></a></li>
<li><a href="https://www.linkedin.com/company/slashdot" target="_blank" rel="nofollow"><i class="icon-linkedin-squared"></i><span class="sr-only">LinkedIn</span></a></li>
<li><a href="https://x.com/slashdot" target="_blank" rel="nofollow"><i><svg style="height:20px;width:20px;margin: 3px 4px 0 4px;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve"><g><path fill="#000000" d="M486,392.599C486,443.97,443.97,486,392.599,486H119.401C68.03,486,26,443.97,26,392.599V119.401 C26,68.031,68.03,26,119.401,26h273.198C443.97,26,486,68.031,486,119.401V392.599z"/><path fill="#F0F0F1" d="M290.425,233.064l110.65-137.91h-32.05l-94.62,117.94l-94.63-117.94H74.125l147.45,183.78l-110.66,137.92 h32.05l94.63-117.95l94.64,117.95h105.65L290.425,233.064z M126.225,120.153h41.55l218,271.7h-41.55L126.225,120.153z"/></g></svg></i><span class="sr-only">Twitter</span></a></li>
<li><a href="https://www.youtube.com/channel/UCsW36751Gy-EAbHQwe9WBNw" target="_blank" rel="nofollow"><i class="icon-youtube-squared">
<!-- width="1792" height="1792" -->
<svg viewBox="0 260 1792 1260" xmlns="http://www.w3.org/2000/svg"><path d="M711 1128l484-250-484-253v503zm185-862q168 0 324.5 4.5t229.5 9.5l73 4q1 0 17 1.5t23 3 23.5 4.5 28.5 8 28 13 31 19.5 29 26.5q6 6 15.5 18.5t29 58.5 26.5 101q8 64 12.5 136.5t5.5 113.5v176q1 145-18 290-7 55-25 99.5t-32 61.5l-14 17q-14 15-29 26.5t-31 19-28 12.5-28.5 8-24 4.5-23 3-16.5 1.5q-251 19-627 19-207-2-359.5-6.5t-200.5-7.5l-49-4-36-4q-36-5-54.5-10t-51-21-56.5-41q-6-6-15.5-18.5t-29-58.5-26.5-101q-8-64-12.5-136.5t-5.5-113.5v-176q-1-145 18-290 7-55 25-99.5t32-61.5l14-17q14-15 29-26.5t31-19.5 28-13 28.5-8 23.5-4.5 23-3 17-1.5q251-18 627-18z"/></svg>
</i><span class="sr-only">Youtube</span></a></li>
<li><a href="https://mastodon.cloud/@slashdot" target="_blank" rel="me nofollow"><i class="icon-mastodon-squared">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg>
</i><span class="sr-only">Mastodon</span></a></li>
<li><a href="https://bsky.app/profile/slashdot.org" target="_blank" rel="nofollow"><i><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24" id="Bluesky--Streamline-Simple-Icons.svg" height="20" width="20" style="margin: 3px 4px 0 4px;"><title>Bluesky</title><path d="M12 10.8c-1.087 -2.114 -4.046 -6.053 -6.798 -7.995C2.566 0.944 1.561 1.266 0.902 1.565 0.139 1.908 0 3.08 0 3.768c0 0.69 0.378 5.65 0.624 6.479 0.815 2.736 3.713 3.66 6.383 3.364 0.136 -0.02 0.275 -0.039 0.415 -0.056 -0.138 0.022 -0.276 0.04 -0.415 0.056 -3.912 0.58 -7.387 2.005 -2.83 7.078 5.013 5.19 6.87 -1.113 7.823 -4.308 0.953 3.195 2.05 9.271 7.733 4.308 4.267 -4.308 1.172 -6.498 -2.74 -7.078a8.741 8.741 0 0 1 -0.415 -0.056c0.14 0.017 0.279 0.036 0.415 0.056 2.67 0.297 5.568 -0.628 6.383 -3.364 0.246 -0.828 0.624 -5.79 0.624 -6.478 0 -0.69 -0.139 -1.861 -0.902 -2.206 -0.659 -0.298 -1.664 -0.62 -4.3 1.24C16.046 4.748 13.087 8.687 12 10.8Z" fill="rgb(17, 133, 254)" stroke-width="1"/></svg></i><span class="sr-only">Bluesky</span></a></li>
</ul>
</nav>
</div>
</div>
<section>
<!--
<div class="message-bar" id="firehose-message-tray">
<span class="icon-quote-left"></span>
<p>
Want to read Slashdot from your mobile device? Point it at <a href="http://m.slashdot.org">m.slashdot.org</a> and keep reading!
</p>
</div>
-->
<div id='embbeded_login_modal' class="hide">
<form action="https://slashdot.org/my/login" method="post" onsubmit="if (global_returnto) { this.returnto.value = global_returnto }" class="embedded"><fieldset style="-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;-moz-border-radius:10px 10px 0 0">
<div style='height:25px;'> </div>
<input type="hidden" name="returnto" value="">
<input type="hidden" name="op" value="userlogin">
<p>
<label class="fleft" for="unickname">Nickname:</label>
<input type="text" name="unickname" value="">
</p>
<p>
<label class="fleft" for="upasswd">Password:</label>
<input type="password" name="upasswd">
</p>
<label class="checkbox"><input type="checkbox" name="login_temp" value="yes"> Public Terminal</label>
<br>
<hr>
<input type="submit" name="userlogin" value="Log In" class="fno"> <a href="//slashdot.org/my/mailpassword" class="btn link" onclick="getModalPrefs('sendPasswdModal', 'Retrieve Password', 1); return false;">Forgot your password?</a>
</fieldset></form>
<div class="actions">
<a class="ico close" onclick="hide_login_slider();" href=""><span>Close</span></a>
</div>
</div>
<div class="banner-wrapper"></div>
<div id="top-banner-placeholder"></div>
<a name="main-articles"></a>
<!-- header type=current end --><style type="text/css">
menu, menu * {
text-decoration:none;
}
menu[type=context] {
display:none;
position:absolute;
z-index:10000;
}
menu[type=context]:not(.brief) {
background-color:#dfdfdf;
margin:0;
padding:2px 0.5em;
border-style:solid;
border-width:1px;
border-color:#eeeeee #aaaaaa #aaaaaa #eeeeee;
-moz-border-radius-topright:.7em;
-webkit-border-top-right-radius: 0.7em 0.7em;
}
menu.full[type=context] > a.slash-hover:first-child {
-moz-border-radius-topright:.6em;
-webkit-border-top-right-radius: 0.6em 0.6em;
}
menu.brief[type=context] > a {
-moz-border-radius:.6em;
-webkit-border-radius: 0.6em;
color:#ffffff;
background-color:#000000;
}
/*
span.briefmenu a.tag:not(.datatype) {
padding-left:.5em;
}
*/
/* #tag-menu a, #feedback-menu a { */
menu.tag-menu-admin a {
display:list-item;
list-style:none;
text-align:left;
font-weight:bold;
color:black;
padding:0.1em 0.5em;
margin:-0.1em -0.5em;
cursor:pointer;
}
.tags .edit-bar { position:relative; }
article aside .share .addthis_toolbox { display:block; width:60px; float:left; }
article aside.view_mode .share { min-width:120px; padding-top:.5em; }
#firehose.list article header h2 {padding-left: 20px; !important}
.novote .vote { display:none; }
.vote > a, .votedup > a, .voteddown > a {
display:inline-block;
height:22px;
width:22px;
margin: 2px 10px 0 0;
color:rgb(255,255,255);
text-decoration:none;
line-height:22px;
text-align:center;
font-weight:bold;
font-size:14px;
border-width:1px;
border-style:solid;
border-color:rgba(0,0,0,0.5);
}
.vote > a, .votedup > a, .voteddown > a {color:rgb(0,0,0);}
article.fhitem-submission h2 .vote > a, article.fhitem-submission h2 .votedup > a, article.fhitem-submission h2 .voteddown > a { border-color:rgba(0,0,0,0.15); }
.vote .up, .vote .down, .votedup .up, .votedup .down, .voteddown .up, .voteddown .down { border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; /* text-shadow:0 0 2px #000000; }*/}
article:not(.fhitem-story) .vote .up,article:not(.fhitem-story) .vote .down,article:not(.fhitem-story) .votedup .up,article:not(.fhitem-story) .votedup .down,article:not(.fhitem-story) .voteddown .up,article:not(.fhitem-story) .voteddown .down { /*text-shadow:none !important; */}
.voteddown .down, .votedup .up { margin-right: 10px; text-indent:2px; line-height:24px; }
article:not(.fhitem-story) .votedup .up,article:not(.fhitem-story) .voteddown .down {background: rgb(174,174,174);background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(174,174,174)), to(rgb(193,193,193)));background-image: -moz-linear-gradient(100% 100% 90deg,rgb(193,193,193), rgb(174,174,174) 100%);color:rgb(0,0,0);}
article.fhitem-story .votedup .up,article.fhitem-story .voteddown .down {background: rgb(0,66,66);background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(0,53,53)), to(rgb(0,102,102)));background-image: -moz-linear-gradient(100% 100% 90deg,rgb(0,102,102), rgb(0,53,53) 100%);}
#tag-menu span.var-tag {
font-weight:normal;
color:#444444;
}
menu.reasons-menu a {
padding:0 .25em 0 .25em;
font-size:80%;
-moz-border-radius:.5em;
-webkit-border-radius:.5em;
cursor:pointer;
}
menu.reasons-menu a:hover {
background:rgb(153,153,153);
background:-moz-linear-gradient(100% 100% 90deg, rgb(102,102,102), rgb(153,153,153) 70%) repeat scroll 0 0 rgb(102,102,102);
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(153,153,153)), to(rgb(102,102,102)));
color:#fff;
text-decoration:none;
font-weignt:normal;
}
article.fhitem-story menu.reasons-menu a:hover {
background:#002323 !important;
background:-moz-linear-gradient(100% 100% 90deg, #002323, #005353 70%) repeat scroll 0 0 #002323 !important;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#005353), to(#002323)) !important;
}
menu.reasons-menu {
display:none;
margin:0;
padding:0;
}
div.fhitem h3 menu.reasons-menu {
margin:0.25em 0 0;
}
div.fhitem h3 menu.reasons-menu a.tag {
font-size:.8em;
}
#tag-menu a.slash-hover,
#feedback-menu a.slash-hover,
.tag-display span.tag:hover,
.tag-display span.tag.trigger {
color:white;
background-color:rgb(0, 85, 85);
}
#tag-menu a.slash-hover span.var-tag {
color:#eee;
}
.tag-entry.default {
color:#ccc;
}
.brief .nix {
margin-top:-1.35em;
margin-left:0px;
margin-top:-1.15em;
text-decoration:none;
line-height:1.35em;
padding:0 2px;
-moz-border-radius:.6em 0 0 .6em;
-webkit-border-radius:.6em 0 0 .6em;
-o-border-radius:.6em 0 0 .6em;
border-radius:.6em 0 0 .6em;
color:#fff !important;
background:transparent !important;
}
.brief .nix:hover {
background:rgb(153,153,153) !important;
background:-moz-linear-gradient(100% 100% 90deg, rgb(102,102,102), rgb(153,153,153) 70%) repeat scroll 0 0 rgb(102,102,102) !important;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(153,153,153)), to(rgb(102,102,102))) !important;
}
</style>
<menu id="nix-reasons" style="display:none">
<a class="tag">binspam</a><a class="tag">dupe</a><a class="tag">notthebest</a><a class="tag">offtopic</a><a class="tag">slownewsday</a><a class="tag">stale</a><a class="tag">stupid</a>
</menu>
<menu id="nod-reasons" style="display:none">
<a class="tag">fresh</a><a class="tag">funny</a><a class="tag">insightful</a><a class="tag">interesting</a><a class="tag">maybe</a>
</menu>
<menu id="comment-nix-reasons" style="display:none">
<a class="tag">offtopic</a><a class="tag">flamebait</a><a class="tag">troll</a><a class="tag">redundant</a><a class="tag">overrated</a>
</menu>
<menu id="comment-nod-reasons" style="display:none">
<a class="tag">insightful</a><a class="tag">interesting</a><a class="tag">informative</a><a class="tag">funny</a><a class="tag">underrated</a>
</menu>
<menu id="tag-nod-reasons" style="display:none">
<a class="tag">descriptive</a>
</menu>
<menu id="feedback-menu" class="tag-menu-admin" type="context">
<a class="tag">typo</a><a class="tag">dupe</a><a class="tag">error</a>
</menu>
<menu id="tag-menu" class="tag-menu-admin none" type="context">
<!-- <a data-op="!" class="nix">!<span class="var-tag hide"></span></a>-->
</menu>
<script type="text/javascript">
$(function(){
var $CURRENT_MENU, $TAG_MENU=$('#tag-menu'), NOTNOT=/^!!/, IE7=/^7\.0/, TAG_PREFIX=/^\/tag\//;
function get_tag_name( $tag ){
return ($tag.attr('href') || '').replace(TAG_PREFIX, '') || $tag.text().toLowerCase();
}
function trigger_menu( e, selector, $menu, menu_content ){
var $target=$(original_target(e, selector)), in_use=$target.is('.trigger');
if ( $CURRENT_MENU ) {
$CURRENT_MENU.menu('cancel', e);
$CURRENT_MENU = null;
}
if ( !in_use ) {
menu_content && $menu.stop(true, true).hide().html(menu_content);
($CURRENT_MENU=$menu).menu('context', e);
}
return !in_use;
}
function open_menu( trigger, $menu ){
var $trigger=$(trigger), $fhitem=$trigger.closest('.fhitem');
$fhitem.length && user_intent('interest', $fhitem[0]);
$menu.appendTo(document.body).css({ opacity:0 }).show();
var right = $fhitem.offset().left + $fhitem.width(),
global = $trigger.offset(),
local = $menu.offsetParent().offset();
// Ugly IE position hack required:
$.browser.msie && IE7.test($.browser.version) && (local.top = 0);
// pin the menu (horizontally) on-screen
global.left = Math.min(global.left, right-$menu.width());
$trigger.addClass('trigger');
$menu.css({
position: 'absolute',
top: global.top - local.top + $trigger.height(),
left: global.left - local.left,
opacity: 1
});
}
function close_menu( trigger, $menu ){
$menu.hide();
$(trigger).removeClass('trigger');
($CURRENT_MENU===$menu) && ($CURRENT_MENU=false);
}
/* T2 tag context-menu */
var $TAG_MENU=$('#tag-menu'), NOTNOT=/^!!/;
var user_is_admin = 0;
$('a[rel=tag]').live('mousedown',function(ea){
window.open(this.href);
return false;
})
$('.tag-bar .disagree').live('mousedown',function(ee){
var fhitem = $(original_target(ee)).closest('.fhitem')[0],
command = ('!' + $(original_target(ee)).attr("data-tag")).replace(NOTNOT, '');
try { Tags.submit(fhitem, command); } catch ( err ) { }
return false;
})
$('a[rel=tag]').
live('mousedown', function( e ){
return true;
}).
live('click', function( e ){
if ( !logged_in ) {
var target = original_target(e),
tag = $(target).text();
addfhfilter(tag);
}
e.preventDefault();
return false;
});
$TAG_MENU.menu({
cssNamespace: 'slash',
liveTriggers: true,
clickDuration: 300,
start: function( e, ui ){
var $tag = $(ui.trigger),
tag = get_tag_name($tag),
context = firehose_settings && firehose_settings.viewtitle;
// Insert the tagname into the menu items where needed.
$TAG_MENU.find('span.var-tag').text(tag);
$TAG_MENU.find('a.nix').attr('title','not ' + tag);
// non-admins may only delete their own tags
$TAG_MENU.find('a[data-op="-"]').toggle($tag.is('.my'));
// *tagname* in *viewtitle*
$TAG_MENU.find('a[data-op="="]').toggle(!!context);
context && $TAG_MENU.find('span.var-view').text(context);
open_menu($tag, $TAG_MENU);
},
select: function( e, ui ){
var $tag = $(ui.trigger),
tag = get_tag_name($tag),
op = $(ui.event.target).attr('data-op'),
fhitem,
command;
// Global for positioning other things.
$related_trigger = $tag;
switch ( op ) {
case '=':
addfhfilter(tag);
break;
default:
fhitem = $tag.closest('.fhitem')[0];
command = (op + tag).replace(NOTNOT, '');
try { Tags.submit(fhitem, command); } catch ( err ) { }
break;
}
},
stop: function( e, ui ){ close_menu(ui.trigger, $TAG_MENU); }
});
/* T2 feedback context-menu */
/* T2 datatype context-menu (admin-only) */
});
</script>
<!-- SMACKS: BEGIN MAIN CONTENT U2MainView -->
<div class="container">
<div class="main-wrap has-rails">
<div class="main-content">
<section class="grid_24" id="content">
<section id="firehose">
<div class="grid_24">
<!--
<div class="msg">
<p>
<a href="//slashdot.org/~wooby/journal/friends">wooby's Friends' Journals</a>
</p>
</div>-->
<!--body begin -->
<div class="">
<div class="main-wrap ">
<div class="main-content">
<div id="firehose" class="nothumbs ">
<!-- WIT -->
<a name="articles"></a>
<div id="firehoselist" class="fhroot row ">
<article id="firehose-1589987" data-fhid="1589987" data-fhtype="journal" class="fhitem fhitem-journal article usermode thumbs grid_24">
<span class="sd-info-block" style="display: none">
<span class="sd-key-firehose-id">1589987</span>
<span class="type">journal</span>
</span>
<header>
<span class="topic" id="topic-1589987">
<a href="//slashdot.org/index2.pl?fhfilter=hardhack" onclick="return addfhfilter('hardhack');">
<img src="//a.fsdn.com/sd/topics/hardhack_64.png" width="64" height="64" alt="Hardware Hacking" title="Hardware Hacking">
</a>
</span>
<h2 class="firehose">
<span class="article-ribbon story-ribbon">Journal</span>
<span id="title-1589987" class="story-title"><a href="//slashdot.org/index2.pl?fhfilter=journal" title="Filter to journal" class="skin">Journal:</a> <a onclick="return toggle_fh_body_wrap_return(this);" rel="nofollow" href="//slashdot.org/journal/90258/highly-hackable-linksys-router">Highly Hackable Linksys Router</a></span>
<!--<span class="comments commentcnt-1589987" style="display:none">0</span>-->
<!-- comment bubble -->
</h2>
<div class="details" id="details-1589987">
<span class="story-details">
<span class="story-views">
<span class="sodify" onclick="firehose_set_options('color', 'indigo')" title="Filter Firehose to entries rated indigo or better"></span><span class="icon-beaker pop6 " alt="Popularity" title="Filter Firehose to entries rated indigo or better" onclick="firehose_set_options('color', 'indigo')"><span></span></span>
</span>
</span>
<span class="story-byline">
Journal
by
<a href="//slashdot.org/~wooby">wooby</a>
<time id="fhtime-1589987" datetime="on Saturday November 13, 2004 @04:13PM">on Saturday November 13, 2004 @04:13PM</time>
</span>
</div>
</header>
<div class="body" id="fhbody-1589987">
<div id="text-1589987" class="p">
<p>Holy hell, is the WRT54G awesome! I picked myself up one the other day at Circuit City for $69, not even realizing the potential it had. When I got home and started tinkering with the firmware, I remembered something about being able to flash the unit with your own Linux.</p><p>Well, I went ahead and did it, with <a href="http://www.openwrt.org/">OpenWrt</a> and ended up with a Linux system, running on my router, serving web requests and that I can ssh into. Totally sweet. The router now has <a href="http://faust.homeunix.com/">its own webpage.</a> </p><p>I also got my feet wet with the included shell, ash (one of the many programs in <a href="http://www.busybox.net/">BusyBox</a>), and wrote a <a href="http://www.dyndns.org/">DynDNS</a> <a href="http://faust.homeunix.com/update.sh">update client.</a> </p>
</div>
</div>
<aside class="novote">
</aside>
<footer class="clearfix meta article-foot">
<div class="story-controls">
</div>
<div class="story-tags">
<span class="tright tags"><menu type="toolbar" class="edit-bar">
<span id="tagbar-1589987" class="tag-bar none">
</span>
<!--
<a class="edit-toggle" href="/my/login/" onclick="show_login_box();return false;">
<span class="icon-tag btn collapse"></span>
</a>
-->
<div class="tag-menu">
<input class="tag-entry default" type="text" value="apply tags">
</div>
</menu></span>
</div>
</footer>
</article><article id="firehose-1589469" data-fhid="1589469" data-fhtype="journal" class="fhitem fhitem-journal article usermode thumbs grid_24">
<span class="sd-info-block" style="display: none">
<span class="sd-key-firehose-id">1589469</span>
<span class="type">journal</span>
</span>
<header>
<span class="topic" id="topic-1589469">
<a href="//slashdot.org/index2.pl?fhfilter=books" onclick="return addfhfilter('books');">
<img src="//a.fsdn.com/sd/topics/books_64.png" width="64" height="64" alt="Books" title="Books">
</a>
</span>
<h2 class="firehose">
<span class="article-ribbon story-ribbon">Journal</span>
<span id="title-1589469" class="story-title"><a href="//slashdot.org/index2.pl?fhfilter=journal" title="Filter to journal" class="skin">Journal:</a> <a onclick="return toggle_fh_body_wrap_return(this);" rel="nofollow" href="//slashdot.org/journal/89950/project-gutenberg-dvd">Project Gutenberg DVD</a></span>
<!--<span class="comments commentcnt-1589469" style="display:none">0</span>-->
<!-- comment bubble -->
</h2>
<div class="details" id="details-1589469">
<span class="story-details">
<span class="story-views">
<span class="sodify" onclick="firehose_set_options('color', 'violet')" title="Filter Firehose to entries rated violet or better"></span><span class="icon-beaker pop7 " alt="Popularity" title="Filter Firehose to entries rated violet or better" onclick="firehose_set_options('color', 'violet')"><span></span></span>
</span>
</span>
<span class="story-byline">
Journal
by
<a href="//slashdot.org/~wooby">wooby</a>
<time id="fhtime-1589469" datetime="on Wednesday November 10, 2004 @12:38PM">on Wednesday November 10, 2004 @12:38PM</time>
</span>
</div>
</header>
<div class="body" id="fhbody-1589469">
<div id="text-1589469" class="p">
<p>There exists a <a href="http://www.promo.net/pg">Project Gutenberg</a> <a href="ftp://ftp.archive.org/pub/etext/cdimages/pgdvd.iso">DVD</a> containing 9400 of the Project's available books.</p><p>Though I consider my laptop mostly useless without a network connection, I try to load up on as much offline content and software as possible. I wouldn't want to be left empty-handed if I couldn't get to Slashdot!</p>
</div>
</div>
<aside class="novote">
</aside>
<footer class="clearfix meta article-foot">
<div class="story-controls">
</div>
<div class="story-tags">
<span class="tright tags"><menu type="toolbar" class="edit-bar">
<span id="tagbar-1589469" class="tag-bar none">
</span>
<!--
<a class="edit-toggle" href="/my/login/" onclick="show_login_box();return false;">
<span class="icon-tag btn collapse"></span>
</a>
-->
<div class="tag-menu">
<input class="tag-entry default" type="text" value="apply tags">
</div>
</menu></span>
</div>
</footer>
</article><article id="firehose-1588849" data-fhid="1588849" data-fhtype="journal" class="fhitem fhitem-journal article usermode thumbs grid_24">
<span class="sd-info-block" style="display: none">
<span class="sd-key-firehose-id">1588849</span>
<span class="type">journal</span>
</span>
<header>
<span class="topic" id="topic-1588849">
<a href="//slashdot.org/index2.pl?fhfilter=journal" onclick="return addfhfilter('journal');">
<img src="//a.fsdn.com/sd/topics/topicjournal.gif" width="58" height="61" alt="User Journal" title="User Journal">
</a>
</span>
<h2 class="firehose">
<span class="article-ribbon story-ribbon">Journal</span>
<span id="title-1588849" class="story-title"><a href="//slashdot.org/index2.pl?fhfilter=journal" title="Filter to journal" class="skin">Journal:</a> <a onclick="return toggle_fh_body_wrap_return(this);" rel="nofollow" href="//slashdot.org/journal/89563/reasons-for-existence">Reasons for Existence</a></span>
<!--<span class="comments commentcnt-1588849" style="display:none">0</span>-->
<!-- comment bubble -->
</h2>
<div class="details" id="details-1588849">
<span class="story-details">
<span class="story-views">
<span class="sodify" onclick="firehose_set_options('color', 'violet')" title="Filter Firehose to entries rated violet or better"></span><span class="icon-beaker pop7 " alt="Popularity" title="Filter Firehose to entries rated violet or better" onclick="firehose_set_options('color', 'violet')"><span></span></span>
</span>
</span>
<span class="story-byline">
Journal
by
<a href="//slashdot.org/~wooby">wooby</a>
<time id="fhtime-1588849" datetime="on Saturday November 06, 2004 @08:30PM">on Saturday November 06, 2004 @08:30PM</time>
</span>
</div>
</header>
<div class="body" id="fhbody-1588849">
<div id="text-1588849" class="p">
<p>It is common in books and in film for a character to have an opportunity to confront God. Usually, the question is asked: "Why are we here?" It's a question that defines in western civilization the relationship we have with the Creator.</p><p>Because we are aware of ourselves in a sense beyond instinct, our conscious mind constantly asks of itself why it exists. Objects and other entities like animals and other people have perceived reasons for existence, but these reasons usually stem from the notion that we, for some reason, must exist. For instance, animals exist to feed me. Friends exist to accompany me. My parents exist to raise me.</p><p>There is a discomfort that accompanies the realization that there is no immediate reason for either you or I to exist. The "Why are we here?" of popular culture speaks to this discomfort. But what is the root of this discomfort? Perhaps the question is disturbing not because in some universal sense it cannot be answered, but because the thought processes humans bring to the question are either not adequate or not applicable. It would be ironic if the instincts that allow us to survive in the natural universe are the same instincts that prevent us from grasping our purpose. Maybe we're not meant to know, as the movies would have us think.</p><p>I'm only topically familiar with modern philosophy's take on the question of existence, and am certain only of the approach to the question that suits me personally. I try not to think about it. A gratification of a sense of purpose is an emotion, and can't be achieved through a precise analytical method. I take things day to day and focus on what brings me joy. So far, so good.</p>
</div>
</div>
<aside class="novote">
</aside>
<footer class="clearfix meta article-foot">
<div class="story-controls">
</div>
<div class="story-tags">
<span class="tright tags"><menu type="toolbar" class="edit-bar">
<span id="tagbar-1588849" class="tag-bar none">
</span>
<!--
<a class="edit-toggle" href="/my/login/" onclick="show_login_box();return false;">
<span class="icon-tag btn collapse"></span>
</a>
-->
<div class="tag-menu">
<input class="tag-entry default" type="text" value="apply tags">
</div>
</menu></span>
</div>
</footer>
</article>
</div>
<!-- LOWER PAGINATION -->
<div class="row">
<div class="paginate" id="fh-pag-div">
<div class="menu2" id="fh-paginate">
<a class="prevnextbutact" href="//slashdot.org/users2.pl?page=0&uid=786765&view=userjournal&fhfilter=%22author%3Awooby%22+journal" >« Newer</a>
<a class="prevnextbutdis" href="#" onclick="return false;">Older »</a>
<span class="inactive more">
</span>
<span class="submit"><a href="//slashdot.org/journal" class="btn">Write in Journal</a></span>
</div>
</div>
</div>
<!-- WIT -->
<span id="itemsreturned" class="row">
</span>
<!-- Slashdot Deals 6 Best Sellers -->
<div class="row">
<div class="deals-wrapper">
<div class="deals-header"><h2>Slashdot Top Deals</h2></div>
<div id="deals-output">
<script id="deals-template" type="text/x-handlebars-template">
{{#each deal}}
<div class="deal">
<a href="{{urlPath permalink}}?&utm_source=slashdot.org&utm_medium=dealfeed-footerfeed&utm_campaign={{slug}}" target="_blank">
<img src="{{main_image}}" alt="" />
</a>
<p class="title"><a href="{{urlPath permalink}}?&utm_source=slashdot.org&utm_medium=dealfeed-footerfeed&utm_campaign={{slug}}" target="_blank">{{title}}</a></p>
<p class="deal-price">{{centConversion price_in_cents}}</p>
</div>
{{/each}}
</script>
</div>
</div>
</div>
<script>
if ( sdAdBlockActive && window.is_euro_union === 0) {
bizx.cmp.ifConsent('', ['all'], function () {
$.ajaxSetup({
cache: true
});
$.getScript( "//a.fsdn.com/sd/js/scripts/min/deals-min.js", function(){
runDealsWidget();
});
});
}
</script>
<!-- End Slashdot Deals 6 Best Sellers -->
<!-- SLASH-4560 NEW AD HERE (dhand) -->
<div id="bottomadspace">
<table id="bottomadtable">
<tr>
<td></td>
</tr>
</table>
</div>
</div>
</div>
</div>
</aside>
</div>
<script type="text/javascript">
firehose_exists = 1;
$(function(){
$('#firehose-filter').focus(function(event){ gFocusedText = this; })
.blur(function(event){
if ( gFocusedText === this ) {
gFocusedText = null;
}
});
apply_updates_when( 'at-end', true);
});
firehose_settings.startdate = "";
firehose_settings.mode = "full";
firehose_settings.fhfilter = "\"author:wooby\" journal";
firehose_settings.orderdir = "DESC";
firehose_settings.orderby = "createtime";
firehose_settings.duration = -1;
firehose_settings.color = "black";
firehose_settings.view = "userjournal";
firehose_settings.viewtitle = "";
firehose_settings.tab = "";
firehose_settings.base_filter = "\"author:wooby\" journal";
firehose_settings.user_view_uid = 786765;
firehose_settings.sectionname = "";
firehose_settings.issue = "";
firehose_settings.section = "";
$('#searchquery').val(firehose_settings.fhfilter);
fh_is_admin = 0;
firehose_sitename = "Slashdot";
firehose_slogan = "News for nerds, stuff that matters";
if (fh_is_admin) {
firehose_update_title_count();
}
firehose_smallscreen = 0;
var firehose_action_time = 0;
var firehose_user_class = 0;
var fh_color = "black";
fh_colors = [ "red", "orange", "yellow", "green", "blue", "indigo", "violet", "black" ];
var fh_colors_hash = new Array(0);
for (var i=0; i< fh_colors.length; i++) {
fh_colors_hash[fh_colors[i]] = i;
}
var fh_view_mode = "full";
firehose_settings.page = 1;
fh_is_admin = 0;
var updateIntervalType = 2;
var inactivity_timeout = 3600;
setFirehoseAction();
var update_time = "2026-08-10 04:18:12";
var maxtime = "2026-08-10 04:18:12";
var insert_new_at = "top";
fh_ticksize = 15;
sitename = 'idle.slashdot.org';
</script>
<span class="void"></span></div>
</section>
</div>
</div>
<!-- SMACKS: BEGIN LEFT RAIL -->
<div class="rail-left">
<nav id="u2tabs" class="left_menu">
<ul>
<li class="home active i"><a href="//slashdot.org/~wooby">wooby</a><span></span></li>
<li class="firehose"><a href="//slashdot.org/~wooby/firehose">Firehose</a></li>
<li class="comments"><a href="//slashdot.org/~wooby/comments">Comments</a></li>
<li class="submissions"><a href="//slashdot.org/~wooby/submissions">Submissions</a></li>
<li class="friends"><a href="//slashdot.org/~wooby/friends">Friends</a></li>
<li class="tags"><a href="//slashdot.org/~wooby/tags">Tags</a></li>
<li class="achievements"><a href="//slashdot.org/~wooby/achievements">Achievements</a></li>
</ul>
</nav>
</div>
<!-- SMACKS: END LEFT RAIL -->
<!-- SMACKS: BEGIN RIGHT RAIL -->
<aside id="slashboxes" class="rail-right">
<div id="login_cover" class="hide" onclick="hide_login_box()"></div>
<div id="login_box" class="hide">
<div id="login_box_content">
<div id='embbeded_login_modal' class="hide">
<form action="https://slashdot.org/my/login" method="post" onsubmit="if (global_returnto) { this.returnto.value = global_returnto }" class="embedded"><fieldset style="-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;-moz-border-radius:10px 10px 0 0">
<div style='height:25px;'> </div>
<input type="hidden" name="returnto" value="//slashdot.org/~wooby">
<input type="hidden" name="op" value="userlogin">
<p>
<label class="fleft" for="unickname">Nickname:</label>
<input type="text" name="unickname" value="">
</p>
<p>
<label class="fleft" for="upasswd">Password:</label>
<input type="password" name="upasswd">
</p>
<label class="checkbox"><input type="checkbox" name="login_temp" value="yes"> Public Terminal</label>
<br>
<hr>
<input type="submit" name="userlogin" value="Log In" class="fno"> <a href="//slashdot.org/my/mailpassword" class="btn link" onclick="getModalPrefs('sendPasswdModal', 'Retrieve Password', 1); return false;">Forgot your password?</a>
</fieldset></form>
<div class="actions">
<a class="ico close" onclick="hide_login_slider();" href=""><span>Close</span></a>
</div>
</div>
<div class="actions">
<a class="ico close" href="#" onclick="hide_login_box(); return false"><span>Close</span></a>
</div>
</div>
</div>
<script type="text/javascript">logged_in = 0</script>
<article class="mq" id="user_bio">
<header class="title" id="user_bio_title">
<h2><span><a href="//slashdot.org/~wooby" style="text-decoration:none;">wooby</a></span> <span>(786765)</span> <span> <a href="" onclick="show_login_box(); return false;"><img src="//a.fsdn.com/sd/neutral.gif" alt="Log In"></a></span></h2>
</header>
<section class="content" id="user_bio_content">
<ul><li>(email not shown publicly)</li></ul>
</section>
</article>
<article id="achievements-786765" class="nosort">
<header id="achievements-786765-title">
<h2><a href="//slashdot.org/~wooby/achievements">wooby's Achievements</a></h2>
</header>
<section class="b" id="achievements-786765-content">
<ul>
<li>
Years Read
</li>
<li>
Days Read in a Row
</li>
<li>
The Maker
</li>
</ul>
</section>
</article>
<article id="comments-786765" class="nosort">
<header id="comments-786765-title">
<h2><a href="//slashdot.org/~wooby/comments">wooby's Comments</a></h2>
</header>
<section class="b" id="comments-786765-content">
<ul>
<li>
<a href="//slashdot.org/comments.pl?sid=1011881&cid=25559403">Re:Shameless plug?</a>
(Score:3, Informative)
</li>
<li>
<a href="//slashdot.org/comments.pl?sid=153847&cid=12911355">Re:Has struck my mind before</a>
</li>
<li>
<a href="//slashdot.org/comments.pl?sid=153847&cid=12906189">Has struck my mind before</a>
</li>
<li>
<a href="//slashdot.org/comments.pl?sid=151372&cid=12701358">I always did feel guilty...</a>
</li>
<li>
<a href="//slashdot.org/comments.pl?sid=150936&cid=12678117">another critical distinction</a>
</li>
</ul>
</section>
</article>
<article id="friends-786765" class="nosort">
<header id="friends-786765-title">
<h2><a href="//slashdot.org/~wooby/friends">wooby's Friends</a></h2>
</header>
<section class="b" id="friends-786765-content">
<ul>
<li>
<a href="//slashdot.org/~iqaz">iqaz</a>
</li>
<li>
<a href="//slashdot.org/~Trixter">Trixter</a>
</li>
</ul>
</section>
</article>
<article id="submissions-786765" class="nosort">
<header id="submissions-786765-title">
<h2><a href="//slashdot.org/~wooby/submissions">wooby's Submissions</a></h2>
</header>
<section class="b" id="submissions-786765-content">
<ul>
<li>
<a href="//slashdot.org/firehose.pl?op=view&id=1338265">Running Google Android on iPhone Clones</a>
</li>
<li>
<a href="//slashdot.org/firehose.pl?op=view&id=1227073">Google Android is the Real OLPC</a>
</li>
<li>
<a href="//slashdot.org/firehose.pl?op=view&id=1212081">Seamless Server/Client-side Javascript</a>
</li>
</ul>
</section>
</article>
</aside>
<!-- SMACKS: END RIGHT RAIL -->
</section>
</div><!-- footer type=current begin -->
</section>
<footer id="fhft" class="grid_24 nf">
<div id="logo_nf" class="fleft">
<a href="//slashdot.org"><span>Slashdot</span></a>
</div>
<nav role="firehose footer">
<ul class="fright submitstory">
<li class="fright">
<a href="/submit">Submit<span class="opt"> Story</span></a>
</li>
</ul>
</nav>
</footer>
<section class="bq">
<blockquote class="msg grid_24" cite="https://slashdot.org">
<p>I don't have any use for bodyguards, but I do have a specific use for two
highly trained certified public accountants.
-- Elvis Presley</p>
<span class="slant"></span>
</blockquote>
</section>
<footer id="ft" class="grid_24">
<nav class="grid_10" role="footer">
<ul>
<li><a href="//slashdot.org/faq">FAQ</a></li>
<li><a href="//slashdot.org/archive.pl">Story Archive</a></li>
<li><a href="//slashdot.org/hof.shtml">Hall of Fame</a></li>
<li><a href="https://slashdotmedia.com/advertising-and-marketing-services/" rel="nofollow">Advertising</a></li>
<li><a href="https://slashdotmedia.com/terms-of-use/" rel="nofollow">Terms</a></li>
<li><a href="https://slashdotmedia.com/privacy-statement/" rel="nofollow">Privacy Statement</a></li>
<li><a href="//slashdot.org/faq/slashmeta.shtml">About</a></li>
<li><a href="mailto:feedback@slashdot.org">Feedback</a></li>
<li><a href="#" onclick="set_mobile_pref('mobile',1);return false;">Mobile View</a></li>
<li><a href="//slashdot.org/blog">Blog</a></li>
<li><a href="#" id="opt-out-link"></a></li>
<li><button class="btn opt-out" id="opt-out-button" style="display:none">
<img src="//a.fsdn.com/sd/ccpa-optout.png" alt="Icon">
Do Not Sell or Share My Personal Information</button></li>
</ul>
</nav>
<br>
<div class="grid_14 tright tm"><span class="nobr">Copyright © 2026 Slashdot Media. All Rights Reserved.</span></div>
<div class="modal-custom overlay-custom" id="ccpa-modal" style="max-width:100%">
<div class="modal-content modal-content-ccpa">
<span class="close" id="modal-close">×</span>
<div class="modal-header" id="ccpa-modal-content-destination"></div>
</div>
</div>
</footer>
<div class="overlay"></div>
<div class="modal-box">
<a href="#" id="close-modal">Close</a>
<article class="modal-content">
</article>
<footer>
</div>
<div id="modal_cover" class="hide" onclick="hide_modal_box(); return false;"></div>
<div id="modal_box" class="hide">
<div id="modal_box_content"></div>
<header class="n">
<span class="fadeout"></span>
<span class="fadeoutfade"></span>
<span class="pf"><a class="ico close" onclick="hide_modal_box(); return false;" href="#"><span>Close</span></a></span>
<h3 class="pf"><div id="logo"><a href="//slashdot.org">Slashdot</a></div><span id="preference_title"></span></h3>
</header>
</div>
<script type="text/javascript">
window.google_analytics_uacct = "UA-199823890-2";
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-199823890-2']);
_gaq.push(['_setDomainName', '.slashdot.org']);
_gaq.push(['_addIgnoredRef', 'slashdot.org']);
_gaq.push(['_setCustomVar', 1, 'User Type', 'Anon', 3]);
_gaq.push(['_setCustomVar', 2, 'Page','users2', 3]);
// track beta behavior for user
var betamatches = document.cookie.match(/betagroup=(-?\d+)/);
if(betamatches && betamatches[1]) {
if(betamatches[1] == -1) {
_gaq.push(['_setCustomVar', 3, 'Beta-Usage','opt-out', 3]);
} else {
_gaq.push(['_setCustomVar', 3, 'Beta-Usage','unredirected', 3]);
}
}
_gaq.push(['_trackPageview']);
_gaq.push(['_trackPageLoadTime']);
bizx.cmp.ifConsent({purposes: ['storage', 'measurement'], vendors: 'google-analytics'}, function () {
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
});
</script>
<!-- CCM GA Push -->
<script>
if (typeof _ml !== 'undefined' && _ml.us) {
if (_ml.us.tp && _ml.us.tp.length > 0) {
ga('set', 'dimension2', _ml.us.tp[0]);
}
if (_ml.us.pc && _ml.us.pc.length > 0) {
ga('set', 'dimension7', _ml.us.pc[0]);
}
ga('set', 'dimension3', _ml.us.ind);
ga('set', 'dimension4', _ml.us.cr);
ga('set', 'dimension5', _ml.us.cs);
ga('set', 'dimension6', _ml.us.dm);
ga('set', 'dimension8', _ml.us.sn);
}
</script>
<!-- Sticky Ads -->
<script type="text/javascript">
var topBannerViewed = false;
function initSticky(){
if (SD?.Ads?.acceptable_ads_active) {
return;
}
if($('#div-gpt-ad-728x90_a').length > 0 && $('#div-gpt-ad-300x250_a').length > 0 && window.outerWidth >= 1070 && !sdAdBlockActive){
$(window).scroll(function(){
var y = $(document).scrollTop();
var z = y + window.outerHeight;
var navOffset = 0;
var offset = [
$('.nav-wrap').outerHeight(true),
$('.nav-secondary-wrap').outerHeight(true)
];
for(row in offset){
if(offset[row]) navOffset = navOffset + parseInt(offset[row]);
}
$('.adwrap-unviewed').each(function(){
var cls = 'adwrap-sticky';
var toggleCls = 'adwrap';
if($(this).hasClass('railad')) {
if(topBannerViewed){
var topPixels = $(this).offset().top;
navOffset += $('.adwrap').outerHeight();
if(y >= topPixels && y >= navOffset){
$('#slashboxes').css('top', 0).css('position','sticky').css('right',13);
} else {
$('#slashboxes').removeAttr('style');
}
}
return;
}
var topPixels = $(this).offset().top;
if(y >= topPixels && y >= navOffset){
$(this).addClass(cls);
$(this).removeClass('adwrap');
if(cls == 'adwrap-sticky') { //top banner
topBannerViewed = false;
$('#slashboxes').css('top',$(this).outerHeight() || 0).css('position','sticky').css('right',13);
}
if(topBannerViewed) {
$('#slashboxes').css('top', 0).css('position','sticky').css('right',13);
}
}else{
$(this).removeClass(cls);
$(this).addClass(toggleCls);
$('#slashboxes').removeAttr('style');
}
});
if($('.adwrap-viewed-banner').length > 0){
topBannerViewed = true;
$('.adwrap-viewed-banner').removeClass('adwrap-unviewed').removeClass('adwrap-sticky').addClass('adwrap');
}
if($('.adwrap-viewed-railad').length > 0){
$('.adwrap-viewed-railad').removeClass('adwrap-unviewed').removeClass('adwrap-railad-sticky');
$('#slashboxes').removeAttr('style');
}
});
}
}
bizx.cmp.ifConsent({purposes: 'all', vendors: 'google-ads'}, function () {
if (!sdAdBlockActive) {
initSticky();
}
if (SD?.Ads?.acceptable_ads_active) {
// similar to remove* code above in initSticky
$('.adwrap-unviewed').removeClass('adwrap-unviewed').removeClass('adwrap-sticky').addClass('adwrap').removeClass('adwrap-railad-sticky');
$('#slashboxes').removeAttr('style');
}
});
</script>
<style>
#slashboxes .ntv-preview-img-wrapper {
display: block;
margin: 0 auto !important;
width: 100%;
float: none;
text-align: center;
}
#slashboxes strong {
margin-bottom: -5px;
display: block;
}
#slashboxes .ntv-preview-img-wrapper {background: #F7F7F7;}
#slashboxes .nel-image {
float: none;
margin-top: 10px;
}
#slashboxes .p.ntv-body {
text-align: left;
border-top: 1px solid #CCCCCC;
}
#slashboxes .p.ntv-body strong {
display: block;
}
#slashboxes .p.ntv-body .nel-button {
width: 100%;
text-align: center;
margin: 15px 0;
padding: 8px;
}
#slashboxes .p.ntv-body {
background: #fff;
margin: 0;
padding: 10px 10px 1px 10px;
}
#slashboxes article:first-child {
border-radius: 0px !important;
padding-top: 1;
}
#slashboxes article:first-child header {
border-radius: 0px !important;
}
#slashboxes article:first-child h2.story {
padding-left: 10px;
background: #6D4634;
}
#slashboxes .details {
display: none;
}
#slashboxes .ntv-sponsored-disclaimer {
position: relative;
top: 0;
background: #6D4634;
padding-left: 10px;
padding-top: 10px;
margin-left: 0;
}
#slashboxes .ntv-sponsored-disclaimer:before {
display: none;
}
#slashboxes .ntv-sponsored-question {
display: none;
}
#slashboxes .ntv-sponsored-disclaimer a {
float: none;
text-transform: uppercase;
}
</style>
<!-- Piwik -->
<script type="text/javascript">
var _paq = _paq || [];
_paq.push(["setCookieDomain", "*.slashdot.org"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
function initPiwik() {
(function() {
var u="//analytics.slashdotmedia.com/";
_paq.push(['setTrackerUrl', u+'sd.php']);
_paq.push(['setSiteId', 40]);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'sd.js'; s.parentNode.insertBefore(g,s);
})();
}
function initNels() {
if(window.location.pathname == '/'){
var nelId = (location.search.split('nel_id=')[1] || '').split('&')[0];
var url = '/ajax.pl?op=nel';
if(nelId){
url += '&nel_id='+nelId;
}
$.ajax({
url: url,
type: 'POST',
success: function(html){
$('#firehoselist article').eq(1).after(html);
}
});
}
function showVerticalNEL() {
let res = false;
if(window.location.pathname.indexOf('/story/') >= 0){ // story
res = true;
}
if(window.location.pathname.indexOf('/recent') >= 0 ||
window.location.pathname.indexOf('/popular') >= 0 ||
window.location.pathname.indexOf('/submission/') >= 0){ // submissions
res = true;
}
if(window.location.pathname === '/'){ // home
res = true;
}
return res;
}
if (showVerticalNEL()) {
var nelId = (location.search.split('nel_id=')[1] || '').split('&')[0];
var url = '/ajax.pl?op=nel';
if(nelId){
url += '&nel_id='+nelId;
}
$.ajax({
url: url,
type: 'POST',
success: function(html){
$('#slashboxes').eq(0).prepend(html);
$('#slashboxes .ntv-sponsored-disclaimer a span:first-child').html('Featured Content');
}
});
}
//announcement NEL
if(document.getElementById('announcementText')){
$('#announcementText').hide();
var hlUrl = '/ajax.pl?op=hl_nel';
if(nelId){
hlUrl += '&nel_id='+nelId;
}
$.ajax({
url: hlUrl,
type: 'POST',
success: function(html){
if(html.length < 10){
$('#announcementText').show();
return;
}
$('#announcementText').html(html).show();
},
error: function () {
$('#announcementText').show();
}
});
}
document.addEventListener('click', (e) => {
const el = e.target.closest('[data-dest]');
if (!el) return;
e.preventDefault();
e.stopPropagation();
const url = el.dataset.dest;
const target = el.dataset.target || '_self';
if (target === '_blank') {
window.open(url, '_blank', 'noopener,noreferrer');
}
});
}
let tracking = false;
bizx.cmp.ifConsent({purposes: ['storage', 'measurement'], vendors: 'sdm'}, initPiwik);
initNels();
function trackNelImpressions() {
const nelimps = document.querySelectorAll('img[data-name="nel-impression"]:not([data-nel-processed])');
nelimps.forEach((imp) => {
imp.setAttribute('data-nel-processed', '1'); // prevent re-processing
const imp_url = imp.getAttribute('data-source');
if (!imp_url) {
return;
}
imp.src = imp_url;
});
}
function startTracking(){
if (tracking) return;
tracking = true;
trackNelImpressions();
}
const observer = new MutationObserver(function(mutations) {
if (!tracking) return;
for (const m of mutations) {
for (const node of m.addedNodes) {
if (node.nodeType !== 1) continue; // element only
trackNelImpressions(node);
}
}
});
observer.observe(document.body, { childList: true, subtree: true });
bizx.cmp.ifConsent({purposes: ['storage', 'measurement', 'ads'], vendors: 'sdm'}, function(){
startTracking();
});
<!-- 6sense -->
bizx.cmp.ifConsent({purposes: 'all', vendors: '6sense'}, async() => {
(function(){
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";
b.async = true;b.defer=true;b.id='6senseWebTag';
b.src = "https://j.6sc.co/j/58729049-be80-466a-9abf-b3911430bbd8.js";
s.parentNode.insertBefore(b, s);
})();
})
</script>
<script src="//a.fsdn.com/con/js/sandiego/maxnav.js?2026-08-07"></script>
<script data-source="slashdot" src="//a.fsdn.com/con/js/sandiego/floating-unit.js?2026-08-07"></script>
<script id="after-content" type="text/javascript">
(function( $, fn, console ){
$ && fn && $(function(){ fn($, console); });
})(window.jQuery, window.pageload_done, window.console);
</script>
<script type='text/javascript'>
if(!document.location.href.match(/source=autorefresh/)) {
document.write('<img src="//slashdot.org/images/js.gif?413">');
}
</script>
<noscript>
<img src="//slashdot.org/images/njs.gif?530">
</noscript>
<div class="busy genericspinner hide"><span>Working...</span></div>
<script>
var regular_opt_out_link = true;
if (bizx.cmp.show_do_not_sell()) {
regular_opt_out_link = false;
document.getElementById('opt-out-button').setAttribute('style', 'display:inline');
}
if (window.is_euro_union === 1) {
regular_opt_out_link = false;
var elem = '<a href="#" title="Privacy Choices" onclick="bizx.cmp.promptConsent(); return false;">Privacy Choices</a>';
document.getElementById('opt-out-link').innerHTML = elem;
}
if (regular_opt_out_link == true) {
var elem = '<a href="https://slashdotmedia.com/opt-out-choices" title="Opt Out" rel="nofollow">Opt Out</a>';
document.getElementById('opt-out-link').innerHTML = elem;
}
var cmp_modal = document.getElementById('ccpa-modal');
var btn = document.getElementById('opt-out-button');
var span = document.getElementById('modal-close');
btn.onclick = function() {
cmp_modal.style.display = 'block';
};
span.onclick = function() {
cmp_modal.style.display = 'none';
};
</script>
<script>
if(typeof(Storage)!=="undefined"){
window.scrollTo(0,sessionStorage.scrollPos);
$(window).scroll(function () {
//You've scrolled this much:
sessionStorage.scrollPos = $(window).scrollTop();
});
}
$(function(){
$('a').click(function(){
delete sessionStorage.scrollPos;
})
});
// window.onbeforeunload = function () {
// console.log('bakc button clicked');
// delete sessionStorage.scrollPos;
// }
window.onpopstate=function() {
delete sessionStorage.scrollPos;
}
</script>
<script>
var current_time = (new Date()).getTime();
var image_url = 'https://io.narrative.io/?companyId=2440&id=site_name:slashdot.org&id=url:' + window.location.pathname + '&rand=' + current_time;
let hem = bizx.uids.getHem();
if (hem) {
image_url += '&id=hem:' + hem;
}
function naLoad() {
var image = new Image()
image.src = image_url;
image.style.display = "none";
image.style.height = 0;
image.style.width = 0;
document.body.appendChild(image)
}
bizx.cmp.ifConsent({ purposes: 'all', vendors: 'narrative'}, naLoad);
bizx.cmp.ifConsent({ purposes: 'all', vendors: 'xandr'}, function() {
<!-- xandr !-->
!function(e,i){if(!e.pixie){var n=e.pixie=function(e,i,a){n.actionQueue.push({action:e,actionValue:i,params:a})};n.actionQueue=[];var a=i.createElement("script");a.async=!0,a.src="//acdn.adnxs.com/dmp/up/pixie.js";var t=i.getElementsByTagName("head")[0];t.insertBefore(a,t.firstChild)}}(window,document);
pixie('init', '44bba44a-d920-4ad6-ad5c-6142072898f3' );
pixie('event', 'PageView');
})
</script>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a28c31f86b763d78',t:'MTc4NjMzNTQ5MQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>
<!-- footer type=current end -->