Skip navigation

I don’t know why Google hid the notification log widget and judging from the huge number of apps in the Play store that offer to record notifications for you, it really is a sought after feature.

You CAN access the classic Notification Log in Android 8 on Samsung phones. Use Nova Launcher, then once installed, add a “widget” to your Nova Launcher home screen for the “Notification Log”.

1. Install Nova Launcher and run it
2. Long press on your Nova Launcher home screen


3. Press and hold to add an __ACTIVITIES__ widget (should be near the top)


4. From there choose a Settings widget

20190302_1654495. Choose Notification Log

20190302_1633186. Select your new Notification Log to access the Android Notification Log.


Woot! Old notifications. Did you really need it?


Note this UI only displays about 50 past notifications. I am not sure what it does with older ones.

Originally seen in a comment from Javier P [on this page: May the gods bless his life.

Thanks to Nova Launcher for making such a great app.

This is all just God annoying you.

Radiation isn’t “people cooking“, it is god’s being annoyed you’re alive and his nuking you to try to kill you. You hear stories of “radiation” being done by the government, neighbours, and such things. These stories are likely untrue, and if you’re experiencing radiation then it is LIKELY GOD HARASSING YOU or smaller spirits annoying you. The pain you’re in notifies the spirits and gods of the world that you are being attacked BY THE SUPERNATURAL and WILL DIE SOON IF YOU’RE NOT HELPED.

We don’t think people will bother very much to setup EM harassment weapons to bother their neighbours. When you believe such things, it is likely spirit influence causing you to do so.

“Gang stalking” is just when the god uses the people to appear to be making fun of you, teasing you, taunting you with “2nd meanings”. It is unlikely a random group of people would just start going after you, though it could happen, it is likely god using the people while they’re unaware to tease and taunt you.




Positive and negative lookahead are great features in regex.

Nice MSDN article here.

Say I’m trying to pick all the words starting with the letters “un” in the following:

unite one unethical ethics use untie ultimate

I could use a regular expression like:


What this says is:

  • \b – MATCH A BLANK
  • (?=un) – This is the “zero-width positive lookahead”. It says “CHECK IF THE NEXT TWO CHARACTERS ARE EXACTLY “un”. IF SO, THEN MATCH \w+. IF NOT, THEN THERE IS NO MATCH HERE. Note that the zero-width positive lookahead is used to eliminate non-matches but it doesn’t match anything itself (zero-width). It needs to apply to an expression that will be used to match SOMETHING, in this case it will apply to the \w+ immediately following it. The zero-width lookahead APPLIES TO THE EXPRESSION IMMEDIATELY FOLLOWING IT (the \w+ in the example above).
  • \b – match a blank

So I ordered a new phone from my carrier. It being an ANDROID device, they very ruthlessly wiped out my voicemail from my iPhone by unlinking my Visual Voicemail feature. When I asked them to add it back, they did, but the iPhone had cleared all the visual voicemail! How silly.

The iPhone stores the visual voicemail LOCALLY, and it IS NO LONGER ON THE CARRIER SERVER after a few days.

I don’t really need the voicemails, but Shaitan does. So I had to set out on a mission to recover the voicemail, for the dark lord.


Now hopefully as a devotee of the darkness you have ENABLED ICLOUD BACKUPS FROM YOUR PHONE ALREADY. If you have done so, you are likely in heaven, because the voicemail data is backed up in iCloud1 even though it is NOT VISIBLE from the page.

Hopefully also, as a devotee of the dark lord, NOT A LOT OF TIME HAS PASSED SINCE YOUR VOICEMAIL WENT MISSING – for me, the last 3 days iCloud backups were available. Since mine disappeared on Dec 31, 2017, I was fortunate to find a backup that had the data I needed on Dec 30, 2017 right from the recovery screen. If a longer time period had passed the Dec 30 2017 backup might not have been there, but it may still be available somehow.

If you haven’t done so, you still have a good chance via disk-scanning strategies like this. But avoid disk-scanning strategies if you can.

Fortunately, lives were spared thanks to TENORSHARE’s ULTDATA – A FANTASTIC PROGRAM. PAY THEM ALL THE MONEY THEY WANT, IT IS WORTH IT (you should take the FAMILY PACK for $69.95 USD because it has UNLIMITED USE, whereas the $49.95 1 year subscription only allows 1 year of use).

You can archive all the data then proceed to make a Devil’s food cake and enjoy the rest of your day when you’re done.

051103076-01-devils-food-cake-recipe-thumb16x9 0044209307570_cl_default_default_large

Enjoy this after you’ve recovered your data. Or before, since you will recover your data. Or now, if you just feel like it.

All you have to do with the Tenorshare program is as follows:

  1. Install the program
  2. Click “Backup from iCloud”
  3. Select a date that you think will still have your voicemail in it
  4. Let it process
  5. Extract the data and backup to Dropbox or whatever backup service you use

.AMR audio files can be played back in VLC MEDIA PLAYER.

1 This article lists “Visual Voicemail password” but iCloud backups INCLUDE ALL VISUAL VOICEMAIL. They are remarkably small by the way, only a few kB each message.

I’ve got a small beef with amazon drive. Although the service seems excellent, I was disappointed at their pull-back of an UNLIMITED STORAGE PLAN for only $89.97 (I think that was the price).

Something about the app irks me also. MAX_PATH.

The Amazon Drive application on Windows cannot keep your Amazon Drive folder in just C:\Amazon Drive. It has to be in C:\Users\<<USERNAME>>\Amazon Drive. I mean “Amazon Drive” (12 characters) is long enough as it is, but to require it to be in Users\MYNAME (a good 10-15 characters more) badly chews into the 260 character maximum of pathlength you are allowed on Windows.

So for my files in C:\Data\FolderA\FolderB\Really long folder name\Another really long folder name\Detailed file name with very long name.doc I may be SOL when it comes to just importing this directly into my C:\Users\MYNAME\Amazon Drive folder.

They should allow me to put my files at least in C:\AmazonDrive and not require a space in the name or if they really want me to feel comfortable HOW ABOUT AN 8 CHARACTER NAME like C:\AMAZONDR.

How to create a custom theme in Sublime Text 3.

  1. Select Sublime Text / Preferences / Browse Packages …
  2. Create a folder adjacent to the Users folder called THEMES.
  3. Any any custom themes you want to your new THEMES folder, for example 1337, or create your own file to that folder
  4. Back in Sublime Text 3, select Sublime Text / Color Schemes / THEMES / YourTheme.tmTheme to use it.

From google dictionary:

Sarcasm: The use of irony to mock or convey contempt.

From theoatmeal:

Verbal irony: Speaker says one thing but means another. Example: “I love toast like that” but it is burnt.

Dramatic irony: An event occurs with significance the audience understands but characters do not. Isn’t this just a foreboding hint?
– Eg his breaking a plate. The audience knows it means it will be a bad day for him, but the other characters don’t interpret this.
– Its IRONIC that the characters don’t get it. They SHOULD GET IT because they’re in it, but they don’t because they can’t see what we see. And we get it when we shouldn’t because we’re not in it.

Situational irony: Key is reverse happens to what may have otherwise happened.
He tries to destroy my vehicle and I get a new one because I’m awarded extra cash to fix the vehicle which is so much that I get a new one (or I win a new car which I get by playing some game)


If you’re having a problem compiling with an imported project check:

  1. The path of the engine in the .vcxproj
  2. Visual Studio version (VS 2013 project doesn’t work well under VS 2015, try and upgrade)

Code Compare. This is exactly the tool I was looking for.


It reminds me of a modern version of Windiff.exe. With handy widgets for copying left and right (which WinMerge does not supply), this tool is well worth the $49.95 licensing cost (but a lower one-time purchase price of just $20 may be better).


Getting a hang of Microsoft Word styles can be difficult. Here are a couple of issues solved.

Font of a Style overriding main document style

The font used in a word for a style is actually located under Font, and it DOESN’T have to be the name of a font. It can be +Body or +Heading if you wish, to use the default body or heading fonts. Simply choose one of the top two items in the dropdown list (defaults Cambria (Headings), Calibri (Body)) to use the default fonts for the document. Alternatively if you go into the drop down in the lower left corner and select Format / Font.., you can choose either +Body or +Headings to use the Body and Headings default fonts respectively:


To change the DOCUMENT’s default fonts, you have to go to the Design tab in the Ribbon, and select the Fonts dropdown to the right of the Themes listing.


1. Casting a spell is an expression. All you have to do is express what you want. You can use pictures, feelings, anything.
A spell is the feeling of it.
It’s best to picture the end result of the spell, that way the pathway to make it happen is automatically figured out and it leaves less room for someone else to interfere with the spell. For example, if I want to have a nail in a wall, rather than picture the nail in smoothly, I should picture JUST the end part, where the nail IS in smoothly. This clearly expresses what I want with no ambiguity and no room for someone else to interfere with the spell, which they may do to cause it to fail.

2. Your subliminal wants emerge in your world. You are continually casting magic by your wants and desires.

A subtle trapping is to be harmed by fearing something so much that you just want it to get over it. For example, if you’re hammering a nail, you might fear hitting your thumb so badly that you “want” to hit it, just to avoid having to fear it any longer.

This sentiment can kill you however. To avoid feeling it, really think about what the bad outcome means, and what would happen if you DID hit your thumb.

Arc length is just:

L = rθ

Verify this by acknowledging

C = 2πr

In that case, θ = 2π

4d space is simply overlapping 3d volumes.

each dimension you add multiplies the previous dimension by infinitely many of the previous “type” of object.

For example:
0d: a point.
1d: a 1d line, or infinite stack of parallel 0d points
2d: a 2d plane, or infinite stack of parallel 1d lines
3d: a 3d volume, or infinite stack of parallel 2d planes
4d: 4d space, or “infinite stack” of parallel 3d volumes

parallel 3d volumes may seem hard to visualize, until you realize that they are just overlapping 3d spaces.

if you know computer graphics, think of rendering the same thing twice in the same spot. for example, a character, once with normal skin and once with werewolf skin. the second render introduces a “4th dimension” or a “parallel reality” for the character. if both renders are supposed to represent the same character, and these impassible objects can overlap, then we are now talking about parallel 3d spaces (since overlap of solid objects should not be possible in a single 3d space). the character now appears in 4d space, where he experiences the “parallel realities” of both being “normal” and “werewolf skinned” at the same time.

There’s an odd quirk in PowerPoint 2016 that causes the Text node in the Slide Master to not show up in the children.

  1. Insert Slide Master
  2. Move the text in the MASTER SLIDE off to the right, so you can clearly see which ones it is has skewed in of the LAYOUTS that are automatically set up below.
  3. Delete all the template layouts so you just have the Slide Master EXCEPT the 2nd Layout that has the movable Content node.
  4. You can duplicate this Layout node for additional nodes that have linked Content to the Master node.


This is the only Layout whose Content node modes with the Text in the Master. It’s difficult to get Powerpoint to behave this way otherwise.

By default, PowerPoint cleans up (by deletion) all unused master slide layouts almost immediately after you click “Close Master View”. As such, be sure to PRESERVE YOUR LAYOUTS by clicking the thumbtack icon just prior to closing out of the Slide Master View.


There’s this really strange feature in Word called a “hanging indent” paragraph.

Hanging indents get activated when you press “CTRL+T”.
To undo a hanging indent, you can simply do any of:

b) Click on the 2nd line and drag the indent bar back
c) Right click the second line, click Paragraph, then remove the indentation from that line.

TortoiseGit has a really great Word Document Comparison feature that you can use.

First, install PanDoc, then edit your .gitconfig to add the capability to GIT to decipher and compare Word files.

# Your .gitconfig is in C:\Users\William (where William is your Windows user name)
# Minimum required changes to your .gitconfig to enable Word doc comparisons
[diff "pandoc"]
 textconv=pandoc --to=markdown
 prompt = false

Next, install TortoiseGit.

In addition, you need to edit your .gitattributes file in your git project’s folder (add one if you don’t already have one in the root of your project).

# .gitattributes file in root folder of your git project
*.docx diff=pandoc

After you do this, if you right-click compare two .docx files, you will be able to compare them with each other. The first document clicked is the original document (top pane), the second document is the revised edition (bottom pane).

The changes to the final document (left pane) will be as if someone has gone through and edited original document with track changes on, using the changes that are in revised document.


Loading .gif’s in Win32 is really easy through a GDI+ pathway.

The short of it is something like this:

#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
// .. main()
Image *image = new Image( "image.gif" );

Functions are located here:

An example is here:, or here.

You have to do File | Save As… then hit the Attributes button at the bottom


There’s a really simple dialog in File | Batch Processing… / Convert which lets you downmix a bunch of files at once also.



A bit of a weird issue, when you declare a static variable in VS 2015 you can initialize it in the member declaration:

// Unit.h
struct Unit
  static const char Character = 'P'; // class-level var
  char symbol; // member var
    symbol = Character; // init with static var

Something weird happens with the compiler sometimes however. On multiple compile/runs, the variable of the static const char Character, when changed, doesn’t bake properly into the exe.

To fix this, just split the declaration and initialization into a corresponding .cpp,

// Unit.h:
struct Unit
  static const char Character; // class-level var, init in .cpp
  char symbol; // member var
    symbol = Character; // init with static var

// Unit.cpp
const char Unit::Character = 'P';

There’s an odd thing that can happen in Windows 10 when you try to change your monitor settings with the NVIDIA Control Panel. When you try to change some multi-display settings, you may get the following dialog, stating:

“Your changes cannot be applied right now. This may be due to any of the following reasons:

  • A video is playing or a video application is running
  • A game or 3D application is running in full-screen mode
  • A command prompt window is running in full-screen mode
  • You have rotated your desktop with the Rotate Display page
  • The Display Optimization Wizard is running

You can try to apply your changes again after resolving the conflict.”

Screenshot 2016-02-06 09.03.05

I resolved this by closing Skype of all things. Even though you wouldn’t suspect a program like Skype would violate the above constraints, it does.

You can use the Add Divisions dialog for this.

Click Edit Mesh / Add Divisions.

If you add the divisions as LINEAR QUADS, you get a nice subdivisioning like so:

To Bind a hand-held weapon to a mesh (when the mesh is a single mesh as UE4 requires) keep the bones SEPARATE (unparented) when you first bind, then parent the bones together AFTER mesh bind. This prevents mesh pieces from different weapons from receiving influence from bones intended for different meshes.


I found this problem coming up after I:

* Had a mesh that I wanted to adjust
* Detached skin & adjusted the mesh by moving faces
* MOVED/ROTATED A CONTROLLER which had Orient Constraints & Point Constraints on a bone for the mesh
* Tried to re-bind the bones & skin, which caused the error

The solution was: Delete the moved controller, then delete any IK handles upstream of the moved controller (maybe even all of them).

When creating an animation of a cloth for example, you may like to take a snapshot of one frame and save it into the mesh.

To do that you use Animate / Create Animation Snapshot. …

The settings that work for cloth are:

Start Time: Whatever
End Time: Whatever
Increment: any

Update: FAST (update only when keyframes change)

If you use On Demand or Slow Updates, the animation snapshot won’t work for cloth

animation snapshot

All objects in Maya are actually accessible by string.

So when you type

$var = `select -r objectName1`;

Maya will select that object in the viewport.

But $var doesn’t contain anything but a string! It just contains the string name for the current selection.

To iterate in maya, you need to use the polyEvaluate function, which retrieves things like the NUMBER of faces or vertices a polygon has.

Access of individual members of the polygon is by string:

Vertices: polyName.vtx[index]
Faces: polyName.f[index]

It turns out that the .vtx, .f, and .map are NOT objects. They don’t have a .size() member or anything, they’re just “string addresses”. When you address polyName.f[0], that’s the first face in the mesh. You have to pass the string address to a function to use it though.


Declaring arrays with a leading 0 doesn’t work.

Move to origin:

// Zero transformation on manipulator (world space).
move -rpr 0 0 0
// Freeze transformations afterward to park manipulator @ origin
// Zero the transformation on object (local space)
string $objects[] = `ls -sl`;
$obj = $objects[0];

setAttr( $obj + ".translateX" ) 0.0;
setAttr( $obj + ".translateY" ) 0.0;
setAttr( $obj + ".translateZ" ) 0.0;

setAttr( $obj + ".rotateX" ) 0.0;
setAttr( $obj + ".rotateY" ) 0.0;
setAttr( $obj + ".rotateZ" ) 0.0;
int $maxTime = `playbackOptions -q -max`;
for( $i = 0; $i <= $maxTime; $i++ )
  currentTime $i;
// left leg / right leg copy.
// use: select src controller, dst controller then
// run the script.
proc copyKeyframes( string $o1, string $o2, int $kf1, int $kf2, int $maxTime )
  copyKey -time $kf1 -attribute translate $o1;
  pasteKey -time $kf2 -attribute translate $o2;
  // if the dst frame is frame 0, also copy into end frame
  if( $kf2 == 0 ) { pasteKey -time $maxTime -attribute translate $o2; }
  copyKey -time $kf1 -attribute rotate $o1;
  pasteKey -time $kf2 -attribute rotate $o2;
  // if the dst frame is frame 0, also copy into end frame
  if( $kf2 == 0 ) { pasteKey -time $maxTime -attribute rotate $o2; }

int $maxTime = `playbackOptions -q -max`;
string $objects[] = `ls -sl`;
$o1 = $objects[0];
$o2 = $objects[1];
int $kf = 0;
while( $kf <= $maxTime )
  $kf = `findKeyframe -time $kf -which next $o1`;
  $kf2 = ($kf + $maxTime/2) % $maxTime;
  print $kf;
  print " ";
  print $kf2;
  print "\n";
  copyKeyframes( $o1, $o2, $kf, $kf2, $maxTime );

You can actually apply multiple textures to the same object group in maya. Simply select a set of faces and right-click-drag the desired material to the faceset.

The Move Tool: axis reflection of manipulation

The move tool has the ability to reflect selection and manipulations of vertices across an axis plane.

Go to Window / Settings/Preferences / Tools Settings to change the properties of the move manipulator tool.

The dialog box looks as follows:

Scroll down inside the Tool Settings dialog until you come to Reflection Settings and hit the checkbox beside Reflection:

Select the Reflection Axis as either X, Y or Z, and experiment with it.

Get a Rotator facing a certain direction:

use FVector::Rotation()

There’s a really great article about emotion combinations here.

A very interesting diagram!


UE_LOG is easy to use! There are just a couple of tricks that you need to know.

  1. Always use the TEXT() macro
  2. When LOGGING an FSTRING, always preceed the FSTRING with *


Plain text

UE_LOG( LogTemp, Warning, TEXT("A log message") );

Printing an FString

To print an FString into a UE_LOG() message, you have to remember to preceed the FString

UE_LOG( LogTemp, Warning, TEXT("%s"), *actor->GetName() );

To print an FString into a UE_LOG() message, you have to remember to preceed the FString

UE_LOG( LogTemp, Warning, TEXT("%s"), *FString::Printf( TEXT( "%f" ), 47.f ) );


Any goal that you set has a timeframe. The further out your “goal” is (basically how long it will take you to get there) determines how “realistically” you can actually achieve that goal. If a goal should not be achieved, then it should be abandoned and another goal set instead.

Say for example I have a goal of having a cup of coffee this morning. That’s an almost 100% achievable goal. But say I want to become the mayor of my home city. That goal is pretty much more difficult to achieve, since the number of intermediate steps (time) to get to that result is large.

How to achieve a goal (no matter how large)

Let’s take the example of becoming the mayor of a city called Pickering. That goal is pursued in a series of small steps. The steps might be like

  1. graduating from school for political science (unfortunately there are no schools for “mayoring”)
  2. doing volunteer work here and there to better know the city you want to be the mayor of
  3. doing an internship in a city office

ITERATE ON YOUR GOALS IN SMALL STEPS. Take into consideration CURRENT STATE of the system at each step to determine if you should CANCEL the GOAL or continue pursuing it. The higher the cost of the step, the more costly cancelling is, which is why you iterate in small steps.

I’ll use the Warcraft 3 video game as an example. If you haven’t played it, go and try it! It’s a great game.

The main goal of Warcraft 3 is to dominate the map by destroying all your opponents. You want a maximum number of resources also. So, say for example, you plan an early expansion in order to win the game. That may or may not be a good goal, depending on what your opponent is doing.

Say for example, you scout early and notice they are planning a rush. Your goal of expanding out to the nearby goldmine must be cancelled, or you’ll lose.

DON’T CHOOSE SOME ARBITRARILY DIFFICULT FINAL GOAL STATE FOR YOURSELF (for example, I want to marry “Josephine” (whoever that is)) and run for it despite “Josphine” not even possibly being an ideal mate for you. Your initial goal may be wrong for you. You make selections of what your goals are based on your current state. If your current state changes (for example, you lose a leg), then the goals you set for yourself may be wrong for you at that changed state.

Say Josephine is an athlete, and you are one also. Is Josephine still a good choice for you (will both you and her be happy together with you in the “leg lost” state?) Could be, if she doesn’t mind her husband having 1 leg!

You always have to re-evaluate your long-term goals as you are pursuing them. If they are the wrong goals for you, then change them!

Often, people who run academia are concerned that their methods of evaluation of human intelligence might not be as accurate as they need to be.

If a student is lazy, and doesn’t do any work, and so achieves low marks, is it fair to say that student is not very intelligent? Probably not, but it’s what people do.

So, there must be some biological basis for intelligence that could be used to rate the intelligence of a person.

Try browsing this paper on dendrite structure. In my thinking, I hypothesize intelligence could be measured by 3 things:

1 – speed at which they learn [physically: formation of neural connections]
2 – amount of information they can retain after learning [how intact the biology stays]
3 – speed of recall information previously learned (“replay”) [space between dendrites, quality of white or gray matter between dendrites]

But here’s the thing. Learning snowballs. If you understand how to do addition already, learning to do subtraction will be learned much faster than if you didn’t already understand addition to begin with.

Learning is only possible, however, if you are paying attention and understand what is being said. Biologically, this should be measured by the speed of formation of new synapses or connections in the brain.

A good class is “fun” and easy to learn/remember because it puts the brain in an entertained state which makes learning easier because the brain is more active in that state, so more neural connections can physically be formed.

Even a good movie is easy to remember (usually) because it puts the brain in an excited state, which makes information storage in the brain more likely to stick.

how to be happy.

1. have something to compete in that you find challenging, but can win at (sometimes). (winning all the time can be boring!). too much of this makes you a “jock”, which isn’t a bad thing.

2. something to grow and look after. students, children, a garden, etc. too much of this without being paid well for it will make your life appear unappreciated.

3. sex, food, bodily pleasures. too little of this can make you feel deprived, need just the right amount.

I created tradevertise recently. The idea is to find stuff that is close to you and trade with local people.

The internet changed things. It changed how information is shared. We went from knowledge being parked away in books at the library, to information being available at your finger tips, on your phone, while you’re in the bathroom. People have more free access to information than ever before. And it’s use to ARPANET!

Is that good? For consumers, yes! For producers? Maybe not.

I wonder what computer jobs were like in the 80’s. When the know-how of how to create a database schema was parked away inside a lengthy tome that only the senior engineer could grok. Now, that information, the answer to that same question you’ve had and would have spent days searching for the answer to, is now available in an online catalog. Got a problem? Go to google, type in your query.

Google changed things. Google indexed the internet. Google is like the computer catalog in the library.. except Google is slowly becoming the front end to all human knowledge that anyone cared to enter into the internet.

So information is transferring.. from humans, to machines. represents a corpus of knowledge that far superceeds what a single programmer could ever learn in his lifetime. It is the accumulated knowledge of what many programmers have learned in their lifetimes. And it doesn’t forget. Except for mod-delete.

So people just drop all they know into the internet. They get a +1! Thanks! But not paid for their contributions, which could potentially reach 100’s of people, some of which are corporations, businesses, places that will make money on what you’ve given away for free.

Now who gets paid? Let’s see.

  • Google: Advertising
  • Sites that host content: whatever they manage to make on ads or the sale of other services
  • Actual Internet Contributers: 0

So, what’s the deal? Smart people are not that important if their knowledge, ability to learn, ability to retain knowledge is not important (since machines cover that..)

But what if smart people all of a sudden stopped existing? Say suddenly, all your savants just stopped being savants, and all you had were non-nerdy people. Then the machines would stop learning :). The indexes would have less to index. And maybe humanity wouldn’t progress as quickly.

Your Academic Career Is Just Masturbation

What is state of the art in industry? Take a look at that.

Now take a look at your MSc or PhD paper. Back to state of the art in industry. Back to your MSc or PhD paper. Your MSc is now irrelevant.

The fact of the matter is, most of the work done in Universities for MSc or PhD work isn’t very good. In fact, it’s below not very good. It’s downright abysmal.

Nobody needs you to write about the role of a specific gene, or yet another computer vision thesis. US government labs, and industry labs already have research superceeding what you spent the last 3 years working on by decades.

It’s only logical. Research builds on what came before it. The state of the art, in computer vision, for example, is top secret — if those algorithms were released, it would be a security hazard for the US. The US military doesn’t publish its cutting edge research for a reason! It took the US military decades of research to get its flight control software to where it is today. I don’t mean to discourage you, but the tendency for smart people is to let their brains get to their head. You have to realize what you’re up against when you try to prove you know something to the world: the world collectively knows a lot more than you do.

So chill out. Calm down. Check yo’ self. What you’re doing in academic work is not that important. Technologies come and go in industry like you wouldn’t believe. The bottom line is, if it doesn’t make money, nobody cares about it.

Your research is only a means to an end. The end is get the jobs you want. The means justifies your being able to get those jobs to everyone around you.

Say you’re inventing yet another programming language to make writing code “faster and more efficient”. That doesn’t matter if your faster and more efficient code doesn’t get sold or seen by anyone. Are you an avid participant in, with 100k reputation? Stop that. You are masturbating. And according to lore masturbating could give you hairy palms or even sudden death. Do you get happy when you see imaginary points rack up in social karma sites? Big mistake. You’re conditioned by the gamification of social websites into thinking that the “work” you’re doing by helping others is actually useful. It’s not. By spending time on programming forums not making money and “pursuing knowledge”, you’re effectively wasting your life.

So what do you need?

You need sales. You need customers. You need relationships.

Take a look at the Google Graveyard. Leave your flower. If you’re a code geek, the effect should be chilling. Don’t make me spell it out for you. The vast majority of coding projects die. The vast majority of startups die. The .COM bubble burst because there was no money coming out of these websites that looked promising but offered services for free.

Balance your life

If you are doing an academic degree and are still single, you’re in huge trouble. Because the social aspect of your life is yet undeveloped, and you think your research is so important. Go out and have a beer. Have 2 beers. Mix and mingle. Have sex. Have plenty of sex. Get a partner. Sex is very important because it will develop you socially.

The social aspect in a company isn’t just “50% of the work we do”. The social aspect is everything. If you’re not social, you won’t have a good career.

It was great when it first came out. A competitor to DirectSound that worked on all systems. It still is kind of good.

But, the problem is, it _started out_ free, open, with no licensing fees, and cross platform. People promoted it widely, everyone paid attention, and many adopted it, after all it was “Free! No licensing fee!”

Then Creative Labs took over OpenAL and made it proprietary. But people continued to use OpenAL 1.1… since OpenAL 1.1 “works well enough” it isn’t being updated or maintained, and it continues to see widespread use.

However other sound systems such as FMOD or DirectSound have made many improvements over the base functionality OpenAL 1.1 provides.

The result of OpenAL 1.1 being available is a whole ton of systems is it became very old very fast, it still works, but not nearly as competitively as it did in 2008, for example. And there’s little chance of the situation for OpenAL The Free And Zero Licensing Cost Audio Software of being maintained by the open source community.

I keep coming across code like

for( int deviceIndex=0; deviceIndex < devices.size(); deviceIndex++ )
    devices[deviceIndex].param += value;

what’s wrong with this code? wouldn’t it be a lot better like this?

for( int i=0; i < devices.size(); i++ )
    devices[i].param += value;

i is a dummy variable. It’s name doesn’t matter – it just needs to be short. devices[deviceIndex] is redundant – we already know what we are accessing by the array’s name, devices[deviceIndex] is just longer and noisier than devices[i] – without adding additional clarity.

Just came across this in a C code apple example:

  // stuff..
} while (false);

The code breaks the loop when an error occurs inside it. This is kind of like try/catch/finally, where you have a simple catch(…) all block that you jump to if you “break” the loop. It seems like a poor substitute for a function call however.

Some artifacts may arise. For example, say you inherit from std::string. You want to write a function that ends up calling a method from std::string that returns a std::string: (like .substr()). Now you have an extra ctor call to construct your derived type object —

I’m testing polldaddy polls. Here’s the link.

The weirdest shit. You have to ask OpenGL to normalize byte colors. So the correct call to glVertexAttribPointer would be:

glVertexAttribPointer( attribNo, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, squareColors);

I spent like 20 minutes looking for what the problem could be with my code when I tried to switch float colors to byte colors, all my colors were white. And it was just this `normalized` flag.

I effectively had this:

void fun( const char* msg )
  function = [msg](){
    // do something with msg

Then call:

fun( string( "oh hi hello" ).c_str() ) ;

See what’s wrong? The string object whose char* ptr I passed to fun _dies_ immediately after the line executing call to fun runs. So the captured const char* ptr [msg] is invalid if function() runs at a later time (after return of call to fun())

nov 20 2013 4:22p

The item that an enemy would go for was flip flopping. It would continually flip between chasing after the 2 nearest items. I detected this bug in 2 minutes on the 1st launch, because I had inserted printf statements.

– Detection: printf statements
Enemy squadron Fighter thinks item B1 is reachable in 2.703664 seconds
Enemy squadron Fighter thinks item Bandit is reachable in 2.884945 seconds
Enemy squadron Fighter thinks item B1 is reachable in 2.703305 seconds
Enemy squadron Fighter thinks item Bandit is reachable in 2.884617 seconds

Reason: units were programmed not to chase after items that units on their same team were chasing after. Unfortunately overlooked the fact that I would be seen on as on my same team.

– If I’m already gathering an itembox, stick with it until i get it OR
– If the person gathering the itembox is ME, keep going after it.

Using integer indices into arrays of objects (instead of iterators, or pointers to the objects themselves) has saved my ass many times.

Say you have a vector<Object>. Well, you wouldn’t store pointers of type Object* to an element of this array, ever, because if the vector gets resized, all objects get deallocated/reallocated and so all your previous references will be invalid. But if you store a vector<Object*> and save an external reference to an Object* within that vector, then that’s no problem.

But anyway, storing integer arrays is much better than storing copies of pointers. For one, if the pointer gets deleted, you’re not left with an invalid / dangling pointer somewhere. Checking if a reference into the array is valid because you just have to check the integer index is between 0 and (.size()-1).

Simple example

f := (x) -> x^2

Is the function f(x)=x^2. You call it by writing


To animate the function, just add another parameter and give it a range in a plot command.

plot( a*f(x), x=-2..2, a=0.1..5 )

C++’s RTTI is expensive. Very expensive. Notoriously and verifiably expensive.

So how can we efficiently get information of the concrete subclass, given an abstract base class pointer, without the great expense of using RTTI?

Simple. Use an enum.

Consider the example in my stackoverflow post. What I did there is just keep a single bitfield (an int) that has concrete types bitwise OR’d in, in each derived constructor.

So, in the example posted, an object of Type BigCat would have 0111 for its typeTag field, indicating that it is an Animal, a Cat, and a BigCat. Concrete type checking is cheap as a bitwise AND.

eta is easy to compute if you have distance between 2 objects, their relative accelerations, and relative velocities.

By _relative_ accelerations and velocities, i mean the rate at which they are coming together. So you have to project both objects’ velocity components onto the line joining the two objects, and use that scalar component in these computations.

Without further ado, eta:

eta = -v1 +/- sqrt( v12 + 2a(dist) ) / a

In image:

I ran into this error before, it is described here. Basically preface whatever the offending line is with this->.

Did you know if you work in “High Quality Rendering” mode (click the red box) the split polygon tool is _much more helpful_?

What’s wrong with this code?

class Object{
  int x ;
  Object() {
    defaults() ;
  Object( int ix ) : x(ix) {
    defaults() ;
  defaults() { 
} ;

Well, obviously x has the value 0, instead of the initializer-list desired default value sent `ix`.

So, what happens when you have 10-15 members that all have default value initialization in defaults(), and possible assignment in the initializer list, is defaults() clobbers whatever was sent to the initializer list, since the initializer list runs first.

I puzzled over this for a few minutes.

Warcraft 1,2 & 3 used swords for attack, shields for stop. It works because the entire theme was medieval. So, swords mean attack, shields mean “stop”. Regardless of unit type (even air units — there’s no cognitive dissonance there).

Starcraft 1 & 2 cleverly abstracted this away though. Swords clearly wouldn’t fit in Starcraft. Different units had different means of attacking. Zerg never use guns. They use spit or claws. Protoss had some “sword-like” units that did hand-to-hand combat (zealots), but other units fired projectiles (dragoons). They used a _crosshair_ instead for the attack symbol.

So, in my own game I had to think, what symbolizes _attack_ in my game? It’s a space combat game, and attack is done primarily via missiles. So I subbed in a picture of a missile for attack. And voila. The right symbol for attack is _a picture of whatever attacking is done with_ in your game.

If it were a streetfighting game, you’d use an icon of a fist.

I couldn’t find a way to do this through the GUI, but I’m positive there was one.

Anyway, the MEL command to show normals for the selected mesh:

polyOptions -dn 1;

And to hide them again

polyOptions -dn 0;

Taken from here

Maya rotate snap hotkey is j

j means rotate snap, because you know, in original english rotation by discrete amounts of 15 degrees was called “jotation”.

Anyway, double clicking the ROTATE TOOL gives you a box @ right, you can modify the size of the discrete step there.

If you notice, holding j “temporarily” clicks on the “discrete rotate” setting.

Maya vertex snap hotkey is v

If you hold v it will let you snap a vertex to another one while dragging.

Maya show vertex location

Maya is a visual editor, so they actually hid the information of the numerical coordinates of the vertices pretty well.

You can usually get the results you want by snapping. But when you can’t, there’s the Component Editor.

You go to Window / General Editors / Component Editor to get it. I learned this from a SimplyMaya thread.

I almost forgot the simple formula for checkerboarding,

if( (i % 2) == (j % 2) )  WHITE;
else BLACK ;

If both i and j are EVEN, OR both i and j are ODD, you get one color. If they differ in “oddness” then you get the other color.