Maxgress 1: the need for databases

The first component of the Maxgress suite that I will need to build will be the foundation of the rest of this project. Or, that is the goal, anyway.

In the early stages of researching this project I stumbled across IITC, a series of scripts that modify how Ingress works. One that I found early on and used to explore some things was the Bookmarks plugin. Using it you can bookmark portals and export them as json to be saved elsewhere. The portal list looks something like this:

        { "label":"Others",
            "id1466549390649":{"guid":"dadb971b58644bacadcccade8bb2b85b.16","latlng":"35.221074,-101.887007","label":"Saint Hyacinth Stained Glass"},
            "id1466549394748":{"guid":"fcc62a980f324b90a1165be25adddfa9.16","latlng":"35.216375,-101.907891","label":"North Point Church"}

Basically each portal seems to consist of a GUID, location and name. While exploring the front end and considering what it is I wanted to make, I collected some 1700 portals. Last night I set up a web-accessible MySQL database, so the first order of business will be to import them into the database. (Since it is shortly after midnight, that will have to happen tomorrow.)

An introduction to Maxgress

Ingress is a massively multiplayer, location based augmented reality game that I enjoy playing. It is run by Niantic, one of the Alphabet/Google companies.

Niantic amassed a collection of user submitted physical locations on Earth which they call “Portals”. There are two teams, Blue/Resistance and Green/Enlightened. By default portals are neutral and inert, however a player can deploy (up to) 8 resonators on a neutral portal and take possession of it for their team. This is not the only action that a player may take, they may upgrade lower-level resonators to higher level resonators, employ mods which can affect how the portal operates, “hack” the portal to receive in game items (potentially including a key to the portal), or link portals together by giving up a corresponding key.

When two portals are linked, they create a barrier between them which allows no other links to pass through. If three portals are linked into a triangle the player captures the resources under the field the triangle makes. The value of the area under the triangle is determined by some algorithm that Niantic has, probably related to IP addresses or something – generally densely populated areas generate more than sparsely populated areas, however corporate parks can generate more than apartment buildings. While this algorithm may be explored later, we are done with it for now.

When I was a new player I was frustrated because it is a multi-player teamed game meaning the kind of information I would like to have (A database of all the portals in my county, automated tools to help during group efforts, other things) were not available, and for good reason, it would skew the game.

I am going to build the tool set I think that I want, and I am inviting you to come with me!

Thoughts on marketing from the consumer perspective

If you are going to ask someone to become a product, make it easy for them to become a product. Make the barrier to entry clicking on a link, maybe putting in some contact details (depending on what you are doing), and then clicking a button. That is more work than most people will do without getting something in return, however it is legally the least work that you can ask them to do for most marketing related things.

You want this to work really well? Give them something that they would not find elsewhere. Something about them or the situation they are in. Provide a way that they can logically categorize themselves, and then tell them what product suits the needs of that category. Make this either totally transparent or totally opaque, but never change it from one to the other. Make them feel special about what you can tell them about their needs and how you can help fill them based on their category.

A log over due update.

Things are amazing at the I-soft.  This is probably the longest time that I have stayed in the honeymoon phase with something.

Some things that I have been doing outside of (and occasionally within) my job.

  • Crackbrain provides some one off functionality for Infusionsoft. It was originally built to demonstrate a fix the tag application reports inability to report by tags, however there are actually people who use it, so it is making me build:
  • Tagapps. This is my much better implementation of Crackbrain. There are several things that make it better, chiefly it is being built with an actual framework doing all of the things that I did by hand. (cough cookies cough) It is being built on an AWS EC2 server because shared hosting was not cutting it for some of the functionality that I want and also because EC2 servers are free for the first year, so I am giving them a whirl.
    • as a side note, the EC2 server also is serving a local copy of owncloud and ICEcoder both are phenomenal projects definitely worth exploring if you are looking for a personal cloud or a web-based text editor.
  • My ISServer actually started from crackbrain, but it is quickly being utilized in other projects in different ways. It will, it its yet undetermined (current) final form be the main tool for TagApps as well, but there is still a LOT of functionality that I intend for it that needs to be built.

Infusionsoft API Python implementation of OrderService.placeOrder

Wow, it is December already?  Having an actual 9-5 has really given a hit to what I post here.  (I did mention that I work for Infusionsoft now, right?  It is a freaking amazing place to work bee-tee-dubs.)

Anyways, I am posting here today because I have been working on a really basic web based example of the Infusionsoft API in Python.  I call it the “Better Tag Application Report” because that was the impetus behind making it a website where other people could use it.  Infusionsoft has a tag application report, however they show you EVERY SINGLE tag that was applied between two dates.  If you were only interested in one particular tag (which most people are, let’s be honest) you have to run the report and then export the results.  Some users do not mind, but that seems like a lot of work to me.  So I made a report that gives you the ability to run that report with both tag and date criteria. From there it things will make sense for me to implement and so I do.   (You can see current iterations of it on Crackbrain. While I do try and keep the git up to date, I will generally only upload the end results of a weekends work.)

There were several things that I attempted did get done this weekend, some of them I got done easily (sorting the btar by application date), however some of them were more of a bear to figure out.  One function that I am still implementing is placing an order through the API. My interest in this was spurned by this forum post where a user is unable to get a Promo code to work in their API call.  Before this post came up myself and some of the other support folks thought that Promo Codes were only for tracking when used with the API.  I had no idea that they would actually modify the order through the API.  Even though the Official Documentation on the subject says

Whether or not the order should consider discounts that would normally be applied if this order was being placed through the shopping cart.

I wanted to test it.  So I started to build that functionality into Crackbrain.  I got most of the way through the process before testing my assumptions regarding how Infusionsofts system worked.  I learned a couple of interesting things :

  • “HideInStore” literally means “Hide in store”  Since I work with the software day in and out this table item really confused me, but I finally found that it is analogous to the GUI options of Cart Options -> Is Hidden in Cart (yeah, I never realized that that meant hide it from the store front).
  • The default payplanId is 0.
  • If you put the Referral partner id as “0”, then, thankfully, no RPs are credited.
  • There were some other “gotchas” that got me, however I cannot think of them off of the top.
  • Infusionsoft stores CC records even after you delete their associated contact records.  This took a little while to figure out. I had written this function and could not understand why my contacts were not processing correctly.  Finally figured it out when I went to look for contact ID = 45 and the lowest ID I have in the app now is 3475



15 July, nearly two months with nary a word.

That is not to say that I have been just sitting on my duff, in fact I have not. It is really due to the fact that after I am done with work I simply don’t have much in the way of chops to bring home and hack around in things.

Tonight, though I have done a little. I actually am trying to rework some things that I had done a while ago, namely getting some basic functionality duplicated using the Infusionsoft API.  The first thing that I did was download the sample code from GitHub. After I downloaded the zip file I extracted the contents and uploaded the API-Sample-Code-master/PHP folder to my webserver. After doing that, for some reason or another, the folder that I originally uploaded it to would not serve online, even after checking permissions and creating various files to browse to. I ended up creating a folder in the portfolio section of my site and moved everything there, and it seems to be serving.

After ensuring that everything was web visible, i went through the three php scripts, ContactService-Sample.php, DataService-Sample.php, and InvoiceService-Sample.php and update the link to the application from TO my application name. While I was in each application I took the time to copy and paste my API key as well.

As I looked at what the sample scripts did and the html webform I realized that the webform is currently only set up to work with the ContactService-Sample.php file. I updated its name to reflect that.

I then navigated to the form, filled it out, and submitted it. A new contact was created and it had tags applied to it, however I did not have appropriately numbered campaigns.  follow up actions.

After messing with this I actually forked the branch and am going to make some documentation changes and then submit a pull request.



21 May What I Have Been Up To

Today I finally started to get a handle on Phyllis’ laptop. She left it with me over a week ago due to “some” malware she had picked up and I have been too drugged up to touch it until today. It really blows my mind how people get so much crapware on their computer, but it happens. I have spent the better part of 10 hours cleaning it up, removing toolbars, browser hijackers, and other suspicious software.

Continue reading

Installing Sublime Text 2 on a minimal Arch Linux

I recently completed a relatively minimal install of Arch Linux on a netbook that was gifted to me. There are several things that I intend to use the portability of the netbook for and one of them is the occasional editing of code while I am on the go. To that end I really wanted to get Sublime Text installed on it, but I really found little instruction available online to help. This is a short record of what I have done, to the best of my recollection.

I have i3 installed, which means that I also have X installed. (while not listed as a dependency, i am pretty sure that it is). I then found Sublime Text in the AUR and used pacman to ensure that I had its listed dependencies installed.

After the dependencies were taken care of I then downloaded and extracted this archive.  At this point in time I could cd into the directory and run the executable, however sublime text was not available from the command line nor dmenu. After doing some googling around I was able to find this helpful article which walked me through the rest of the process that I needed.

After unzipping the folder I then renamed the folder to just “sublime” and moved it to /opt/ . Once it was moved I transferred ownership to root and gave global run permissions. Upon completing that I created a file in /usr/bin/ (where is not as important as the fact that it be on the PATH) and included the following text in it:

export SUBLIME_HOME="/opt/sublime" 
$SUBLIME_HOME/sublime_text "$*" 

I ensured that others could run but not edit the file, and viola!, sublime_text was available in dmenu as well as the command line!.