Blog Posts

Symbolic Links Revisited

I think they're broken. On #Windows anyway. As far as my logic understands, any running program should not know that they even exist. But #xampp can tell. Or at least, I think Windows is just feeding it directories as if it could tell. This is a little rough to explain.

Say we have a #PHP file on an #Apache server in a directory, but that directory is actually what Windows calls a junction (A type of symbolic link). If I 'require' another php file with a relative link like '../', where is the server going to look?

My first guess? The directory above the junction. It took me nearly an hour to determine that it was looking in the directory above the TARGET of the junction. Maybe that's the way that should work for some reason. But I do not know what that reason is. If Windows had any kind of proper sandboxing, it'd be a major security hole.

I do seem to be good at finding the #CornerCases.

Posted 8 Mar 2019 by Brian

Speed up CSS

I learned about a new #CSS attribute that's pretty cool: will-change.

/* Warns the browser transform will be updated a fair amount */
will-change: transform;

It basically tells the browser "hey, this attribute's probably going to change on you, so you better be ready." I don't know exactly how it works- if it pre-processes most likely updates, passes processing to the GPU, etc- but it fixed some problems with moving elements smoothly on mobile for me.

MDN actually says it's "intended to be used as a last resort" which is always a good sign for a new web standard IMO. It's good to keep our devices on their toes.

I'm betting we'll see it being abused to heck if it hasn't been already. It may just become the new !important.

#WebDevelopment

Posted 7 Mar 2019 by Josh

That Cast Button

Chrome wants to let you cast any video or audio from a phone. Even if you don't want it to be castable.

Fortunately, the fix is pretty easy. Just use:

video.disableRemotePlayback = true;

This will prevent a cast icon from showing up on videos that you don't want your users to be able to cast, like background videos.

Why isn't it instead something like

video.remotePlayback = false;

though?

Probably not for a good reason. It may be that since unset booleans default to false in most programming languages, this was easier to implement and have videos default to being castable. But I feel like it's pretty sloppy.

That's the fix anyhow.

#WebDevelopment

Posted 4 Mar 2019 by Josh

Blog has moved!

Hey! If you're reading this, then you already noticed, but the #blog is now located at blog.bogedinbr.com and bogedinbr.com now has a bit of a front page for our development services. That page could use some work, it's a bit of a process. Of course I say "our" because #Josh and I are going in on this together. Should be fun!

Does the blog need to be a #subdomain? Probably not, but it's #cool right? Just another thing about #WebDevelopment that I understand even better now.

Posted 20 Feb 2019 by Brian

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

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.