Stories
Slash Boxes
Comments

SoylentNews is people

Log In

Log In

Create Account  |  Retrieve Password


Subsentient mourns the loss of a great artist.

Posted by Subsentient on Sunday August 09 2015, @02:18PM (#1371)
2 Comments
/dev/random

I think this song goes well with this entry.

When in 2011 when the OCD hit me for the first time, I had no hope at all. I expected to die soon, because life was such a hell, I couldn't imagine any other scenario. Otherwise, why so much pain? Multiple obsessions hitting me at once, sucking the joy from my soul. This isn't normal OCD. This is stuff that had me screaming for someone to kill me at one point, but I won't get into that. Here's a link that describes it.

I found a spark of light in this pitch black from a youtuber whose whimsical little videos made me feel the first bit of joy in several months. I subscribed to her, HiHiAkafa, then subscribed to her new account HeavenSoulTrance, and finally AkafaXD. She suffers from what appears to be depression, and seems to be a furry. I don't mind of course (how can I, I sometimes think of myself as "the white rat"), and I always found her videos quite adorable. Point is, she posted a video not long ago explaining that depression was preventing her from working on her art. I was one of those who gave her encouraging comments, which she appreciated. It appears that hasn't done any good.

She's erased everything on her last youtube account AkafaXD. The profile picture is glass shattering in a black void.
All that glorious art, lost. All her adorable animations, gone. A piece of me, a piece I integrated into my fondest memories, gone.

I managed to save some of her videos luckily, because I loved her work so much I had downloaded them from YouTube prior to her account wipeout.

I've made an archive of the handful of videos I had on hand, on my secondary server. http://gieba.universe2.us/rememberakafa

I just hope she stays safe.

August 6th, 2015 Republican Primary Debates

Posted by takyon on Thursday August 06 2015, @10:15AM (#1366)
11 Comments
Reviews

The first Republican primary debates will be "legally" available online only to Fox News cable subscribers. Assuming you don't have TV access to the debate and are bored/interested/depraved enough to want to watch live, look for and post streams in the comments. They are sure to be clamping down on livestreaming services like Periscope, but others might escape notice. Twitter real time search is a great way to find these kinds of links and generally a good source of entertainment during these sorts of live events. Here's the Fox News schedule:

  • 5pm ET: First (kiddy pool candidates) Debate
  • 6pm ET: Online Pre-Show
  • 9pm ET: Primetime Debate
  • 11pm ET: Online Post-Debate Show

Jon Stewart's last episode of the Daily Show will start at 11pm ET and will last 52 minutes.

The candidates making the cut for the main debate were Donald Trump, Jeb Bush, Scott Walker, Mike Huckabee, Ben Carson, Ted Cruz, Marco Rubio, Rand Paul, Chris Christie, and John Kasich. Seven candidates who did not qualify were invited to participate in the 5:00 PM forum; these were Rick Perry, Rick Santorum, Bobby Jindal, Carly Fiorina, Lindsey Graham, George Pataki, and Jim Gilmore. Because of a rule-change announced by FOX one week before the debate-invitations went out, Graham, Pataki, and Gilmore will participate at 5pm despite averaging below 1% in the five selected polls. (Former IRS Commissioner Mark Everson was excluded from the 5pm tier, along with other relatively-unknown candidates who did not meet the updated invitation-criteria of "consistently being offered to respondents in major national polls as recognized by Fox News.") The five selected polls were conducted by Fox News, Bloomberg, CBS News, Monmouth University, and Quinnipiac University.

I made this as a journal because I didn't want to subject all of Soylent to it, especially since Fox News is not making it easy to watch the debates.

Keep in mind: Republican debate drinking games are dangerous.

Spam Mod Abuse

Posted by GungnirSniper on Wednesday August 05 2015, @12:45AM (#1365)
4 Comments
Rehash

I got the big karma ding on this comment today. It's not a big deal in the grand scheme of things on the site, but has anyone else seen the spam mod option abused?

Arch linux continued

Posted by Gaaark on Sunday August 02 2015, @05:05PM (#1361)
0 Comments
Code

Working with arch (through the antergos installer) is pretty nice so far (and learning the i3wm is nice: educating with cool, lol)(actually, it's reminding me of the days of installing macmillan red hat 5.2, where i had to mess extensively with config files, especially to get X working).

Got my i3status bar to correctly show that my VPN is working (had to do some googling, as well as finally seeing i'd left off double quotes, to make it work).
Pacman is quick (VERY quick) and easy, and pamac-manager makes it easy to include AUR packages without adding it into your config file.

So far, really enjoying i3, but have included plasma (for k3b) and the default gnome just as fall-backs in case i need to do something that i don't know the command for (yet).
Am pleased with my set up, and with deja-dup to backup, i may keep this setup as my stable, and use my other partition to play with distro-hopping.

Currently watching Black Sails (episode 1, so far) while playing minecraft... (sad that it was bought by Microsoft, though). Will not be installing windows 10 to try my 'free' minecraft win10, lol. That kind of free is too expensive! :)

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.

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

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.

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.

Relationship Hacking: Part 9 - Here we go again!

Posted by Snow on Friday July 10 2015, @04:35PM (#1332)
3 Comments
/dev/random

It's been a pretty busy month and a half since the last update. Summer is finally here!

After a bit of a dry spell, I was able to line up 2 dates since the last update. The first girl was a teacher at a high school. She had curly black hair and glasses - a combination that usually drive me wild. We met for some drinks after work one day, but it didn't go very well. She was a nice girl and all, but no chemistry at all. Actually, she really, really reminded me of a girl that I grew up with that was practically a sister, so it was a little weird. No second date on that one.

The other girl is 25 or 26 (can't remember), and we met in a local park for a first date. She is currently in school taking psychology, so is pretty poor. A tiny thing - blond, maybe 5'5" and slim. We chatted as we walked though the park (she is a talker, so mostly I listened...) and then I bought her a drink and we shared some appetizers.

I saw her again last night for a second date, and she made me chicken wings and stuffed potatoes for dinner. I was in charge of a salad, and my wife makes really, really good salad dressings. My wife made me a salad kit with dressing, fresh basil, and roasted nuts to bring for the salad. It was pretty awesome to have my wife help make my date special. My wife is pretty great!

We made dinner and after ended up cuddling on the couch and watching a couple TV shows. We had a great first kiss.

After the first date, I was a little on the fence about her, but after the last date, I definitely feel there could be something there. I'm a little scared to get my hopes up too much though after how things went the last time I like someone (the last one basically ditched me...), but I really hope to see her again.

My wife and I are still doing great. It's been almost a year since we opened our marriage up. I still feel that opening up has so far improved our relationship. She likes the extra confidence I have when things are working out, and picks me up when I am down when things aren't working out. I'm very thankful to have such an amazing woman in my life. I hope that when she starts looking for secondary relationships I can be as supportive to her as she has been for me.

-- Snow