ONN Model NB14W1201 2000mAh Power Bank

Onn Powerbank model ONB14W1201, $2 clearance buy, but handy and functional. Reading a bunch last night about Li-ion chargers, I had a sudden urge to look inside.

Peeking into it. Wait, is that..

..roundness? This looks so much like a plain standard cell, or one of those half-length ones.

It’s a plain ol’ 18650 Li-ion cell with a little driver! The white parts pop apart down the other side, btw..

Circuit closeup

Looks like standard ICs and they left the numbers on. I’ll look into it more later, but these look like what I bumped into constantly hunting obscure Shenzen parts no one has sheets for.

Driver Board

Another for good measure in case something is out of focus.

It’s spot welded in (as internal batteries or individual cells usually are – the strips are often zink plated stainless to handle the heat changes. But it could probably be modified to charge 18650 (probably the most common Li-ion cell around and the basis for most “normal” high power rechargables) or to recharge your phone with infinite 2000-2300 mAh chunks for a few bucks a cell. Possibly even expanded with a few in parallel but that might get adventurous current wise. Will have to see what the ICs claim to be.

Got caught up in a DNS amplified DDoS attack

Sure I’ve heard them mentioned. Along with everything else that’s wrong with traditional DNS, a great deal of it is done via UDP as opposed to TCP. I.e. no “Hi Server! (msg1)” – “Hi Client! This a connection? (inre:msg1, msg2)” – “It sure is, dear Server! (inre:msg2, msg3)” – “Cool! What? (inre:msg3, msg4)” and so on, lobbing packets of information back and forth, all pieced together. No, DNS goes “Hi I’m client X I need to look up Y”, “Ok cool, heres YINFO”. Since there’s no connection, you can lie about the sending address, causing the server to shove the response at some innocent other host, which will sit there when suddnely “Ok, cool, heres YINFO!”. It’ll go “Wut?” to itself and toss it. But, as an extension of overloading a server with junk traffic, this can make you suddenly much louder – ask a question with a *really* long answer, and suddenly you can not just cause people to deal with your puny internet connection but cause them to receive many times that much form other servers you’ve tricked into sending it.

So until now, my DNSes have always been limited enough to not have this happen. But seeing up a new server, DNS was the main issue – it hung multiple times from lack of functioning DNS. So I wasn’t too careful, and suddenly someone, many many someones, were requesting lots and lots of data.

So, now thinking for an additional second about it, I realize there’s really not much preventing this besides just not taking requests from outsiders. But there has to be some slack too – it’s not like everyone can have individual DNSes, nor can it be 100% centralized. And here, I’m not even sure how should have answers, but at least a decent chunk of local boxes.

Then when you do block, or (as I first did) just rip down your DNS shingle altogether for now, it’s not really stopping it much at first. After all, the point here is to shove traffic at someone else – there’s no real way to see if it makes it. It’s possible (and a good idea for effective mayhem) to mix it up and throw an answer back to yourself (more like “a place you control”) to make sure you’re not wasting your traffic sending into nothing, but.. that’s riskier than just sending it to the target, and a little trickier, and there isn’t that much punishment for slacking off and not checking often.

Finally fail2ban (set to bounce the requests with orders to the next router up that packets going “from” one for the targets to my dns needs to find another route, nothing down this path) started working, set up per https://debian-administration.org/article/623/Blocking_a_DNS_DDOS_using_the_fail2ban_package . After a set time, it’ll start accepting again, but after a set amount.. ban again. It’s working pretty well and slowing it down. Looks like the herds are moving on. But that was way more of a thing than I expected. Worth configuring carefully the first time, I think.

Moorse law seems very near breaking.

Yeah, I know, just like it has been the past 30 years, but for general purpose cores it’s broken now, actively, not-looking-like-it-catching-up-again broken. I’m writing this on a i5-540M (yes, the one I inserted myself to replace a A6200), a two-die monstrosity with separate GPU on it (though a crazy good deal, 2400+ passmark for $20) pressed at 32 nanometers (cue patting my laptop gently like a trusty workhorse – me and connor been through a lot) That was 2010 level tech. 22nm in 2013 was a little late, but not *that* late, and while the original law said “transistors per square inch” it’s usually more broadly used as “transistors swedes living in kansas use for daily operations”. Or (possibly) “transisotrs you can sort of expect to use in your average general purpose CPU”. Either way, bigger dies with better cooling mostly made up the difference speed wise. This year, people are pressing 14 nm, and it’s a big deal, but we *should* be pressing 5-6 nm. Intel and nvida are doing some testing at that level, but that’s “wonder if perhaps we could”, not something inching closer to production. By normal rates, we would now be kind of over 5 nm – like I’m supposed to be buying your 5 nm CPU stuff at garage sales after the HDD failed, not reading about how it’s pretty much established that it’s not a physical imposibillity.

So single thread is irreperably not catching up, which is understandable – there’s no particular reason to belive it would. But what about the fancy throughput driven kilocore stuff? I said “nVida” out loud earlier, what gives? Well, they’ve kept up, and they might just swing it. Now that Intel seems at least partially over continually shooting themselves in the foot and covering their ears going “LALALALALALA We don’t see any demand for smaller massive multicore processors” we seem marginally closer to perhaps establishing some sort of standard for computational throughput jobs and some measumrent of device cababillity for said jobs (How smoothly does this http://nothisispatrik.com/wobblebrot.htm wobbling mandelbrot operate on your machine? You know what would make it faster and smoother? You’d have to.. actually no one knows – there’s no reasonable spec to quote for massivley paralell operations besides “get a better GPU. And by “better”, I mean.. I have no idea what I mean by it”). One of Sarahs friends (unprovoked) pointed out that if you chained a pile of Raspis together and only used the GPU part, you could build a fairly cheap supercomputer, so the next generation isn’t missing what’s happening here, but most GPUs are way locked down and extremely propriatary.

So ironically, I think if we’re going to survive this itteration (because surely they world will stop spinning if we’re not doubling everyt two years ;-)) the solution is probably going to have to be political. GPU people are going to have to unglue thier cards from the vest and let us play, we’re going to have to establish a sane way to quote “dick size” (compare to camrea megapixels) so that people with money can throw tremendous amounts of it at being the best. CL is a good start, but we still need metrics, we still need higher level access, and we *might* need a killler app (although really I think that will appear organically).

BWA15HO107 Blackweb Wireless Touch Keyboard

BWA15HO107 Blackweb Wireless Touch Keyboard.
Continuing my quest for the right input device, I found this newcomer on the cheap at Walmart. Blackweb is their store brand in electronics – I suppose Great Value wasn’t good enough or they want electronics separate from everything else. Hopes were not particularly high, but there aren’t many TouchPad keyboards to choose from so..
It surprisingly turns out it’s pretty good. Compared to Logitech and Microsoft? Yes, actually, but with some major caveats.
The build quality is terrible. Very plasticy. The keys rattle quite a bit. But they do type, never been a huge chiklet fan. The touch pad is very sensitive, which is a little annoying as I flail around with my pinkie typing. It’ll. probably pass, I had this with the Logitech k400 too, and somewhat with the MS no-insert-key lookalike. They were also both 90% chiklets, more sturdy, but still no more comfortable due to that.
So what makes it usable? Well, it has all keys. Including ins and del. It has fn-ctrl and fn-win mapped to mouse buttons, ie physical keys. So both of the full on deal-breaker faults are gone. Too bad so much else is worse.
It did have another, the minus on the number pad kept getting stuck, activating at the slightest touch and never stopping. so I did open it and taped the switch apart.








copy-as-curl to python converter

You know when you have the developer tools open in Chrome or Firefox (and IE? Who knows..) and set to the network tab, you can right-click a request and select “copy as cUrl”, and you get curl command line with a pile of flags that will reissue the exact same request? Well, if you didn’t, you can – start using it, it’s awesome for testing stuff that’s not so complex that you have to write a selenium or phantomJS script. Handy for working out how the back end (yours or someone elses..) deals with requests that can’t occur in the browser, but which can occur when some brat decides to fire up burpsuite and start sending it broken Unicode just to see if you did your homework.

But sometimes you need to write something a *little* interactive, but not much so that you need a headless or actual browser for it (or for something performance critical enough that you don’t want one) and working on something else I realized I spend an awful lot of time rewriting these curl command lines into python. Since that’s really just a straight “madlibs” insertion formula, there should really be something automatic that does that. So now there is:


So.. there you go, if you, too, do that sometimes this will do that for you. The output uses urllib3 (might add on options to use requests or mechanize instead sometime) and is just a single function called getpage that fetches it and prints the headers and the response, and a “if __name__==” snipplet to run it if it’s executed directly (yes, I’ve taken a slight liberty in pretending there’s a -i on the curl command, because really there should be). If you give it and argument, it’ll read that file for the curl command, if there’s no options it’ll use the /dev/clipboard (i.e. the clipboard on linux/osx/cygwin, nothing particularly useful on winows). There’s no filters so it’ll add everything, including headers like “Host:” and stuff that technically shouldn’t be there, but when considering filtering I decided it’s probably better to retain the integrity of the curl command and you can delete or edit them yourself (just as the with curl command).

[EDIT] ..and in less than 24h it’s gotten a bug fix – the normal way of passing headers mixes up their order, which is slightly different than curl, and matters in certain edge cases. Also added the ability to skip -I if it’s been added. Still pretty strict on input order and not much error check..

Happy Meal Minion Teardown


Unboxed but otherwise stock Minion

Minion teardown

With the recent controversy about what these guys are saying, as well as their increasing marketing blitz, I figured it was a good time to look into the actual hardware a bit.


Attempting to minimize damage while cracking the seam and pulling/cutting the pins

McDonald’s have a slightly checkered past in terms of delivering toys that are possible to open and reassemble (for maintenance, modification, etc). At best, they’ll at times provide some outside accessible triangle screws. They’re not quite the same as the Nintendo tri-wings if that’s the conclusion you jump to, but the same heads do work a little. This, however, isn’t one of those times – they’ve opted for pin-in-hole pressing, with some seams then melted shut.


Prybar in a partially reopened melt seam at the base of the hair

There’s no real gentle way in, but prying apart the edges of the yellow part first and then trying to wiggle the pins underneath is probably best. You’ll likely need to snap or cut most of them anyway (seal with superglue or hot glue if you reassemble) but you can probably get cleaner breaks than going in blind like this. A few might even pop out.


The four pins holding the two cover parts.


The back is only attached to the front and comes off easily. Many places make clever use of the two shapes molding around each other, both to hide seams and give a considerably more complex appearance. They succeed quite well – it’s not at all obvious that the core structure only has four parts.


There is only two parts here

The two remaining halves are stuck the same way, but more melting and weaker pins. The seam goes along the sides, but veer along the base of the hair and heel of the boots to hide in natural lines.





(just pouring on the angles a bit).


Unfortunately a slightly shakey shot of the finally open black part. A yellow slider pushes a bent wire onto or off another wire/small cut metal sliver that holds the cells. No pre-made switches or connectors, just soldered in shape and pressed into the plastic. However, given the fairly sturdy plastic, it’s probably not too much of a concern. Likely to outlive the battery, and I’d hesitate to call them user replaceable (an unfortunate but not uncommon trend there days).


Button cell

Speaking of the power source, they’ve (as you can see) gone with two LR41 button cells. Those are alkaline, which hampers their capacity pretty severely (usually ca 30-35mAh) but on the plus side they’re mercury free and at “worst” use some silver oxide. As you can (perhaps) see by the logo, these are from NewLeader Batteries (out of Guangdong, mainland China). They claim 41mAh – I wouldn’t count on that, but it could just be that we continually get partially discharged ones (with the shipping and all..). Wouldn’t shock me if they were a bit optimistic with the specs too though – we’re not exactly in a position to complain (or give much credit).


The speaker itself is actually pretty sweet – sizable magnet, decent radius, multiple softeness materials for the mount.. Not saying you’ve found your next source of hifi equipment, but these (and quite a lot more pricey) things usually go more for piezos or other very simple tweeters. It’s also mounted against the plastic, with a x-shaped prong pushing it there and the other side pressing against the eye (made of slightly thinner plastic) to resonate and give a slight slave base effect. They obviously care a lot about the audio reproduction (in as much as you can at this level) – acoustic design and material tradeoffs seem to have gotten very generous shares compared to others.


The little sliver connecting the cells and acting as half the switch is last part out.


Full component spread.


The audio IC itself is also in an actual epoxy enclosure rather than a direct on pcb with a glob of epoxy. That could be because there’s no board anyway – going with the less dinky speaker there’s nothing else left. It’s also not a blank chip, which may be a McDonald’s first (but probably not really - It says PPPP VRQA, stenciled on quite clearly. That means nothing to me though and I can’t find anything like it online except an Australian agency dealing with partial workers and evaluation of their abilities. Not sure if that’s actually something involved – assembly in AU when shipping from China seems kinda odd, but it’s also a pretty distinct combination of letters.

So despite the letters, I’m not sure what it is. It has four visible pins only, and contain the amp, storage, playback and oscillator. That could be a lot of things, especially if you’re McDonald’s and big enough to press custom Si if you want. But it’s probably something like the AP89010, I’ve been meaning to hook it up to something sensitive and see what the output looks like (quantification levels? Apparent sample rate? Pulse width modulation (amazingly incorrectly called 1bit DA) or semi analog?) but I haven’t had time.


Well, that’s about the size of it – assemble by doing the opposite. Night.

GearHead MPT4100BSW Wireless Mouse

Hand somewhat misleading scale wise (my hands are unnaturally large)

Hand somewhat misleading scale wise (my hands are unnaturally large)

Last time I spoke of this.. this.. IO/UI situation dilemma thing.. I’d just decided against rebuying an identical Logitech k400R (Keyboard with built in touchpad where the nubmer pad usually is, 90% sized, physical mouse buttons, extra top-left buttons, whatever we’re now supposed to say instead of retarded media key config). Reason: cursor keys and the whole right hand ctrl-alt-shift situation is pretty bad, and it’s a little small (touchpad in particular). Picky? Yes. Insanely. But really, six months in (incidentally also when the space bar collapsed from use, but really I’d be prepared to live with that – I crammed a lot of brutal use into those months), if I’m not used to pressing ‘>’ without hitting Enter or rctrl-rshift without getting the arrow keys involved, it’s probably not happening – sorry.

Thus, I tried Microsofts very similar ™ multimedia keyboard, which looked better. Yeah, yeah, keep it up with the hyena laugh – obviously I should have seen this red flags (like “Microsoft”). But I used their ergo keyboard (with a serial touchpad play-doe:ed to the center thumb section) for like a decade. They make good UI sometimes. This, however, isn’t it. Arrows.. a little nicer, but not enough. Touchpad – *no physical buttons*. *Horror* to drag/drop/select with. Some kind of odd tactile move thing instead, which sucked. And then it had max two multitouch with no gestures! Good thinkin’ MS – redefine the entire UI so it’s like a cell phone (very impractical) and rely on absolute position and gesture/touch combos, then release one of the few modern touchpads without that particular feature.. It could have *maybe* worked, but then.. no insert and delete keys. It’s over. I get it, people don’t use it. Programmers do, ctrl-ins, shift-ins, ctrl-del.. You can get used to left-backspace, but not everything uses the unix-y ctri-x-v-c-a-e-k stuff. So.. it gets to be a media keyboard. Some, because no one likes it.

Then (calm down, you’re nearly up to speed) I switched to a plain Logitech k270 keyboard/mouse combo. With a logitech T650 superhuge touchpad on the side. Same no-button woes, but at least it’s big. The keyboard is a keyboard (by which I mean plain AT 102 key, normal size, normal places). So basically I retreated, and the “side touch pad” really mostly became “remote for when I ‘m not typing” with the little wireless mouse that came with it for those “quick-click/swipe, back to typing”. It’s ok. But!

It only has one two buttons and a scroll wheel. Low dpi. Tiny (but that’s kinda good). However, my 17 button Razer Naga is too big (rocks for gaming, but a little touchy unless it’s photoshop, and I use a drawing tablet for that). There. You’re up to date! You probably quit reading already! You bastard! Ok, not really. But anyhow, this GearHead fixed that. Standard 5 (left, right, forward, backward, fifth) plus a scroll wheel with center click *and* side pan (pan right/left by tilting). It dpes 1200 or 800 dpi, 28 inches/s tracking speed (i.e. even turned down you can corner to corner a rather large mousepad in <1s without losing precision). It's $15, which is suspiciously cheap. So it covers my gripes nicely, it's slightly bigger and it's even kind of artsy with the prints. So, is it all that? The holy grail? The end to my bitchy moans about my UI devices? Well, no. But first the good news - all that stuff it says it does.. it actually does. None of it feels "pasted on" so to speak, you can count it and it's all there. That's kind of unusual in this field, usually at least one or two of the brag-points are just that, there to brag about but has some boneheaded bug or config flaw that makes them totally useless in actual use. I just didn't get that vibe. It even came with a fairly good config manager, able to swap up to five profiles with arbitrary macros. It doesn't seem to do per-app, which kind of would have been nice but frankly I didn't even expect this much configurability so I'm prepared to not be too picky about it. The bad news, well, this isn't a gaming spec mouse. I'm ok with that, I don't game much and when I do I use a Naga. Being smaller, easier to handle and cordless is worth it for "work mouse". But if you want One True Mouse to go with your gamer laptop, you might have some issues. The speed is way beyond what you need for desktop, but in a shooter it's so-so. Same with DPI. The macro stuff is actually about the same as Razers, but theirs suck (for a $80 top of the line piece of equipment) so you'll still be running 3rd party (if legal) or be annoyed. Same there - w/e to me, but worth noting. Some of the extra buttons are *very* hard to hit and hit correctly. Especially pan left/right and the fifth. This could be in part because my hands are ~20% upscaled, so "normal human sized" hardware is already a bit fiddly to me, and super portable stuff is worse. But I think the pan especially is a real issue - laggy response, easy to scroll instead of tip, tip when you scroll, etc. I tried setting it to [ and ] in one of the profiles (for use in photoshop as toolsize +/-) and it was a travesty. Scrolling in the browser kinda sorta works, but really you'll be wanting to press a modifier key and scroll instead. It's ok for "another button", but it's not really very comfy for panning. Other than that, this is really quite nice! It's a lot like the logitech cheapo-came-with-k230 mouse, but with more buttons, better precision and back/forward side buttons (very handy on the web). It's a way good deal at $15. All told, I ain't even mad. If that doesn't sound like a glowing review, consider my prior attempts to buy IO devices.. Oh, and it has it's own proprietary receiver. That's a Bad Thing in a sense, but not really their fault. There's only one "maybe" standard, bluetooth, and except the newest versions it's too powerhungry and so expensive it's not exactly the "USB without wires" it was once billed as. Logitech has a "unifying" receiver, which unifies a select few logitech products (the t650 and k400r being the only ones I've seen - the k230 and mouse and the other three logitech mice I've had all have their own, each incompatible with the others) and they'll let no one else in. Kind of understandable (though still dumb - it's not like anyone much is going to compromise their IO preferences over a usb port) but annoying. Microsoft followed suite, which is wrong on way many levels - they're in the OS business, which is to say the standards business. They're probably the only company (possibly besides Apple, but they'll never be compatible with anything but apple if they can help it) that has so much weight that they really could have said "Oh yeah, win 8 we're pushing this standard for wireless IO @2.4GHz. Free to good home - we'er hoping it'll be the new "keyboard/mouse/touch" port for desktop/laptop/tablet/phone" and most likely get it shoved in the majority of computers (not machines, because they lose at phones/tabs, but w/e) with the rest using a single dongle. It wouldn't take much for it to go industry-wide - the "proprietary" ones are for the most part really a single transmitter chip anyhow, someone just needs to lay down a unified protocol and not charge a good foot and half up the ass to use it like bluetooth does. But.. they didn't. So GearHead.. also didn't. But they couldn't, and didn't expect them to. So ok, perhaps some other time.


After seeing this video from Krafty Kuts of him playing the decimals of Pi mapped to the piano keys of A# with some left hand hamony thrown in, I wondered what it would sound like without the fanciness. Adding a baseline will help any tune immensely and human players don’t just robotically pound in notes – if they sound “right” at a different time they’ll try to make it fit. So I wrote a little javascript fiddle (woho, it’s raining puns!) that does just that, A# notes, 500ms apart, nothing else.

Here it is

It’d be interesting to try it with some other scale. Perhaps those fifths the jazz people keep mumbling something about, two of those should be ten so it’s being shoehorned into 2x pentatonic (since I’ve never heard of decatonic, though I’m sure there’s such a thing) and be more symmetrical. RIght? Not sure if the answer is “No, doofus” or “Yeah, doofus” and I’ve really wasted too much time on it already.

The piano samples were crosslinked from <a href=”http://pixelass.com/”>Gregor Adams</a> page in another project and marked as CC, which would make sense but I can’t find the linking party to see if it’s (Attribution) or no. So like if it is, you need to.. attribute.. accordingly. I.e. point out that that’s where they’re from if you reuse them. The code is whatever those were minus the attribution requirement. I’ll look it up later (or switch out the samples).


On the off chance that you wanted further elaborations, here:

“I like music theory and what are you talking about?”

You’ve caught me red handed! I have no idea. I know at most the very scratch basics of what this is supposed to be. I’m assuming pounding in random notes, because that’s all it is, sounds pretty ok so long as you stick to a traditional scale. Hence why they’re set where they are.

“I like javascript and what is this?”

I’ve been running into sites that jam everything into a single function that constructs it’s own stuff a lot last few years. Often in jQuery (don’t get all cocky about it – we can write plenty of opaque code in just plain javascript). It’s a bit of a hassle to follow, but I’m starting to understand the “why” – you can drop them into a random page and because all their variable are local to the original function, they’ll (at least in theory) coexist. So in the interest of getting better at it, I wrote this as one. Here’s a commented version to try to parse it apart some.

(function(pi){ //the lowest level that will be called with the digits of pi
 // Gererate an empty div element that will contain the progress along the digits later
    var d = document.createElement('div');
 // set it so it'll warp at end of screen.
    (function(s){s.maxWidth = '100%'; s.fontFamily = 'monospace';
        s.wordWrap = 'break-word'; s.wordBreak = true;})(d.style);

      // this will generate a set of functions that will play each note, when called withe their names and a place to add html elements to. That place will be document.body. Those two things will be in a and b.
    var k = (function(a,b){
      // Append the keeper thing - this is mostly here so I don't have to have another whole document.body written out.
          // "map" runs a function on each of the arry members and returns an array with the results. a here is the names of each note.
        return a.map(function(c) {
          // make and auto element without controls (play,pause,etc) and give an ogg sample to play when activated. Return a function that will reset the time and press play on it. Each name in the array k will now be a play-a-note function.
            var e = document.createElement('audio');
            e.id = c; e.preload = 'auto'; e.controls = '';
            e.innerHTML = "";
            return (function(){ e.currentTime=0;e.play(); });
       // immediately all the function we just made with the names (split at ' ' so it'a and array) and the body (to put the audio tags in.
    })("3As 3B 4C 4D 4E 4F 4G 4As 4B 5C".split(" "),document.body);
      // set an immediate timeout that get's an int from the Pi digits, finds the appropriate function in the array we made, and call it. A note plays. 
    setTimeout( function f(a){
           // if there's more digits left, set a timeout in .5s to call this function again, this time with the position moved forward.
          // slice Pi into before and after where we are. Stick that in the div from a step up, with a span inserted to make the unplayed poriton be greyed out.
      // the first timeout call, with a==0, so that it kicks off with the first '3' right away.
    }, 0, 0);
})( ".. digits of pi.."" ); // GO

It’s actually quite elegant, if not super portable.

“I like math and what is this?”

Nothing. It uses pi as a random number to play a scale that’s internally harmonic. Nothing to see here. I don’t calculate them on the fly because I’m being lazy, and 2000 notes (1000 sec, a bit over 15 minutes) should be plenty.


Playing with CSS animations kind of drifted into looking at JS animations, then 3D rendering with WebGL, then shaders in GLSL. I’ve wanted to get more accustomed to those, especially using them for non-graphics things, but I’ve almost always had on-board Intel GPUs, and they’ve traditionally been against doing anything other than graphics with them. Anyway, I made some shaders and as a kind of first “hello world” I plotted a mandelbrot. Since I’ve been plotting in on a ton of devices and frameworks over the past 25 years or so, it still blows me away that even a decidedly out of date on-board graphics unit can easily plot it at full screen resolution 60 frames a second without any particular hardship. Not to be all old-man “uphill both ways”, but in high school we’d “borrow” the overnight use of the lab computers to calculate a single frame of that.

Anyway, playing with that, I took advantage of the whole real-time plotting thing and disturbed the formula a little to make it wobble around kinda funkily. Since it’s on the formula level and not a transform, the entire shape kind of shifts, down into the actual fractal, which looks pretty cool. So here’s a look:


The wobble sliders change how fast the tweaks change. What is actually happening is that I’m scaling the x squared in the real plane and the x*y in the imaginary plane by a constant though out the iterations, then wobbling the constant around 1.0 by a sine curve (over time). In other words, a correctly calculated one would do:

next_Z(real) = Z(real) * Z(real) – Z(imag) * Z(imag) + C(real)
next_Z(imag) = 2*Z(real) * Z(imag) + C(imag)

.. until Z escapes or is deemed stuck near 0+0i and use the time to escape as the pixel color. I instead do:

next_Z(real) = Z(real) * Z(real) * (1-k1*sin( time * k2)) – Z(imag) * Z(imag) + C(real)
next_Z(imag) = 2*Z(real) * Z(imag) * (1-k3*sin( time * k4)) + C(imag)

with k1,k2 <1, mostly <<1. If you want to feel slightly offended that I just pretty much decoupled it from Zn+1=Zn^2+C into a set of fairly arbitrary equation systems that happen to look a little like the mandelbrot set, go ahead – I feel a little dirty myself. But hey, I’m just tinkering with shaders.

I also played a little with sliding the exponent around but less than up to 3 or down 1, i.e. instead of Z^2, do Z^(2+-k), k<1. That actually looked pretty similar, but doing non-integer exponents was so taxing that the frame rate started stuttering a bit. Yeah, yeah – oh the horrors – but I just got (well, just discovered that I got five-ten years ago) this ability and I’d like to keep it a while.

Might do more later, I’m sure the possibilities are endless. In general FYI, the shaders mostly use 24 bit floats (sometimes 32), so zooming in it bottoms out around where the slider ends (x10,000,000 magnification). That’s also true if you slide the wobble to zero and use it as a regular mandelbrot plotter.

CSS animations

I just now (very late, I’m sure) that CSS animation actually works really well, and is fairly compatible. They’re usually in part hardware accelerated or at least uses native things that run much faster than javascript doing requestAnimFrame. This is an especially good deal on phones, as they often take a massive hit trying to keep up with javascript animations *and* iOS and Android both handle the CSS animation tag fine.

I’m really new to this since I just noticed, but it’s not too complicated either. You specify (in css or style tag) a few things like a unique name, how long it should run, how many times to loop, etc. Then in a second @keyframes, you define which css properties you wish to have different values and when. For instance:

.hi {
animation: blink 800ms linear 0s infinite;
@keyframes blink {
0% {color: black; }
100% {color: white; }

<h1 class=hi>Hi there!</h1>


The 90s are back! You can add more % lines, change linear to ease-in and a few other for different speeds, change infinite to a number for a set number of loops, etc. A lot can be accomplished for not much load, but really there’s enough examples around. I’m testing doing an actual sprite by setting a pile of pictures on top of each other and switching opacity to choose which are visible and at the same time move it:

There’s some issues with this, like that they’re not technically speaking synced to each other, they’re placed absolute.. probably some other stuff I haven’t thought of. But it sure runs smoothly compared to banging it out in javascript. Perhaps I’ll write more later, gotta go play.