Blog Posts

Havoc Button

If you copy and paste the below into the dev console on most #websites:

var script=document.createElement('script');
script.src='https://joshpowlison.com/wut/havoc-button.js';
document.head.appendChild(script);

You'll get a nice button in the top-left corner of the screen that reads "Havoc".

I needed to do something silly as a break from my serious work, so I made this. It adjusts the CSS of elements on the site at random so they get all wonky. You can click the button multiple times, and it can even affects its own CSS.

Have fun!

Posted 13 Feb 2019 by Josh

Solving Through Subtraction

Most of my #WebDevelopment work has been fixing broken #websites. And the first thing I do on any of these projects now is to start removing whatever I can.

Buggy #Wordpress site? I start deactivating plugins. If the website breaks further, I reactivate the plugin temporarily, but so far I've always been able to remove at least several plugins without it impacting the website at all. Usually the plugins that do impact site functionality can easily be replaced with some vanilla webcode.

Buggy non-Wordpress site? I start replacing #frameworks with vanilla webcode. It becomes easier to read, less convoluted, and it's easier to integrate the external code that really does matter (like Google Analytics code).

I call this process Subtraction. To me, it's an all-around win: the code is easier to read and faster to edit for me and future developers, and the website runs faster. Often Subtraction will solve the problems in and of themselves, or simplify the problems far enough that a solution is easy to implement (rather than trying to work around existing, conflicting webcode, which is often a problem).

Now, my first instinct on any project is to see what I can delete, and move forward from there. And I've always been glad that I took that step.

Posted 12 Feb 2019 by Josh

Round and Round!

What up! I'm Josh.

I like carousels. But not on a website. It feels like the creators of the site couldn't decide what information was the most important, and so tried to make it *all* super-important.

This site expresses the idea pretty well.

I have the habit of scrolling past automatic carousels so they don't distract me while I'm web-surfing. Usually, the constant change just distracts and frustrates me.

Manual carousels? I'm usually not bored enough to bother.

Also, I'm going to try to break Brian's #website with foreign characters. Because that's what friends do.

οικω
amígo
こんにちは

#WebDevelopment

Posted 11 Feb 2019 by Josh

Symbolic. Links. Are. Awesome.

Have you ever wished you could have multiple folders on your system that contain the same files? And update in both places automatically? No? Oh, well then don't bother reading the rest of this.

For the cool people, symbolic links allow an operating system to treat files or folders as if they exist in multiple places. This is very useful for organization. In my case, I use them a lot for #WebDevelopment on my local server. I want to place all related project files in one place, but I need the actual web site to sit in the folder of the local server. Thanks to symbolic links, I can have both without manually updating the local site.

This works on a lot of operating systems, but for info on using them on #Windows, check out this HowToGeek article. I mostly use junctions to create folder links for entire websites, but the standard link type is also useful for single files. Just be careful, because a single file symbolic link looks EXACTLY the same as a shortcut in windows #explorer. But they are very different, as you can see if you check the properties. Also, the /H hard link seems to only make a copy, without auto updating the contents, so I don't ever use that.

You're welcome.

#tips #productivity

Posted 1 Feb 2019 by Brian

Paging Bug

I found this interesting, so I'll share. There was a #bug in the code that decides how many pages of #blog posts there are. If there was an exact multiple of the max posts per page, there will be an extra, blank, page. Simply subtract one from the number of results:
$maxPage = intdiv($totalResults -1, $resultsPerPage);

Not complicated, but it took me a while to come up with this clean solution. No conditionals, it just works. For reference, this is the bit lower in the code for the older posts button:
if ($page <= $maxPage){ write the button }

Posted 31 Jan 2019 by Brian

closeCursor()

I haven't been using #PDO and #MySQL for a very long time, so things are bound to pop up from time to time that confuse me a little. While developing the system for storing #hashtags in a table, I tried my hand at using a MySQL variable for the first time. In hindsight, it looks as though it wasn't necessary, but it's good practice anyway.

So, I wrote a statement that looked like this:
$stmt = $dbh->prepare('
INSERT INTO blog_posts (title, safe_title, body, created, author) VALUES (?, ?, ?, NOW(), ?);
SELECT LAST_INSERT_ID() INTO @post_id;
'.$hashtags['tag_insert'].';
');

$hashtags['tag_insert'] is another insert statement generated by the function that parses for tags in the post. It uses the @post_id variable. So, I'm not actually selecting anything in this statement, other than into the variable. But, trying to get the LAST_INSERT_ID() from this statement, either by adding an additional line to SELECT it, or by SELECTing it with another statement, does not work.

If you SELECT it with the same statement, fetch() doesn't return anything, but if you create a new statement, you get an error saying you "Cannot execute queries while other unbuffered queries are active" and that you should call fetchAll(). But there's nothing to fetch, so it doesn't work. So we need to deactivate that query some other way.

The solution is to use $stmt->closeCursor();. Whatever PDO thinks you might want to do with the statement, it just drops it. Now I can create another statement for the LAST_INSERT_ID(). And it still remembers the value of the variable @post_id, so I can just use that.

Here's a link to the Stackoverflow question that I read to solve my problem.

Weird. But I imagine it only seems that way because there's some insight into MySQL that I'm currently missing.

Posted 30 Jan 2019 by Brian

React JS

I've mentioned #javascript #frameworks before. I generally don't like them. I'm not convinced they solve the problems they set out to solve. But, to find out, and because a lot of employers use them, I got together with my friend Josh to learn some of the basics of React.

So, the goal was simple, each of us would create a very simple game using #React. The game would be in the style of one of those clicker games where an enemy appears and must be defeated by clicking. Our version contains only the most bare bones features.

It wasn't too bad. There was a bit of a learning curve, and I'm sure there is more advanced stuff, but we were able to create our games in a few hours. Take a look. Speaking of more advanced stuff, I built mine with a single React component, but if I were to expand the game with more features, I can see how additional sub-components could speed up development. Here is the source on github if you're interested.

Am I convinced? Not really, but I get the picture. I'll want to practice with it some more before I could tell a potential employer that I know react, but for now I think I'd prefer to try a few other ones. Vue looks pretty interesting.

The format of setting aside a day with a friend to learn a new framework was very successful and a lot of fun. Thanks #Josh!

Posted 28 Jan 2019 by Brian

Hash Tags

Here they are! #Hashtags. Most blogs have a system for tagging posts with various tags or categories to help with searching for things, but I really like the tags to be built into the body of the post like many social media. It makes the information more cohesive or something. But I also like not having to put a separate box on the new post form for tags. And the regex to find them in the body is simple enough. Although I did get a bit of help from a guy on the freenode regex channel. Maybe I'll make a post about how it works. #NewFeature

EDIT: Hehe, need to add the table for tags. :P
EDIT: Fixed.

Posted 25 Jan 2019 by Brian

Apostrophes are back

Hashtags no longer break apostrophes. So that's nice. I'm also trying to make code blocks a thing. That's gonna be a little more work, but I'm not sure what problems there are to solve at this point.

For now, this is what they look like.

Posted 22 Jan 2019 by Brian

Update on Spam

I got my first spam email sent to the address on the left, and it is a doozie. Erin the anonymous hacker promises to send a very inappropriate video of me to all my contacts if I do not provide $2000 worth of bitcoin in the next 72 hours.

At the very least, look up the definition of anonymous. I do not assume Erin is your real name, but it is a name nonetheless.

I do find it amusing that this must work on somebody, otherwise they would not try. Imagine remembering that you did whatever they say they have video of you doing, and believing that your webcam caught you doing it, AND a hacker had access to the cam and all your contacts. At that point, you probably deserve to lose 2 grand.

Posted 21 Jan 2019 by Brian

About

You found me! I'm Brian Bogedin. This is my website and blog. Obviously. Anyway, I'm a full stack web developer and game programmer operating in Southeast Michigan. I do freelance, too, so feel free to contact me with business inquiries. Thanks for stopping by!

Ping me: brian@bogedinbr.com

Projects

This blog!

I'm making this blog from scratch. No CMS, frameworks or libraries! Just MySQL, PHP, JS, HTML and CSS. Is it necessary to create a blog from scratch? No, but it is great for learning, and customization. Does your blog have hashtags?

DrawingWiffWaffles.com

Website for a youtube channel that creates instructional and entertainment videos about illustration. I built the site and manage giveaways there from time to time. Currently working on a miniature custom CMS so that the site owner can administer the giveaways without my assistance.

SECO Tools

I do some work here and there for a company that sells mill tooling. Most recently built a batch processor for their tool converter. Basically, it takes a bunch of competitor product numbers and returns the information on tools offered by SECO with similar specs. Still needs some user friendliness enhancement, but it's currently only for internal use.

Geospin

This is a small couch multiplayer game made in gamemaker for a game jam I organized with some friends. Up to 6 players use controllers or the keyboard to fire rockets on the side of their city to rotate a planet and avoid incoming missile. The trouble is, everyone else is trying to rotate the same planet! Download it on itch.io!

Showpony

Mulitimedia engine being developed by my friend, Josh Powlison. Plays audio, video, comics, text, and kinetic novels. Cool stuff. I'm helping out a tiny bit. See the demo here.