Stories
Slash Boxes
Comments

SoylentNews is people

Log In

Log In

Create Account  |  Retrieve Password


My Tour of The Hanford Site

Posted by Sir Finkus on Sunday August 02 2015, @04:51AM (#1359)
0 Comments
Science

The other day, I had the opportunity to take a 5 hour tour of the Hanford Site in Washington State. I figured I’d do a write up of my experience for the curious. I’m not a great writer and mainly going off memory here, so apologies if I make any factual errors.

First, a little background. The Hanford site is located near Richland in South East Washington. During World War 2 and throughout the cold war, they were responsible for enriching Uranium into Plutonium for our nuclear weapons program. Plutonium from Hanford was used in the first atomic bomb detonated in the Trinity test, and in the “Fat Man” atomic bomb dropped on Nagasaki. It is also home of the “B” reactor, the world’s first plutonium production reactor. These days Hanford is known as being the most contaminated nuclear site in the United States.

After getting up at 2 AM in order to reach in Richland in time for the 7:30 AM tour start, we arrived in a nondescript business park in the industrial section of the city. Our IDs were checked, we were given badges, and forced to surrender phones, cameras, and other recording devices (sorry! no pictures). We were then ushered into a small conference room with a television. Our tour guide, a retired nuclear engineer, introduced himself and we watched a cheesy video. Then we boarded a bus and began the drive to the site.

During the journey, we passed by the fuel processing facility for the Columbia Generating Station which is near the Hanford site. The Columbia Generating Station is the only operating nuclear power plant in Washington State and produces 1,170 megawatts of electricity.

Shortly before leaving Richland, we took a brief stop at the HAMMER training area. This is where workers at the Hanford Site train to deal with radiation and other hazards they may encounter. That facility was quite extensive, but we only got to see an above-ground replica of the tanks that were used to dispose of liquid nuclear waste. There are around 200 of these tanks buried on the site, and each tank can hold 500,000 to 1,000,000 gallons of waste. The main purpose of the facility at Hammer is to attempt to develop new tools and technology to remove the remaining waste from the older (and leaking) single walled tanks into newer and safer double walled tanks for storage until the Vitrification plant is completed. Our guide explained that all of the liquid that could be pumped out of the old tanks had already been removed. The trouble is that over time, the waste in the tanks settled at the bottom of the tanks. It’s an interesting engineering problem because this “sludge” is highly toxic, often corrosive, and radioactive. Some of the remaining material has a consistency like peanut butter and some is more like a hard salt cake. The current strategy seems to be lowering robots down the 1 foot wide access tube and breaking up the waste with high pressure water.

We left the HAMMER facility and began our journey to the actual site. We passed the Columbia Generating Station run by Energy Northwest on the way. It sits right on the edge of the Columbia river. We didn’t get very close to it, but it didn’t look like what most people imagine a Nuclear Power plant looks like. It’s a newer version of the infamous Fukushima reactor in Japan. An unremarkable industrial building with several short cooling towers giving off steam. The plant is a closed loop plant, which means that the water that is heated by the reactor to drive the steam turbines never makes contact with the outside world. After it goes through the turbines, it is pumped into the cooling towers where the pipes are cooled evaporatively with water from the Columbia River, which is returned to the river after being allowed to cool off.

After about a 10 minute drive, we hit the security gate. An armed guard in a military-style uniform waved us on the site. I don’t know if they actually use the military to guard the facility, and I saw many private security guards around some of the construction sites.

Now we were on the site itself. It’s worth mentioning that the vast majority of Hanford is just empty desert. If you ignore the lack of farms, suspicious number of high tension power lines, and little yellow “Danger: Radiation” signs you see everywhere, you’d have little indication that you are on a nuclear site. Most of the facilities have been torn down or cocooned. Occasionally you’ll see a flat spot or a concrete pad where a building used to be. I even saw an old road running through the road we were on at a 45 degree angle. It looked like they’d just added a 2 foot layer of dirt and paved the road we were traveling on right over it.

The part we were currently in was where the reactors were built. Most of these have been completely shut down and closed off, and there was very little activity in this area. It’s also the old site of the towns of Hanford and White Bluffs, which were reclaimed when the site was founded. Very little remained of the towns. Hanford High School and the White Bluffs Bank are the only structures that are still standing. The only other evidence of the towns are the old trees planted by the residents. Trees in that part of the state are pretty rare. You could usually get a good idea of where the old buildings are by looking for them. For instance, near where the Hanford railroad station used to be are a row of trees planted neatly next to the railroad tracks.

The first building we passed that was part of the actual facility was the fuel processing plant, where fuel would be prepared for the reactors. This building hadn’t been torn down yet because the ground under it was highly contaminated. The building itself is blocking the radiation in the ground. They are currently trying to figure out a way to remove the contaminated soil without collapsing the building on top of it. One idea was to remove the soil underneath the building slowly and backfill it as they went.

The reactors themselves were mostly shrouded in concrete, de-fueled, and closed off. Unfortunately, they weren’t very exciting to look at. Basically just three to four story tall windowless concrete buildings. The first two we saw were involved in the generation of enriched uranium for our nuclear weapons program. There were another two smaller reactors that were used as research reactors. These had the classic concrete domed structures you’d expect to see. Only one of the reactors at Hanford was actually used for power generation. Although safer than the Chernobyl reactor, it was shut down shortly after the disaster because it had a similar design. The reactors were given letter names roughly alphabetically. The “K” reactors are an interesting exception. During the construction of the first K reactor, a problem was found with the design, so they built a re-designed version only yards away. Eventually they were able to fix the problem with the first reactor and they now stand side by side.

The “B” reactor was our first time off the bus. It’s about 4 stories tall and the first production reactor in the world. Fuel produced at the plant was used in the Trinity test device, and the “Fat Man” bomb dropped on Nagasaki. We were led inside the plant, and after a short hallway we were standing feet from the face of the reactor. The reactor itself was about 3 stories tall, and had hundreds of high-pressure water pipes and countless valves leading to the pipes. There were several cranes and gantries that were used to make adjustments, add fuel, and preform maintenance. After watching a short video, we were allowed to explore the building for about a half hour. A lot of the building was roped off, but apparently you can explore more of it during the specific reactor tours.

The control room might be of particular interest to the folks here. It’s remarkable how sophisticated the all-analog equipment was. Instead of CRTs or LCD displays, spools of paper unwound behind glass panels while arms tracked performance of the reactor by drawing on the paper. There was an entire wall of gauges monitoring the water pressure of all the previously mentioned pipes going into the face of the reactor. These were plumbed directly into the reactor. Behind the panel was a small access hallway with a dizzying array of pipes and valves servicing the gauges. I imagine it was rather loud in the control room when it was operating.

All these pipes and valves were serviced by a pumphouse (a separate building) that would filter and pump millions of gallons of water through the reactor directly from the Columbia river. The water would emerge moments later nearly boiling (not bad for a pile of rocks) and be pumped off to a cooling pit, then pumped directly back into the Columbia river.

This area of the site had quite a bit more activity than where the other reactors were. Once we boarded the bus again, dump trucks carrying loads of contaminated dirt were a common sight. Our guide also pointed out some of the areas where the tanks were buried. The tank sites were all roped off and there were little yellow radiation signs every 5 feet or so in a grid. There wasn’t much to see aboveground. Just shallow hills with pipes sticking out of the ground, some electrical boxes, fire hydrants, and concrete blocks to protect them from vehicles.

We continued on to the area where the irradiated uranium from the reactors was refined and processed into plutonium for the nuclear weapons. I suspect this was the main reason for the tight security as the next set of buildings would create diplomatic incidents if discovered in the wrong countries. Here things were very busy. Most of the processing plants were in the process of being entombed or decommissioned, and there were lots of construction vehicles and trailers surrounding the plants. The plants themselves were pretty generic looking. Five story tall windowless concrete buildings, probably about 200 meters long with a single smokestack at one end. Most of them had loading docks for trucks, and one of them even had a door over railroad tracks so the material could be unloaded directly inside.

For obvious reasons, we couldn’t get very close to the processing plants. We did watch a short video about them on the bus. This told the story of the “McCluskey Room” in the Plutonium Finishing Plant. While Harold McCluskey was extracting Americium in a glove box, there was an explosion and the entire room was covered in radioactive material and nitric acid. McCluskey was exposed to the highest dose of radiation from americium ever recorded, and the room was sealed off. Only recently have workers been able to re-enter the room and begin decontaminating it. The Plutonium Finishing plant still stands, but is likely to be demolished within the next year or two. If you’re interested in seeing it, you’d better sign up for a tour soon! McCluskey died of natural causes in 1987 at age 75.

The Plutonium Finishing Plant (“Z plant”) was the last step in plutonium construction at the site. It was also one of the most heavily guarded sites at Hanford. After the plutonium “buttons” were produced, they were stored in a heavily guarded vault on the site. The last plutonium stored there left the facility in 2009, along with the armed guards and heavy restrictions on the employees of the facility.

The tour shifted gears here. Now the focus was much heavier on the decontamination efforts and the purposes of some of the new buildings and the ones under construction. Our next stop was the “Environmental Restoration Disposal Facility” err, landfill. This was where low level nuclear waste and hazardous materials such as asbestos and lead were buried. If you’ve ever been to a conventional landfill you have a pretty good idea of what this looked like. The waste is sealed in large plastic bags and dumped into pits. Water trucks and workers spraying the smooth, sandy ground with hoses were everywhere, giving the site an appearance eerily similar to a beach. The air quality is heavily monitored in the area.

We had two stops left on our tour. The first stop was a water treatment plant specializing in treating groundwater in the area. As you’d expect, it’s a dizzying array of shiny pipes and tanks. Water is pumped up from the contaminated aquifer, treated with microbes that absorb the radiation, then returned to the aquifer in strategic locations in an attempt to flush out the contamination. The water that leaves the plant is safe enough to drink. The radioactive microbe slurry is deposited into dump trucks, then ferried off for further processing, or to be put in the landfill.

Our final stop on the site was the vitrification plant. Along the way we passed a large pit containing the spent reactors from nuclear submarines and ships. The vitrification plant has been under construction since the early 2000s and is expected (provided funding doesn’t dry up) to be completed sometime around 2030. It’s a massive facility that will separate and process the high-level nuclear waste located in the tank farms and elsewhere into a glasslike substance. The glass is very stable, and will be put in steel canisters until the radiation decays. The original plan was to ship the canisters to Yucca mountain, but with that project on hold, it is uncertain what the fate of the nuclear waste will be.

As we drove out of the site, we also passed the LIGO Hanford observatory. It is unrelated to the Hanford site, but it was pretty neat to see anyway. Apparently scientists are firing lasers down 4KM long tubes to attempt to detect gravity waves. There is a sister site in Louisiana to rule out any false readings from local interference. I don’t know much more about it, but the facility was very impressive.

Hanford offers tours of the site to the public. The 5 hour tour that we went on was focused more the decontamination efforts and requires that participants have US citizenship and ID. There were also no cameras, phones, or recording devices allowed on the 5 hour tour. If you are more interested in the Historic B Reactor, they also offer a shorter tour of that, and you can bring your cell phones and cameras. I’d recommend the B reactor tour if you’re more interested in the historical and technology side. The B reactor also looks like a multiplayer map in Half-Life, so it’d probably fun if you’re into industrial/nuclear porn.

Subscribed for real

Posted by jdavidb on Sunday August 02 2015, @02:53AM (#1358)
0 Comments
Code
Okay, now I really am subscribed, thanks to the efforts of the Soylentnews staff. Thanks, guys! I'm proud to be a supporter!

Soylent Upgrade Greasemonkey/Tampermonkey extension v10

Posted by takyon on Friday July 31 2015, @11:18PM (#1357)
9 Comments
Code

// ==UserScript==
// @name Soylent Upgrade
// @match http://soylentnews.org/*article.pl*
// @match https://soylentnews.org/*article.pl*
// @match http://soylentnews.org/*submit.pl*
// @match https://soylentnews.org/*submit.pl*
// @match http://soylentnews.org/*admin.pl*
// @match https://soylentnews.org/*admin.pl*
// @match http://soylentnews.org/*comments.pl*
// @match https://soylentnews.org/*comments.pl*
// @match http://soylentnews.org/*journal.pl*
// @match https://soylentnews.org/*journal.pl*
// ==/UserScript==

// User Options:

var simplifyChars = true; // Change to false if you don't want stylized quotation marks, ellipses, etc. to be replaced
var stripEmail = false; // Remove auto-filled email from submission

// End User Options

/* ! http://mths.be/fromcodepoint v0.1.0 by @mathias */

if (!String.fromCodePoint) { (function() { var defineProperty = (function() { try { var object = {}; var $defineProperty = Object.defineProperty; var result = $defineProperty(object, object, object) && $defineProperty; } catch(error) {} return result; }()); var stringFromCharCode = String.fromCharCode; var floor = Math.floor; var fromCodePoint = function() { var MAX_SIZE = 0x4000; var codeUnits = []; var highSurrogate; var lowSurrogate; var index = -1; var length = arguments.length; if (!length) { return ''; } var result = ''; while (++index < length) { var codePoint = Number(arguments[index]); if ( !isFinite(codePoint) || codePoint < 0 || codePoint > 0x10FFFF || floor(codePoint) != codePoint ) { throw RangeError('Invalid code point: ' + codePoint); } if (codePoint <= 0xFFFF) { codeUnits.push(codePoint); } else { codePoint -= 0x10000; highSurrogate = (codePoint >> 10) + 0xD800; lowSurrogate = (codePoint % 0x400) + 0xDC00; codeUnits.push(highSurrogate, lowSurrogate); } if (index + 1 == length || codeUnits.length > MAX_SIZE) { result += stringFromCharCode.apply(null, codeUnits); codeUnits.length = 0; } } return result; }; if (defineProperty) { defineProperty(String, 'fromCodePoint', { 'value': fromCodePoint, 'configurable': true, 'writable': true }); } else { String.fromCodePoint = fromCodePoint; } }()); }

// Add "Quote This" buttons to all initially visible comments

var spans = document.getElementsByTagName("span");
for (var x=0; x<spans.length; x++)
{
    if (spans[x].id.indexOf("reply_link_")==0)
    {
        var button = document.createElement("span");
        button.setAttribute("class","nbutton");
        var p = document.createElement("p");
        var b = document.createElement("b");
        var a = document.createElement("a");
        // Set the href of the "Quote This" button to the href of the "Reply to This" button, with the escaped contents of the post added to URL and any [domain.names] following links in the post cut out:
        a.setAttribute("href",spans[x].getElementsByTagName("a")[0].href.replace("#post_comment","&postercomment="+escape("<blockquote>"+document.getElementById("comment_body_"+spans[x].id.replace("reply_link_","")).innerHTML.replace(/<\/a>\s\[.*?\..*?\]/g,"<\/a>")+"<\/blockquote>\n\n")+"#post_comment"));
        // To Do: Shorten URLs longer than 2000 characters
        a.appendChild(document.createTextNode("Quote This"));
        b.appendChild(a);
        p.appendChild(b);
        button.appendChild(p);
        spans[x].parentNode.insertBefore(button, spans[x].nextSibling);
        spans[x].parentNode.insertBefore(document.createTextNode(" "), spans[x].nextSibling); // Divider
    }
}

if (stripEmail && window.location.href.search(/https?\:\/\/soylentnews\.org.*?\/submit\.pl/)!=-1) // Empty email input area, but only on submission page
{
    var boxes = document.getElementsByTagName("input");
    for (var x=0; x<boxes.length; x++)
    {
        if (boxes[x].name == "email")
        {
            boxes[x].value = "";
        }
    }
}

// Add title case button next to title/subj field on Story Submissions, Submission Preview, and Story Preview
if (window.location.href.search(/https?\:\/\/soylentnews\.org.*?\/(submit|admin)\.pl/)!=-1)
{
    var boxes = document.getElementsByTagName("input");
    for (var x=0; x<boxes.length; x++)
    {
        if (boxes[x].name == "title" || boxes[x].name == "subj")
        {
            boxes[x].id = "storyTitle";
            var button = document.createElement("input");
            button.setAttribute("type","button");
            button.setAttribute("value","Title Case");
            button.setAttribute("title","Convert title to title case.");
            button.setAttribute("onclick","document.getElementById('storyTitle').value=document.getElementById('storyTitle').value.replace(/^\\s/gi,'').replace(/\\b([a-z])/gi,function(m, p1){return p1.toUpperCase();}).replace(/\\b(at|of|is|and|to|in|by|as|its|be|the|on|a|an|but|or|for)\\b/gi,function(m, p1){return p1.toLowerCase();}).replace(/^([a-z])/gi,function(m, p1){return p1.toUpperCase();}).replace(/:\\s([a-z])/gi,function(m, p1){return ': '+p1.toUpperCase();}).replace(/([a-z])'([a-z])/gi,function(m, p1, p2){return p1+'\\''+p2.toLowerCase();}).replace(/\\bx(86|64)\\b/gi,'x$1').replace(/\\s$/gi,'');");
            boxes[x].parentNode.insertBefore(button, boxes[x].nextSibling);
            if (window.location.href.search(/https?\:\/\/soylentnews\.org.*?\/admin\.pl/)!=-1 || boxes[x].name == "subj")
            {
                boxes[x].parentNode.insertBefore(document.createElement("br"), boxes[x].nextSibling);
            }
            else
            {
                boxes[x].parentNode.insertBefore(document.createTextNode(" "), boxes[x].nextSibling);
            }
        }
    }
}

// Add warning for creating a story in the past

if (window.location.href.search(/https?\:\/\/soylentnews\.org.*?\/admin\.pl/)!=-1)
{
    var boxes = document.getElementsByTagName("input");
    for (var x=0; x<boxes.length; x++)
    {
        if (boxes[x].name == "op" && (boxes[x].value == "save" || boxes[x].value == "update"))
        {
            // New onclick extracts the post date, compares to the current date, and only submits if the post date is in the future or the user overrides the warning:
            boxes[x].setAttribute("onclick","var d = new Date(document.getElementById('slashstoryform').elements['time'].value.replace(/\\s/,'T')); var a = true; if (d < Date.now()){a = confirm('Are you sure you want to post a story '+(Math.round((Date.now()-d)/60000))+' minutes in the past?');} if (a) {st_submit(this);}");
        }
    }
}

var boxes = document.getElementsByTagName("textarea");
for (var x=0; x<boxes.length; x++)
{
    if (boxes[x].name == "introtext" || boxes[x].name == "bodytext" || boxes[x].name == "story")
    {
        var temp = boxes[x].value; // Retrieve textarea contents
        temp = temp.replace(/<\/p><p>/g,"<\/p>\n\n<p>"); // Add newlines between paragraphs
        temp = temp.replace(/<br>\s?<br>/g,"<\/p>\n\n<p>"); // Convert double break tags to paragraph tags
        temp = temp.replace(/<\/blockquote><p>/g,"<\/blockquote>\n\n<p>"); // Add newlines after blockquotes
        temp = temp.replace(/<\/p><blockquote>/g,"<\/p>\n\n<blockquote>"); // Add newlines before blockquotes
        temp = temp.replace(/<blockquote><div><p>/g,"<blockquote><div>\n\n<p>"); // Add newlines within start of blockquotes
        temp = temp.replace(/<\/p><\/div><\/blockquote>/g,"<\/p>\n\n<\/div><\/blockquote>"); // Add newlines within end of blockquotes
        temp = temp.replace(/<\/blockquote><blockquote>/g,"<\/blockquote>\n\n<blockquote>"); // Add newlines between two blockquotes
        temp = temp.replace(/<p class="byline">\s/i,"<p class=\"byline\">"); // Remove extra space from byline
        temp = temp.replace(/<p>\s/g,"<p>"); // Remove extra space from start of paragraph
        temp = temp.replace(/\s<\/p>/g,"<\/p>"); // Remove extra space from end of paragraph
        temp = temp.replace(/<\/li><li>/g,"<\/li>\n<li>"); // Add newlines between list items
        temp = temp.replace(/(<\/li>)(<\/[u|o]l>)/g,'$1\n$2'); // Add newline after last list item
        temp = temp.replace(/(<\/p>)(<[u|o]l>)/g,'$1\n$2'); // Add newlines before lists
        temp = temp.replace(/<p>\[...\]/g,"<p>[...] "); // Add space within beginning of foreshortened paragraph
        while (temp.indexOf("  ")!=-1)
        {
            temp = temp.replace(/  /g," "); // Replace double spaces with single spaces
        }
        if (simplifyChars)
        {
            temp = temp.replace(/\u2018/g,"'"); // 'LEFT SINGLE QUOTATION MARK' (U+2018) to (U+0027)
            temp = temp.replace(/\u2019/g,"'"); // 'RIGHT SINGLE QUOTATION MARK' (U+2019) to (U+0027)
            temp = temp.replace(/\u201C/g,"\""); // 'LEFT DOUBLE QUOTATION MARK' (U+201C) to (U+0022)
            temp = temp.replace(/\u201D/g,"\""); // 'RIGHT DOUBLE QUOTATION MARK' (U+201D) to (U+0022)
            temp = temp.replace(/\u2026/g,"..."); // 'HORIZONTAL ELLIPSIS' (U+2026) to (U+002E) x3
        }
        boxes[x].value = temp;
        boxes[x].rows = 32; // Expand textarea height to 32 rows
    }
    var toolbar = document.createElement("div");

    // Blockquote button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","Blockquote");
    tempbutton.setAttribute("title","Wrap \u003Cblockquote\u003E tags around the selected text.");
    tempbutton.setAttribute("onclick","addBlockquote(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Paragraph and Line break buttons
    var tempspan = document.createElement("span");
    tempspan.setAttribute("id","htmlFormatButtons");
    if (document.getElementById("posttype") && document.getElementById("posttype").selectedIndex == 0)
    {
        tempspan.setAttribute("style","display:none;"); // Hide if initial post type option is "Plain Old Text"
    }
    if (document.getElementById("posttype"))
    {
        document.getElementById("posttype").addEventListener("change", function() {if (document.getElementById('posttype').selectedIndex == 0) {document.getElementById('htmlFormatButtons').style.display = 'none'} else {document.getElementById('htmlFormatButtons').style.display = 'inline'}}); // Change visibility of these buttons based on value of post type
    }
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","P");
    tempbutton.setAttribute("title","Wrap \u003Cp\u003E tags around the selected text.");
    tempbutton.setAttribute("onclick","addPara(document.getElementsByTagName('textarea')["+x+"]);");
    tempspan.appendChild(tempbutton);
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","BR");
    tempbutton.setAttribute("title","Insert a line break.");
    tempbutton.setAttribute("onclick","addBreak(document.getElementsByTagName('textarea')["+x+"]);");
    tempspan.appendChild(tempbutton);
    toolbar.appendChild(tempspan);

    // HR button, if editing a story
    if (boxes[x].name == "introtext" || boxes[x].name == "bodytext" || boxes[x].name == "story")
    {
        var tempbutton = document.createElement("input");
        tempbutton.setAttribute("type","button");
        tempbutton.setAttribute("value","HR");
        tempbutton.setAttribute("title","Insert a horizontal rule.");
        tempbutton.setAttribute("style","text-decoration:underline overline;");
        tempbutton.setAttribute("onclick","addHRule(document.getElementsByTagName('textarea')["+x+"]);");
        tempspan.appendChild(tempbutton);
        toolbar.appendChild(tempspan);
    }

    // URL button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","URL");
    tempbutton.setAttribute("title","Create a hyperlink around the selected text.");
    tempbutton.setAttribute("style","text-decoration:underline;");
    tempbutton.setAttribute("onclick","addHyperlink(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);
    toolbar.appendChild(document.createTextNode(" "));

    // Bold button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","B");
    tempbutton.setAttribute("title","Bold");
    tempbutton.setAttribute("style","font-weight:bold;");
    tempbutton.setAttribute("onclick","addBold(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Italic button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","I");
    tempbutton.setAttribute("title","Italic");
    tempbutton.setAttribute("style","font-style:italic;");
    tempbutton.setAttribute("onclick","addItalic(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Strike button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","S");
    tempbutton.setAttribute("title","Strikethrough");
    tempbutton.setAttribute("style","text-decoration:line-through;");
    tempbutton.setAttribute("onclick","addStrike(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    toolbar.appendChild(document.createTextNode(" ")); // Divider

    // Code button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","Code");
    tempbutton.setAttribute("title","Wrap \u003Cecode\u003E tags around the selected text.");
    tempbutton.setAttribute("style","font-family:monospace;");
    tempbutton.setAttribute("onclick","addEcode(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Teletype button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","TT");
    tempbutton.setAttribute("title","Wrap \u003Ctt\u003E (teletype, i.e. monospace) tags around the selected text.");
    tempbutton.setAttribute("style","font-family:monospace;");
    tempbutton.setAttribute("onclick","addTT(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Small button, if editing a story
    if (boxes[x].name == "introtext" || boxes[x].name == "bodytext" || boxes[x].name == "story")
    {
        var tempbutton = document.createElement("input");
        tempbutton.setAttribute("type","button");
        tempbutton.setAttribute("value","\u0073\u1D0D\u1D00\u029F\u029F");
        tempbutton.setAttribute("title","Wrap \u003Csmall\u003E tags around the selected text.");
        // tempbutton.setAttribute("style","font-size:75%;");
        tempbutton.setAttribute("onclick","addSmall(document.getElementsByTagName('textarea')["+x+"]);");
        toolbar.appendChild(tempbutton);
    }

    toolbar.appendChild(document.createTextNode(" ")); // Divider

    // Superscript button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","x\u00B2");
    tempbutton.setAttribute("title","Superscript");
    tempbutton.setAttribute("style","font-family:monospace;");
    tempbutton.setAttribute("onclick","addSuper(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Subscript button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","x\u2082");
    tempbutton.setAttribute("title","Subscript");
    tempbutton.setAttribute("style","font-family:monospace;");
    tempbutton.setAttribute("onclick","addSubsc(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    toolbar.appendChild(document.createTextNode(" ")); // Divider

    // Ordered list button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","1. List");
    tempbutton.setAttribute("title","Insert an ordered list or convert newline-separated text into an ordered list.");
    tempbutton.setAttribute("onclick","addOrdlist(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Unordered list button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","\u2022 List");
    tempbutton.setAttribute("title","Insert an unordered list or convert newline-separated text into an unordered list.");
    tempbutton.setAttribute("onclick","addUnordlist(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    toolbar.appendChild(document.createElement("br")); // Divider

    // Create 7 macro buttons
    for (var i=1; i<=7; i++)
    {
        // Create macros if they don't exist
        if(!localStorage.getItem("soymacro"+i))
        {
            localStorage.setItem("soymacro"+i,JSON.stringify(["M"+i,"string","Sample Text"]));
            //localStorage.setItem("soymacro"+i,JSON.stringify(["M"+i,"regexp","/a/gi","b"]));
        }
        var tempbutton = document.createElement("input");
        tempbutton.setAttribute("type","button");
        tempbutton.setAttribute("id","soymacros"+x+"button"+i);
        tempbutton.setAttribute("value",JSON.parse(localStorage.getItem("soymacro"+i))[0]);
        if (JSON.parse(localStorage.getItem("soymacro"+i))[1]=="string")
        {
            if (JSON.parse(localStorage.getItem("soymacro"+i))[2].length < 40)
            {
                tempbutton.setAttribute("title","Insert or replace selected text with: " + JSON.parse(localStorage.getItem("soymacro"+i))[2]);
            }
            else
            {
                tempbutton.setAttribute("title","Insert or replace selected text with: " + JSON.parse(localStorage.getItem("soymacro"+i))[2].substring(0,40)+"...");
            }
            tempbutton.setAttribute("onclick","macroChoose(document.getElementsByTagName('textarea')["+x+"],"+i+");");
        }
        else
        {
            tempbutton.setAttribute("title","Replace text matched by the regular expression: " + JSON.parse(localStorage.getItem("soymacro"+i))[2] + " with: " + JSON.parse(localStorage.getItem("soymacro"+i))[3]);
            tempbutton.setAttribute("onclick","macroChoose(document.getElementsByTagName('textarea')["+x+"],"+i+");");
        }
        toolbar.appendChild(tempbutton);
    }
    // Create macros edit button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","Edit");
    tempbutton.setAttribute("title","Configure user macros or discard changes.");
    tempbutton.setAttribute("onclick","if (document.getElementById('macrobar"+x+"').style.display == 'none') {document.getElementById('macrobar"+x+"').style.display = 'block'; macrobarInit("+x+");} else {document.getElementById('macrobar"+x+"').style.display = 'none'; if (p = document.getElementById('postercomment')) { var x = p.offsetTop; while (p = p.offsetParent) {x += p.offsetLeft;} window.scrollTo(0,x-75);}}");
    toolbar.appendChild(tempbutton);

    toolbar.appendChild(document.createElement("br")); // Divider

    // Despace button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value","Despace");
    tempbutton.setAttribute("title","Delete newlines within the selection.");
    tempbutton.setAttribute("onclick","despace(document.getElementsByTagName('textarea')["+x+"]);");
    toolbar.appendChild(tempbutton);

    // Symbol button
    var tempbutton = document.createElement("input");
    tempbutton.setAttribute("type","button");
    tempbutton.setAttribute("value",":-)");
    tempbutton.setAttribute("title","Insert a symbol.");
    tempbutton.setAttribute("onclick","if (document.getElementById('smilebar"+x+"').style.display == 'none') {document.getElementById('smilebar"+x+"').style.display = 'block'} else {document.getElementById('smilebar"+x+"').style.display = 'none'; if (p = document.getElementById('postercomment')) { var x = p.offsetTop; while (p = p.offsetParent) {x += p.offsetLeft;} window.scrollTo(0,x-75); } }");
    toolbar.appendChild(tempbutton);
    boxes[x].parentNode.insertBefore(toolbar, boxes[x].nextSibling);

    // Symbol list
    var smilebar = document.createElement("div");
    smilebar.setAttribute("style","-moz-user-select:none; -webkit-user-select:none; display:none; font-size:16pt; max-height:240px; overflow:auto; padding:0.5em;");
    smilebar.setAttribute("id","smilebar"+x);
    var smiles = ["\u0026amp;","\u0026lt;","\u0026gt;"];

    var codes = [[161,169],[171,172],[174],[176,177],[180,183],[187,191],[215],[224,255],[402],[629],[632],[916],[920],[931],[934],[937],[945,946],[956],[960],[963],[8216,8221],[8226],[8230],[8251],[8364],[8478],[8482],[8528,8542],[8585],[8592,8652],[8712,8716],[8721],[8730],[8733,8734],[8736],[8743,8749],[8756,8757],[8773],[8776],[8800,8805],[8834,8837],[8984],[9760],[9762,9765],[9770],[9773,9775],[9784,9794],[9812,9831],[9833,9842],[9850],[9855,9861],[9874,9877],[9882,9885],[9888,9893],[9913],[9940],[9962],[9971],[9981],[9992,10087],[65533],[127744,127756],[127759],[127775,127776],[127797],[127801],[127804,127812],[127817],[127820,127822],[127828,127831],[127838,127839],[127843],[127849],[127855],[127860,127867],[127891],[127904,127911],[127918],[127939],[127942],[127977],[128025],[128074,128078],[128123,128131],[128137,128142],[128148,128150],[128152],[128158],[128161,128164],[128168,128170],[128172],[128176,128177],[128187],[128189,128190],[128193,128194],[128197],[128203,128204],[128206],[128214],[128225,128227],[128231,128233],[128241],[128244],[128246],[128250,128252],[128259],[128266,128270],[128273,128276],[128278,128280],[128286],[128293,128299],[128302,128303],[128509,128510],[128659],[128684,128685]];

    for (var i=0; i<codes.length; i++) { if (codes[i].length > 1) { for (var j=codes[i][0]; j<=codes[i][1]; j++) { smiles[smiles.length] = String.fromCodePoint(j); } } else { smiles[smiles.length] = String.fromCodePoint(codes[i][0]); } } // Populate smiles array with code ranges converted to individual characters

    smiles = smiles.concat(["xD",":-)",":^)","(^_^;)","\u0028\u00A0\u0361\u00B0\u00A0\u035C\u0296\u00A0\u0361\u00B0\u0029","\u0028\u00A0\u0361\u007E\u00A0\u035C\u0296\u00A0\u0361\u00B0\u0029\uFEFF","\u00AF\u005C\u005F\u0028\u30C4\u0029\u005F\u002F\u00AF","\u0028\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35\u00A0\u253B\u2501\u253B","\u0028\u30CE\u0CA0\u76CA\u0CA0\u0029\u30CE\u5F61\u253B\u2501\u253B","\u0028\u0060\uFF65\u03C9\uFF65\u00B4\u0029","\u0CA0_\u0CA0","\u0295\u2022\u1D25\u2022\u0294","\u0028\u3065\uFFE3\u00A0\u00B3\uFFE3\u0029\u3065","\u0669\u0028\u204E\u275B\u1D17\u275B\u204E\u0029\u06F6","\u30FD\u0F3C\u0E88\u0644\u035C\u0E88\u0F3D\uFF89"]); // Add in arbitrary emoticons

    for (var i=0; i<smiles.length; i++)
    {
        var smile = document.createElement("span");
        smile.setAttribute("style","cursor:pointer; padding:2px; white-space:nowrap;");
        smile.setAttribute("onclick","addSmile(document.getElementsByTagName('textarea')["+x+"],'"+smiles[i].replace("\u005C","\u005C\u005C")+"');");
        smile.appendChild(document.createTextNode(smiles[i]));
        smilebar.appendChild(smile);
        if (i+1<smiles.length)
        {
            smilebar.appendChild(document.createTextNode(" "));
        }
    }
    toolbar.parentNode.insertBefore(smilebar, toolbar.nextSibling);

    // Create macro configuration interface
    var macrobar = document.createElement("div");
    macrobar.setAttribute("style","display:none; padding:0.5em;");
    macrobar.setAttribute("id","macrobar"+x);
    var table = document.createElement("table");
    var tr = document.createElement("tr");
    var th = document.createElement("th");
    th.appendChild(document.createTextNode("Name"));
    tr.appendChild(th);
    var th = document.createElement("th");
    th.appendChild(document.createTextNode("Type"));
    tr.appendChild(th);
    var th = document.createElement("th");
    th.appendChild(document.createTextNode("String | Expression"));
    tr.appendChild(th);
    var th = document.createElement("th");
    th.setAttribute("title","Only used with expressions. Parenthesized substring matches (e.g. '$1') can be used.");
    th.setAttribute("style","cursor:help;");
    th.appendChild(document.createTextNode("Expression Replace"));
    tr.appendChild(th);
    table.appendChild(tr);
    for (var i=1; i<=7; i++)
    {
        var tr = document.createElement("tr");

        // Macro name
        var td = document.createElement("td");
        var name = document.createElement("input");
        name.setAttribute("type","text");
        name.setAttribute("id","soymacros"+x+"name"+i);
        td.appendChild(name);
        tr.appendChild(td);

        // Macro type
        var td = document.createElement("td");
        var rad = document.createElement("input");
        rad.setAttribute("type","radio");
        rad.setAttribute("name","soymacros"+x+"type"+i);
        rad.setAttribute("id","soymacros"+x+"type"+i+"S");
        td.appendChild(rad);
        td.appendChild(document.createTextNode(" String "));
        var rad = document.createElement("input");
        rad.setAttribute("type","radio");
        rad.setAttribute("name","soymacros"+x+"type"+i);
        rad.setAttribute("id","soymacros"+x+"type"+i+"E");
        td.appendChild(rad);
        td.appendChild(document.createTextNode(" Expression "));
        tr.appendChild(td);

        // Field A
        var td = document.createElement("td");
        var f1 = document.createElement("input");
        f1.setAttribute("type","text");
        f1.setAttribute("id","soymacros"+x+"fieldA"+i);
        td.appendChild(f1);
        tr.appendChild(td);

        // Field B
        var td = document.createElement("td");
        var f1 = document.createElement("input");
        f1.setAttribute("type","text");
        f1.setAttribute("id","soymacros"+x+"fieldB"+i);
        td.appendChild(f1);
        tr.appendChild(td);

        table.appendChild(tr);
    }
    macrobar.appendChild(table);

    var p = document.createElement("p");
    var save = document.createElement("input");
    save.setAttribute("type","button");
    save.setAttribute("value","Save");
    save.setAttribute("title","Save any edits to the macro configuration.");
    save.setAttribute("onclick","macrobarSave("+x+");");
    p.appendChild(save);
    p.appendChild(document.createTextNode(" "));
    var guide = document.createElement("a");
    guide.setAttribute("href","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions");
    guide.setAttribute("target","_blank");
    guide.appendChild(document.createTextNode("Regexp Guide"));
    p.appendChild(guide);
    macrobar.appendChild(p);

    toolbar.parentNode.insertBefore(macrobar, toolbar.nextSibling);
}

var temp = document.createElement("script");

// Add selection handling function
temp.appendChild(document.createTextNode("function getSelection(textarea) { if ('selectionStart' in textarea) { if (textarea.selectionStart != textarea.selectionEnd) { return [textarea.selectionStart,textarea.selectionEnd]; } } } "));

// Add comment formatting buttons
temp.appendChild(document.createTextNode("function addBlockquote(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<blockquote>'+area.value.substring(sel[0],sel[1])+'<\/blockquote>' + area.value.substring(sel[1]); } } function addPara(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<p>'+area.value.substring(sel[0],sel[1])+'<\/p>' + area.value.substring(sel[1]); } } function addBreak(area) { if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,area.selectionStart) + '<br>' + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+4,pos+4) } } function addHRule(area) { if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,area.selectionStart) + '<hr>' + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+4,pos+4) } } function addHyperlink(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { url = prompt('URL:', 'https://'); area.value = area.value.substring(0,sel[0]) + '<a href=\"'+url+'\">'+area.value.substring(sel[0],sel[1])+'<\/a>' + area.value.substring(sel[1]); } } function addBold(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<b>'+area.value.substring(sel[0],sel[1])+'<\/b>' + area.value.substring(sel[1]); } } function addItalic(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<em>'+area.value.substring(sel[0],sel[1])+'<\/em>' + area.value.substring(sel[1]); } } function addStrike(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<strike>'+area.value.substring(sel[0],sel[1])+'<\/strike>' + area.value.substring(sel[1]); } } function addEcode(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<ecode>'+area.value.substring(sel[0],sel[1])+'<\/ecode>' + area.value.substring(sel[1]); } } function addTT(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<tt>'+area.value.substring(sel[0],sel[1])+'<\/tt>' + area.value.substring(sel[1]); } } function addSmall(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<small>'+area.value.substring(sel[0],sel[1])+'<\/small>' + area.value.substring(sel[1]); } } function addSuper(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<sup>'+area.value.substring(sel[0],sel[1])+'<\/sup>' + area.value.substring(sel[1]); } } function addSubsc(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<sub>'+area.value.substring(sel[0],sel[1])+'<\/sub>' + area.value.substring(sel[1]); } } "));

// Add list creation functions
temp.appendChild(document.createTextNode("function addOrdlist(area) { if ('selectionStart' in area) { if (area.selectionStart != area.selectionEnd) { area.value = area.value.substring(0,area.selectionStart) + '<ol><li>' + area.value.substring(area.selectionStart,area.selectionEnd).replace(/\\n/g,'<\/li>\\n<li>').replace(/\\n<li><\\/li>/g,'') + '<\/li><\/ol>' + area.value.substring(area.selectionEnd); } else { temp = '<ol>'; while(listitem = prompt('Enter a list item. Leave the box empty or press Cancel to complete the list:', '')) { temp += '<li>' + listitem + '<\/li>\\n'; } area.value = area.value.substring(0,area.selectionStart) + temp.substring(0,temp.length-1) + '<\/ol>' + area.value.substring(area.selectionStart); } } } function addUnordlist(area) { if ('selectionStart' in area) { if (area.selectionStart != area.selectionEnd) { area.value = area.value.substring(0,area.selectionStart) + '<ul><li>' + area.value.substring(area.selectionStart,area.selectionEnd).replace(/\\n/g,'<\/li>\\n<li>').replace(/\\n<li><\\/li>/g,'') + '<\/li><\/ul>' + area.value.substring(area.selectionEnd); } else { temp = '<ul>'; while(listitem = prompt('Enter a list item. Leave the box empty or press Cancel to complete the list:', '')) { temp += '<li>' + listitem + '<\/li>\\n'; } area.value = area.value.substring(0,area.selectionStart) + temp.substring(0,temp.length-1) + '<\/ul>' + area.value.substring(area.selectionStart); } } }"));

// Add macro functions
temp.appendChild(document.createTextNode("function macroChoose(area,x) { if (JSON.parse(localStorage.getItem('soymacro'+x))[1]=='string') { macroString(area,x); } else { macroRegexp(area,x); } }"));
temp.appendChild(document.createTextNode("function macroString(area,x) { var sel = getSelection(area); if (sel && sel[0] != sel[1]) { area.value = area.value.substring(0,sel[0]) + JSON.parse(localStorage.getItem('soymacro'+x))[2] + area.value.substring(sel[1]); } else if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,area.selectionStart) + JSON.parse(localStorage.getItem('soymacro'+x))[2] + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+JSON.parse(localStorage.getItem('soymacro'+x))[2].length,pos+JSON.parse(localStorage.getItem('soymacro'+x))[2].length); } }"));
temp.appendChild(document.createTextNode("function macroRegexp(area,x) { var sel = getSelection(area); if (sel && sel[0] != sel[1]) { var reg = JSON.parse(localStorage.getItem('soymacro'+x))[2]; area.value = area.value.substring(0,sel[0]) + area.value.substring(sel[0],sel[1]).replace(new RegExp(reg.substring(reg.indexOf('/')+1,reg.lastIndexOf('/')), reg.substring(reg.lastIndexOf('/')+1)),JSON.parse(localStorage.getItem('soymacro'+x))[3]) + area.value.substring(sel[1]); } }"));
temp.appendChild(document.createTextNode("function macrobarInit(x) { for (var y=1; y<=7; y++) { document.getElementById('soymacros'+x+'name'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[0]; if (JSON.parse(localStorage.getItem('soymacro'+y))[1]=='string') { document.getElementById('soymacros'+x+'type'+y+'S').checked = true; } else { document.getElementById('soymacros'+x+'type'+y+'E').checked = true; } document.getElementById('soymacros'+x+'fieldA'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[2]; if (JSON.parse(localStorage.getItem('soymacro'+y))[1]!='string') { document.getElementById('soymacros'+x+'fieldB'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[3]; } else { document.getElementById('soymacros'+x+'fieldB'+y).value = ''; } } }"));
temp.appendChild(document.createTextNode("function macrobarSave(x) { for (var y=1; y<=7; y++) { if (document.getElementById('soymacros'+x+'type'+y+'S').checked == true) { localStorage.setItem('soymacro'+y,JSON.stringify([document.getElementById('soymacros'+x+'name'+y).value,'string',document.getElementById('soymacros'+x+'fieldA'+y).value])); } else { localStorage.setItem('soymacro'+y,JSON.stringify([document.getElementById('soymacros'+x+'name'+y).value,'regexp',document.getElementById('soymacros'+x+'fieldA'+y).value,document.getElementById('soymacros'+x+'fieldB'+y).value])); } } document.getElementById('macrobar'+x).style.display = 'none'; var boxes = document.getElementsByTagName('textarea'); for (var z=0; z<boxes.length; z++) { for (var y=1; y<=7; y++) { document.getElementById('soymacros'+z+'button'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[0]; if (JSON.parse(localStorage.getItem('soymacro'+y))[1]=='string') { if (JSON.parse(localStorage.getItem('soymacro'+y))[2].length < 40) { document.getElementById('soymacros'+z+'button'+y).title = 'Insert or replace selected text with: ' + JSON.parse(localStorage.getItem('soymacro'+y))[2]; } else { document.getElementById('soymacros'+z+'button'+y).title = 'Insert or replace selected text with: ' + JSON.parse(localStorage.getItem('soymacro'+y))[2].substring(0,40)+'...'; } } else { document.getElementById('soymacros'+z+'button'+y).title = 'Replace text matched by the regular expression: ' + JSON.parse(localStorage.getItem('soymacro'+y))[2] + ' with: ' + JSON.parse(localStorage.getItem('soymacro'+y))[3]; } } } }"));

// Add despace function
temp.appendChild(document.createTextNode("function despace(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + area.value.substring(sel[0],sel[1]).replace(/\\r/g,' ').replace(/\\n/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ') + area.value.substring(sel[1]); } }"));

// Add unicode insertion function
temp.appendChild(document.createTextNode("function addSmile(area, smile) { if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,pos) + smile + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+smile.length,pos+smile.length) } }"));

document.getElementsByTagName('head')[0].appendChild(temp); // Add script to page

Subscribed

Posted by jdavidb on Thursday July 30 2015, @03:18PM (#1354)
13 Comments
Code

If I subscribed to Soylentnews last night, where can I look today to show that I'm a subscriber? I'm looking for the subscriber badge or how to toggle it. Did this on Slashdot eons ago in a former life. I suspect the subscription didn't actually get activated upon payment for some reason; I've sent an email, but maybe I'm just missing something.

Update: Admin is looking into it.

Sub's new laptop

Posted by Subsentient on Tuesday July 28 2015, @01:26PM (#1350)
3 Comments
Hardware

So I just got a new laptop. It's an Acer Aspire E5-521. It was manufactured in April. It has 4GB of RAM and a 1TB HDD, and an AMD E2-6110 processor. Now, I know a lot of people don't like Acer, but since around 2009 they've cleaned up their act and I actually prefer their stuff. It tends to be of good build quality nowadays without being too pricey.

So, for the OS, I first tried to load my SubLinux with XFCE on it. It worked, but the kernel, which was a 4.0.0, mind you, didn't see the touchpad. I also couldn't get sound working, and 3D acceleration wouldn't work.

After fiddling with it and building a 4.1.3 kernel, I got sound and the touchpad working. Turns out it was using the HDMI as the default sound output, which is why it wouldn't work. That left me still without 3D acceleration. So I got tired of the fuss and decided to load Fedora 22 x64 on it. Went smoothly, everything worked out of the box.

But it didn't feel like home, and having to install all those -devel packages for my work was a massive irritation. Eventually I got fed up (no pun intended) and switched back to SubLinux, determined to get my video working. Finally, after compiling a new Xorg ATI driver (which required compiling a new version of LLVM and installing libglamor (needed for new ATI cards)), I got 3D going, and now I'm happy.

The machine is very responsive, and always seems to stay very cool no matter what work load I'm giving it and whether or not I have it sitting on a soft surface that would be really bad for most machines. The only pet peeve I have left is that the hard disk spins down on idle *constantly*. Give it 10 secs of no reads or writes and it spins down. Starts up quick so only a minor irritant, but it appears my kernel doesn't know how to talk to the damn drive and get it to stop ignoring 'hdparm'.

Display quality is alright, but a little too pixellated. I can see the pixels. Runs at 1366x768.
Seems to run Warzone 2100 quite well now that I got 3D going. The system ignores my commands to dim backlight. Did that in Fedora too. Suspend works fantastic however.

Battery life is around 4.5 hours on a full charge. Takes about 2 hours to charge.

Comes with a wireless n WiFi card. Works fine out of the box on both Fedora and SubLinux.
Keyboard is a chiclet keyboard, but it's strangely comfortable to type on.
Touchpad is one of those Macbook Air style things where the whole thing clicks. I enabled tap-to-click and that made me happy. I don't much care for the big clicky-button.

Has a webcam, but I don't have much use for that right now.

1 USB 3.0, 2 USB 2.0.

This should do just fine for quite a while. Excuse me, I just heard my drive spin down again. Dammit.

Two Charts Show How the Drug War Drives US Domestic Spying

Posted by AnonTechie on Friday July 17 2015, @08:34PM (#1341)
0 Comments
Security

Law enforcement’s surveillance in America—and particularly its ever-increasing use of wiretaps—have been primarily driven for the last 25 years by drug cases. And as the chart above shows, that’s now truer than ever before.

Earlier this month the US court system released its annual report of every wiretap over the last year for which it granted law enforcement a warrant. And of those 3,554 wiretaps in 2014, fully 89 percent were for narcotics cases. That’s the highest percentage of wiretaps focused on drugs in the report’s history, and it continues a steady increase in the proportion of drug-focused spying. Twenty-five years ago, just 62 percent of wiretaps were for drug cases.

http://www.wired.com/2015/07/drug-war-driving-us-domestic-spying/

FASTEST SHIP IN THE UNIVERSE: HOW SCI-FI SHIPS STACK UP

Posted by AnonTechie on Friday July 17 2015, @07:55PM (#1340)
1 Comment
/dev/random

From the Millennium Falcon to the USS Enterprise, science fiction has shown us a vast array of out-of-this-world spaceships that defy our rules of physics. We’ve rounded up some of your favorite intergalactic crafts from television, film and video games, along with real NASA spacecraft, to compare and speculate who has the fastest ship in the universe.

https://www.fatwallet.com/blog/fastest-ship-in-the-universe/

Hello, SoylentNews

Posted by jdavidb on Friday July 17 2015, @05:24PM (#1339)
8 Comments
Soylent

Cool - 4 digit userid!

I like the soothing maroon light.

Here I am; let the good times roll!

Trying Arch linux

Posted by Gaaark on Wednesday July 15 2015, @05:02PM (#1338)
3 Comments
OS

Am trying Antergos linux (arch install easier), due to having a 'slow' computer. I installed Arch a while ago on a different computer and found it was alright, but had issues with getting my modem (ath9k) working after every reboot.
Currently i have Kubuntu as my main OS, but am working off the Ubuntu family, as i don't like the 'freedom' direction it is taking.

Antergos seems nice so far (also tried Manjaro, but had major issues with it (although it is beta currently)(although so is Antergos....).

The speed is nice, although i have to go through setting it all up again (guake, steam, palemoon, etc) and am trying out different DE's for speed (i3wm is cool: you get a screen you can't do anything with with a mouse.. had to go to the site to find out how to make things happen (alt/enter! huh!), so will try that out at home tonight (see how it compares to Awesome).
The gui installer seems to actually work (Manjaro's gave errors all the time), but am going back to command line because it seems safer until it exits beta).

Maybe someday i'll get back into Linux From Scratch, lol. (like i'll ever have that amount of time again... maybe when i'm 80 if my son hasn't killed me by then) :)

And f*ck all people who aren't me (put that in in case Ethanol is viewing this, lol).

Subsentient-isms

Posted by Subsentient on Tuesday July 14 2015, @01:43AM (#1336)
6 Comments
/dev/random

We've all got little made up words and phrases that we use too much that help to define our personality.

* The gerbils will feast on your/thy flesh -- Either humorous, or, less commonly, an indication that for your crimes you will be devoured by an army of undead gerbils. Like saying "you're going to fry in hell"

* Two bits short of a byte -- A few screws loose, not that bright, stupid, nuts.

* Nurble -- like derp, used to express a blank mind, no opinion, or no comment.

* Fudge ripple/Fudge ripple splatters -- shit.

* Fruity in the coconut -- Just plain nuts.

* Fucktard/fuckwit -- An extremely idiotic person.

* Stinky -- a smoke.

* Shit sandwich -- A terrible person, an intense asshole.

* As you say -- A statement of willingness to yield to another.

* Beef and beetle stew -- A lemon, defective, pointless. Originates from a childhood meal ruined by strange little red beetle things.

* Fuzzy crawler -- A larvae of the dermestid beetle, the "hide beetle". Hairy little brown caterpillars that I think are cute. I used to keep colonies as pets. See this image.

* Squeak -- A pencil or pen

* Underscare -- Underwear.

* Gorp -- A mix of peanuts, raisins, and often other nuts used as a snack. Trail mix.

* Face cheese -- Pus from acne

* Mewble -- The distorted meow a cat makes when it wants something.

* Fugly -- Ugly as fuck.

* Ear cheese -- Earwax.

* Salvation-in-a-bottle -- My OCD medication.

  * Satur-nes-day/Thurs-nes-day/etc -- An intentional mispronunciation of days of the week, pointing out the strange spelling of "Wednesday".

* Up your ass and around the corner -- You asked me where something is that I don't want you to find.

Got any of your own? It'd be fun to see.