Skip to main content
Posts by:

Tim Booher

How do you deploy an application.yml based config to heroku

In one of my applications, I have the following config files that are excluded from git:

* config/mongoid.yml
* config/application.yml
* config/mailserver_setting.rb
* config/omniauth_settings.rb

For deploying to a regular server, I just add tasks to my capistrano deployment file to create sym-links to a shared directory. In this case I have to modify my application to use local ENV files and consequently the ENV hash in my rails app.

In my configuration.rb (boots at initialization):

config_file =  File.expand_path('../../config/application.yml', __FILE__)
if File.exist?(config_file)
  APPLICATION_CONFIG=YAML.load_file(config_file)[Rails.env]['application']
  CONSTANTS=YAML.load_file(config_file)[Rails.env]['constants']
  APPLICATION_CONFIG.each{|k,v| ENV["APPLICATION_CONFIG_#{k}"] = v.to_s }
  CONSTANTS.each{|k,v| ENV["CONSTANTS_#{k}"] = v.to_s}
end

So using the following custom thor task, I can load heroku’s env files based on some code from Les Hill:

This works well.

By 0 Comments

Attic

If you walk up our attic steps, you will be surrounded by this:

The problem is that it takes forever to find and store things, so we don’t store them there or we buy duplicates of things we already have. I am often prevented from getting things done because I want them done perfectly. However, this problem is sufficiently annoying and I have sufficiently small time that I am ready to fix this without custom carpentry and custom angled storage bins on castors and wheels to provide easy access to everything — on top of a full database of our home inventory. Ah, someday.

So our attic and our stuff in general is not serving us. Yes, we need to get rid of the stuff we don’t need, made easy(ier) by the fact that our kid production line is closed. If we put something up there then it is not down here because we need it seasonally (think Christmas tree) or occasional (think my mitre saw). Given the nature of what will be up there, our effort is guided by the following principles (by priority):

  • Cheap and Easy (we want absolute minimal time and energy spent on this, roughly three diaper change intervals is all we can spare — yes, that has a huge standard dev)
  • Speed, Easy access to everything (so we don’t have to move more than one box to see what we are looking for)
  • Transparency, we can get to what we need easily (so we will have a map of where things go)
  • Center Isle Clear, no items in the “hallway” (that is our downfall now, items in the central area block us from finding things)
  • Flexibility (when we get in hurry, we have to put things up quickly, so we don’t want to over-optimize)
  • Minimalism (Let’s not put it up there if we don’t have 90{aaa01f1184b23bc5204459599a780c2efd1a71f819cd2b338cab4b7a2f8e97d4} chance of using it in a year, can’t buy it, or have a long term vision for it)

Regarding the last principal, we’ve developed a proviso for sentimental stuff. We have one bin for each of us and call it our sentimental warehouse, everything else has to have a non-sentimental purpose. With these principles understood, we have every incentive to put stuff up there because we have a smaller house for 6 folks (200 ft^2 per person) so we have to use our space wisely. We have a small garage that serves as a mud, play and sports room, so I put as much of our tools, paint, etc up in the attic and this has to be easy to access. We also believe in a bare bones accesible toy inventory, so we rotate toys up there frequently, aside from the fact that one kid is always graduating to a new set of toys.

Despite the fact that I have to get my taxes done this weekend (slacker! or is it workaholic?), the colder weather reminded me the small window of attic access is coming. Plus, we need to move things around up there for some upcoming electrical work. So I took some measurements, and played around in Sketchup and found that the key issue was how to make the sides useful and easily accessible. For example, the entire floor width was approximately 29 feet, but only 18 feet had a usable floor, meaning that I was ignoring roughly 40{aaa01f1184b23bc5204459599a780c2efd1a71f819cd2b338cab4b7a2f8e97d4} of the total floor space. This 40{aaa01f1184b23bc5204459599a780c2efd1a71f819cd2b338cab4b7a2f8e97d4} was the most important to use for storage since it is out of the center aisle. If I just incorporate this area, I calculated that I would gain roughly 25 ft^2 of surface area, multipled by the linear feet available which is 80 feet — meaning we would have 75 cubic yards, exactly half of a semi truck’s transportation volume — that is a lot of space, if I could only harness it inline with our principles.

With two hours, I did some SketchUp, looked around online at some ideas, my results are below. Now, back to taxes. Can I be greedy, and hope wiser friends can give me some feedback on this plan?

All feedback is welcome, but here are the things I want to do, but can’t:

  • Full inventory of everything up there, location tag everything and put on our intranet
  • Custom drawers and storage containers
  • Analysis on how supported my shelving needs to be (I have a degree in structures, I would love to use it someday.)
  • Optimization of where things are placed

Particular things I don’t know:
* Where to get storage containers as cost efficient as possible
* Attic ventilation constraints (building science considerations)
* Whether it makes sense to use the 10 inches in the joists. I don’t think so, because of the height of any box will prevent using that area.
* Any systems that are inexpensive, but will save me lots of time
* If installing lighting back there makes sense

Links
* “rubbermaid”:http://www.rubbermaid.com/Category/Pages/ProductDetail.aspx?CatName=Storage&SubcatId=CleverStore&Prod_ID=RP091401
* “wheeled idea”:http://www.curbly.com/lgsal/posts/1562-how-to-safely-store-things-in-the-attic
* “what i really want to do”:http://img2.timeinc.net/toh/i/g/09/interiors/06-before-after/06-attic.jpg
* “good idea”:http://www.betterimprovement.com/wp-content/uploads/2007/11/the-infinite-attic-storage-system.jpg

h3. Conclusion

and eventually:

I couldn’t resist the cheap and easy method to buy ready-made shelves and just put them up there. For roughly $200, I got everything off the floor. It was an excellent suggestion. Thanks Matt Markel for the shelving idea. Spirit, thank you for the organization idea. I’ve fully incorporated your ideas.

At some point in life, I have to choose simplicity over fun. That point arrives when four kids arrive.

By 0 Comments

Mongoid counter_cache with has_and_belongs_to_many

If I have two Mongoid models joined by a has_and_belongs_to_many relationship, Users and Groups. I need to quickly and efficiently sort by the most popular groups which really should be done with a counter_cache. However, counter_caches are implemented in rails by setting a callback to update the counter cache every time a child model is created/destroyed. But, Mongoid does not present callbacks for HABTM, and there are no real records that are getting created anyway. Additionally, you can add a whole collection of associations at once which would not be compatible with the efficient Mongoid inc operator. There is a mongoid_counter_cache gem that I played with for awhile, but for these reasons, I couldn’t get it to work with my existing schema, so I had to roll my own solution to this.

To complicate things, a user can follow a group or join a group. Following a group just keeps them informed on what the group is doing, joining allows them to participate. To make all this work, I have the following associations defined:

bc.
include Mongoid::Document
field :name, :type => String
field :type, :type => Symbol, :default => :custom
field :description, :type => String
index :name
index :type
field :follower_count
field :member_count

belongs_to :owner, :class_name => “User”, :inverse_of => :custom_groups

has_and_belongs_to_many :members, :class_name => “User”, :inverse_of => :joined_groups
has_and_belongs_to_many :followers, :class_name => “User”, :inverse_of => :followed_groups

And for the user:

bc.
has_and_belongs_to_many :joined_groups, :class_name => “PolcoGroup”, :inverse_of => :members
has_and_belongs_to_many :followed_groups, :class_name => “PolcoGroup”, :inverse_of => :followers

I’m sticking with the _count naming convention in case, I get some performance boost when calling parent.children.size which will read the cached value instead of actually querying the database. The column type is integer and we also pass a :default => 0.

Since I can’t use Mongoid’s atomic update here, I’m going to go through the database and update the relevant field with the current count.

bq.
after_save :update_categories_counter_cache
def update_categories_counter_cache
self.categories.each { |c| c.update_count(self) } unless self.categories.empty?
end

What does all this mean? We are adding an after_save callback method called update_categories_counter_cache. This metod is triggered after the record is saved, and it loops through all categories (if self.categories array is not empty, that is) and calls update_count method for each of them. The update_count is defined in Category model file (well, not yet, but you will define it now). The reason for the loop is that you might have multiple assignments on one save, so we make sure all categories that the post belongs to are updated.

Let’s define the update_count method for the Category model. Open category.rb and add the follwing:

def update_count
update_attribute(:posts_count, self.posts.length)
end

By 0 Comments

Official Modes of Travel for the US Department of Defense

This one should be simple, but it is not. I just wanted to know what to put on an Air Force form 938 for “MODE OF TRAVEL”. This wasn’t easy.

In the JFTR, https://www.defensetravel.dod.mil/Docs/Training/DTA_App_C.pdf

Appendix K,
Table K-3 associates each travel mode with its description, expense category,
and single threshold.

TRAVEL MODES AND OTHER TRANSPORTATION TYPES

OTHER TRANSPORTATION TYPE MODE DESCRIPTION EXPENSE CATE SINGLE THRESH
Comm Bus CB Bus Fare COM. CARR.-I 500
CTO Fee (Central Bill) CF-C CTO FEE (GOVCC-C) COM. CARR.-C 150
CTO Fee (Indiv Bill) CF CTO FEE (GOVCC-I) COM. CARR.-I 150
Comm Air (Indiv Bill) CP Air Fare (GOVCC-I) COM. CARR.-I 1500
Comm Air (Central Bill) CP-C Air Fare (GOVCC-C) COM. CARR.-C 1500
Comm Rail (Indiv Bill) CR Train Fare (GOVCC-I) COM. CARR.-I 300
Comm Rail (Central Bill) CR-C Train Fare (GOVCC-C) COM. CARR.-C 300
CV Ship Fare COM. CARR.-C 300
DGV POC Use-Gov Vehicle Available MILEAGE 0
GA Government Auto TRANSPORT 0
GB Government Bus TRANSPORT 0
GP Government Plane COM. CARR.-G 0
GV Government Vessel TRANSPORT 0
GVA POC Use-Dedi-cated Gov Vehicle MILEAGE 0
PA Pvt Auto-TDY/TAD MILEAGE 500
PAL Pvt Auto-Local MILEAGE 200
PAS Passenger (No Claim) TRANSPORT 0
PAT Pvt Auto-Terminal MILEAGE 50
PM Private Motorcycle MILEAGE 500
PP Private Plane MILEAGE 500
PV Private Vessel TRANSPORT 500
TB Prepaid Bus COM. CARR.-T 0
TP Prepaid Plane COM. CARR.-T 0
TR Prepaid Rail COM. CARR.-T 0
TV Prepaid Vessel COM. CARR.-T 0
CA Commercial Auto RENTAL CAR 500
By 0 Comments

Active and Reserve Mix for USAF Space Command

10:24 AM

google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});
google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});
function drawVisualization() {
var data = new google.visualization.DataTable();
data.addRows(51);
data.addColumn(‘string’, ‘State’);
data.addColumn(‘number’, ‘Military’);
data.setValue(0,0,’US-AK’);
data.setValue(0,1,108);
data.setValue(1,0,’US-AL’);
data.setValue(1,1,172);
data.setValue(2,0,’US-CA’);
data.setValue(2,1,639);
data.setValue(3,0,’US-CO’);
data.setValue(3,1,384);
data.setValue(4,0,’US-DE’);
data.setValue(4,1,66);
data.setValue(5,0,’US-FL’);
data.setValue(5,1,322);
data.setValue(6,0,’US-GA’);
data.setValue(6,1,441);
data.setValue(7,0,’US-HI’);
data.setValue(7,1,434);
data.setValue(8,0,’US-ID’);
data.setValue(8,1,48);
data.setValue(9,0,’US-IL’);
data.setValue(9,1,248);
data.setValue(10,0,’US-KS’);
data.setValue(10,1,218);
data.setValue(11,0,’US-LA’);
data.setValue(11,1,243);
data.setValue(12,0,’US-MA’);
data.setValue(12,1,306);
data.setValue(13,0,’US-MD’);
data.setValue(13,1,59);
data.setValue(14,0,’US-ME’);
data.setValue(14,1,242);
data.setValue(15,0,’US-MN’);
data.setValue(15,1,118);
data.setValue(16,0,’US-MO’);
data.setValue(16,1,123);
data.setValue(17,0,’US-NC’);
data.setValue(17,1,206);
data.setValue(18,0,’US-NY’);
data.setValue(18,1,199);
data.setValue(19,0,’US-OH’);
data.setValue(19,1,295);
data.setValue(20,0,’US-OK’);
data.setValue(20,1,240);
data.setValue(21,0,’US-PA’);
data.setValue(21,1,374);
data.setValue(22,0,’US-RI’);
data.setValue(22,1,310);
data.setValue(23,0,’US-TN’);
data.setValue(23,1,437);
data.setValue(24,0,’US-TX’);
data.setValue(24,1,348);
data.setValue(25,0,’US-UT’);
data.setValue(25,1,119);
data.setValue(26,0,’US-VT’);
data.setValue(26,1,35);
data.setValue(27,0,’US-WA’);
data.setValue(27,1,645);
data.setValue(28,0,’US-WY’);
data.setValue(28,1,170);
var options = {};
options[‘width’] = 800;
options[‘height’] = 500;
options[‘showLegend’] = false;
options[‘region’] = ‘US’;
options[‘dataMode’] = ‘regions’;
var geomap = new google.visualization.GeoMap(
document.getElementById(‘guard_visualization’));
geomap.draw(data, options);
}
google.setOnLoadCallback(drawVisualization);
google.setOnLoadCallback(drawVisualization);

Guard Only

google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});
google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});
function drawVisualization() {
var data = new google.visualization.DataTable();
data.addRows(51);
data.addColumn(‘string’, ‘State’);
data.addColumn(‘number’, ‘Military’);
data.setValue(0,0,’US-CA’);
data.setValue(0,1,404);
data.setValue(1,0,’US-CO’);
data.setValue(1,1,1109);
data.setValue(2,0,’US-FL’);
data.setValue(2,1,99);
data.setValue(3,0,’US-GA’);
data.setValue(3,1,112);
data.setValue(4,0,’US-IL’);
data.setValue(4,1,2);
data.setValue(5,0,’US-MA’);
data.setValue(5,1,4);
data.setValue(6,0,’US-MD’);
data.setValue(6,1,1);
data.setValue(7,0,’US-NE’);
data.setValue(7,1,37);
data.setValue(8,0,’US-NH’);
data.setValue(8,1,1);
data.setValue(9,0,’US-NJ’);
data.setValue(9,1,103);
data.setValue(10,0,’US-NM’);
data.setValue(10,1,17);
data.setValue(11,0,’US-OK’);
data.setValue(11,1,92);
data.setValue(12,0,’US-TX’);
data.setValue(12,1,78);
data.setValue(13,0,’US-VA’);
data.setValue(13,1,78);
var options = {};
options[‘width’] = 800;
options[‘height’] = 500;
options[‘showLegend’] = false;
options[‘region’] = ‘US’;
options[‘dataMode’] = ‘regions’;
var geomap = new google.visualization.GeoMap(
document.getElementById(‘reserve_visualization’));
geomap.draw(data, options);
}
google.setOnLoadCallback(drawVisualization);
google.setOnLoadCallback(drawVisualization);

Reserve Only

google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});
google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});
function drawVisualization() {
var data = new google.visualization.DataTable();
data.addRows(51);
data.addColumn(‘string’, ‘State’);
data.addColumn(‘number’, ‘Military’);
data.setValue(0,0,’US-AK’);
data.setValue(0,1,242);
data.setValue(1,0,’US-AL’);
data.setValue(1,1,436);
data.setValue(2,0,’US-AZ’);
data.setValue(2,1,1);
data.setValue(3,0,’US-CA’);
data.setValue(3,1,7545);
data.setValue(4,0,’US-CO’);
data.setValue(4,1,10077);
data.setValue(5,0,’US-DC’);
data.setValue(5,1,84);
data.setValue(6,0,’US-DE’);
data.setValue(6,1,1);
data.setValue(7,0,’US-FL’);
data.setValue(7,1,3988);
data.setValue(8,0,’US-GA’);
data.setValue(8,1,760);
data.setValue(9,0,’US-HI’);
data.setValue(9,1,345);
data.setValue(10,0,’US-IL’);
data.setValue(10,1,883);
data.setValue(11,0,’US-MA’);
data.setValue(11,1,103);
data.setValue(12,0,’US-MD’);
data.setValue(12,1,128);
data.setValue(13,0,’US-MS’);
data.setValue(13,1,177);
data.setValue(14,0,’US-MT’);
data.setValue(14,1,14);
data.setValue(15,0,’US-NC’);
data.setValue(15,1,9);
data.setValue(16,0,’US-ND’);
data.setValue(16,1,118);
data.setValue(17,0,’US-NE’);
data.setValue(17,1,5);
data.setValue(18,0,’US-NH’);
data.setValue(18,1,129);
data.setValue(19,0,’US-NM’);
data.setValue(19,1,351);
data.setValue(20,0,’US-NV’);
data.setValue(20,1,17);
data.setValue(21,0,’US-NY’);
data.setValue(21,1,1);
data.setValue(22,0,’US-OH’);
data.setValue(22,1,114);
data.setValue(23,0,’US-OK’);
data.setValue(23,1,1086);
data.setValue(24,0,’US-TX’);
data.setValue(24,1,1724);
data.setValue(25,0,’US-UK’);
data.setValue(25,1,34);
data.setValue(26,0,’US-UT’);
data.setValue(26,1,16);
data.setValue(27,0,’US-VA’);
data.setValue(27,1,1405);
var options = {};
options[‘width’] = 800;
options[‘height’] = 500;
options[‘showLegend’] = false;
options[‘region’] = ‘US’;
options[‘dataMode’] = ‘regions’;
var geomap = new google.visualization.GeoMap(
document.getElementById(‘active_visualization’));
geomap.draw(data, options);
}
google.setOnLoadCallback(drawVisualization);
google.setOnLoadCallback(drawVisualization);

Active Only

By 0 Comments

ARC and Active Basing

This is just an attempt to understand where bases are and by which component.

Total Locations

google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});

function drawVisualization() {
var data = new google.visualization.DataTable();
data.addRows(120);
data.addColumn(‘string’, ‘City’);
data.addColumn(‘number’, ‘Auths’);
data.setValue(0,0,’ABSTON, AL’);
data.setValue(0,1,50);
data.setValue(1,0,’ALCOA, TN’);
data.setValue(1,1,276);
data.setValue(2,0,’ANDREWS, MD’);
data.setValue(2,1,18);
data.setValue(3,0,’AURORA, CO’);
data.setValue(3,1,3);
data.setValue(4,0,’BARKING SANDS, HI’);
data.setValue(4,1,138);
data.setValue(5,0,’BEALE, CA’);
data.setValue(5,1,82);
data.setValue(6,0,’BOISE AIR TERMINAL, ID’);
data.setValue(6,1,48);
data.setValue(7,0,’BOLLING, DC’);
data.setValue(7,1,14);
data.setValue(8,0,’BOULDER, CO’);
data.setValue(8,1,33);
data.setValue(9,0,’BROOKS CITY BASE, TX’);
data.setValue(9,1,41);
data.setValue(10,0,’BRUNSWICK, GA’);
data.setValue(10,1,202);
data.setValue(11,0,’BUCKLEY, CO’);
data.setValue(11,1,1740);
data.setValue(12,0,’CAMP H M SMITH, HI’);
data.setValue(12,1,2);
data.setValue(13,0,’CAMP PARKS COMM A, CA’);
data.setValue(13,1,6);
data.setValue(14,0,’CAPE CANAVERAL, FL’);
data.setValue(14,1,1608);
data.setValue(15,0,’CAPE COD, MA’);
data.setValue(15,1,106);
data.setValue(16,0,’Capital Airport Air Guard Station, IL’);
data.setValue(16,1,121);
data.setValue(17,0,’CAVALIER, ND’);
data.setValue(17,1,118);
data.setValue(18,0,’CHANTILLY, VA’);
data.setValue(18,1,1025);
data.setValue(19,0,’CHEYENNE MTN, CO’);
data.setValue(19,1,573);
data.setValue(20,0,’CLEAR, AK’);
data.setValue(20,1,350);
data.setValue(21,0,’COLORADO SPRINGS, CO’);
data.setValue(21,1,154);
data.setValue(22,0,’COVENTRY, RI’);
data.setValue(22,1,55);
data.setValue(23,0,’CP MURRAY, WA’);
data.setValue(23,1,46);
data.setValue(24,0,’CRYSTAL CITY, VA’);
data.setValue(24,1,41);
data.setValue(25,0,’DAHLGREN, VA’);
data.setValue(25,1,50);
data.setValue(26,0,’DALLAS, TX’);
data.setValue(26,1,1);
data.setValue(27,0,’DAVIS MONTHAN, AZ’);
data.setValue(27,1,1);
data.setValue(28,0,’DECATUR, AL’);
data.setValue(28,1,2);
data.setValue(29,0,’DENVER, CO’);
data.setValue(29,1,114);
data.setValue(30,0,’DOBBINS, GA’);
data.setValue(30,1,118);
data.setValue(31,0,’DOVER, DE’);
data.setValue(31,1,1);
data.setValue(32,0,’EGLIN C6, FL’);
data.setValue(32,1,196);
data.setValue(33,0,’ELLINGTON, TX’);
data.setValue(33,1,121);
data.setValue(34,0,’F E WARREN, WY’);
data.setValue(34,1,170);
data.setValue(35,0,’FORT BRAGG, NC’);
data.setValue(35,1,9);
data.setValue(36,0,’FOUR LAKES, WA’);
data.setValue(36,1,124);
data.setValue(37,0,’FT GEORGE MEADE, MD’);
data.setValue(37,1,161);
data.setValue(38,0,’FT GORDON, GA’);
data.setValue(38,1,16);
data.setValue(39,0,’FT INDIANTOWN GAP, PA’);
data.setValue(39,1,254);
data.setValue(40,0,’GARLAND, TX’);
data.setValue(40,1,171);
data.setValue(41,0,’GENERAL DOWNING P, IL’);
data.setValue(41,1,127);
data.setValue(42,0,’GREELEY, CO’);
data.setValue(42,1,384);
data.setValue(43,0,’GREENBELT, MD’);
data.setValue(43,1,4);
data.setValue(44,0,’GRIFFISS, NY’);
data.setValue(44,1,80);
data.setValue(45,0,’GUNTER, AL’);
data.setValue(45,1,433);
data.setValue(46,0,’HAMMOND, LA’);
data.setValue(46,1,123);
data.setValue(47,0,’HANSCOM, MA’);
data.setValue(47,1,1);
data.setValue(48,0,’HILL, UT’);
data.setValue(48,1,16);
data.setValue(49,0,’HILO INTL, HI’);
data.setValue(49,1,123);
data.setValue(50,0,’HOLLOMAN, NM’);
data.setValue(50,1,94);
data.setValue(51,0,’HUNTSVILLE, AL’);
data.setValue(51,1,1);
data.setValue(52,0,’HURLBURT FIELD, FL’);
data.setValue(52,1,69);
data.setValue(53,0,’JACK BROOKS RGNL, TX’);
data.setValue(53,1,56);
data.setValue(54,0,’JB LANGLEY EUSTIS, VA’);
data.setValue(54,1,359);
data.setValue(55,0,’JB PRL HBR HICKAM, HI’);
data.setValue(55,1,312);
data.setValue(56,0,’Johnson Space Center, TX’);
data.setValue(56,1,45);
data.setValue(57,0,’KAENA POINT, HI’);
data.setValue(57,1,57);
data.setValue(58,0,’KAHULUI, HI’);
data.setValue(58,1,123);
data.setValue(59,0,’KEESLER, MS’);
data.setValue(59,1,177);
data.setValue(60,0,’KIRTLAND, NM’);
data.setValue(60,1,190);
data.setValue(61,0,’LACKLAND KELLY, TX’);
data.setValue(61,1,8);
data.setValue(62,0,’LACKLAND, TX’);
data.setValue(62,1,1639);
data.setValue(63,0,’Lambert-St Louis International-Stl, Saint Louis, St. Louis, MO’);
data.setValue(63,1,123);
data.setValue(64,0,’LOS ANGELES, CA’);
data.setValue(64,1,3249);
data.setValue(65,0,’LOVELL FIELD, TN’);
data.setValue(65,1,126);
data.setValue(66,0,’MACDILL, FL’);
data.setValue(66,1,209);
data.setValue(67,0,’MALMSTROM, MT’);
data.setValue(67,1,14);
data.setValue(68,0,’MAUI ISLAND, HI’);
data.setValue(68,1,17);
data.setValue(69,0,’MCCHORD, WA’);
data.setValue(69,1,113);
data.setValue(70,0,’MCCONNELL, KS’);
data.setValue(70,1,218);
data.setValue(71,0,’MCGUIRE, NJ’);
data.setValue(71,1,103);
data.setValue(72,0,’MILFORD, MA’);
data.setValue(72,1,123);
data.setValue(73,0,’MSP’);
data.setValue(73,1,118);
data.setValue(74,0,’MONTGOMERY, AL’);
data.setValue(74,1,122);
data.setValue(75,0,’NELLIS, NV’);
data.setValue(75,1,17);
data.setValue(76,0,’NEW BOSTON, NH’);
data.setValue(76,1,130);
data.setValue(77,0,’NEW CASTLE, DE’);
data.setValue(77,1,66);
data.setValue(78,0,’NEW ORLEANS NAS, LA’);
data.setValue(78,1,120);
data.setValue(79,0,’North Highlands Air National Guard Station, Sacramento, CA’);
data.setValue(79,1,178);
data.setValue(80,0,’N. Smithfield, RI 02896′);
data.setValue(80,1,255);
data.setValue(81,0,’NORTHFIELD, VT’);
data.setValue(81,1,35);
data.setValue(82,0,’OFFUTT, NE’);
data.setValue(82,1,42);
data.setValue(83,0,’ONIZUKA, CA’);
data.setValue(83,1,274);
data.setValue(84,0,’OTIS, MA’);
data.setValue(84,1,183);
data.setValue(85,0,’PAINE, WA’);
data.setValue(85,1,122);
data.setValue(86,0,’PATRICK, FL’);
data.setValue(86,1,2327);
data.setValue(87,0,’PENTAGON, VA’);
data.setValue(87,1,7);
data.setValue(88,0,’PETERSON, CO’);
data.setValue(88,1,5407);
data.setValue(89,0,’RANDOLPH, TX’);
data.setValue(89,1,68);
data.setValue(90,0,’ROBINS, GA’);
data.setValue(90,1,977);
data.setValue(91,0,’ROCHESTER, NY’);
data.setValue(91,1,1);
data.setValue(92,0,’ROSSLYN, VA’);
data.setValue(92,1,1);
data.setValue(93,0,’SALT LAKE CITY, UT’);
data.setValue(93,1,119);
data.setValue(94,0,’SAN BERNARDINO, CA’);
data.setValue(94,1,38);
data.setValue(95,0,’SAN DIEGO, CA’);
data.setValue(95,1,126);
data.setValue(96,0,’Schriever AFB, El Paso, Colorado’);
data.setValue(96,1,3162);
data.setValue(97,0,’SCOTT, IL’);
data.setValue(97,1,885);
data.setValue(98,0,’SEATTLE, WA’);
data.setValue(98,1,120);
data.setValue(99,0,’SEPULVEDA, CA’);
data.setValue(99,1,123);
data.setValue(100,0,’SO PORTLAND, ME’);
data.setValue(100,1,242);
data.setValue(101,0,’SPOKANE ANG, WA’);
data.setValue(101,1,120);
data.setValue(102,0,’SPRINGFIELD, OH’);
data.setValue(102,1,175);
data.setValue(103,0,’STALLION, NM’);
data.setValue(103,1,17);
data.setValue(104,0,’STANLY COUNTY, NC’);
data.setValue(104,1,206);
data.setValue(105,0,’STEWART, NY’);
data.setValue(105,1,119);
data.setValue(106,0,’SUITLAND, MD’);
data.setValue(106,1,5);
data.setValue(107,0,’SUNNYVALE, CA’);
data.setValue(107,1,10);
data.setValue(108,0,’TINKER, OK’);
data.setValue(108,1,1178);
data.setValue(109,0,’TRAVIS, CA’);
data.setValue(109,1,105);
data.setValue(110,0,’TULSA, OK’);
data.setValue(110,1,119);
data.setValue(111,0,’TYSON, TN’);
data.setValue(111,1,35);
data.setValue(112,0,’VANDENBERG, CA’);
data.setValue(112,1,4397);
data.setValue(113,0,’WASHINGTON, DC’);
data.setValue(113,1,70);
data.setValue(114,0,’WHEELER, HI’);
data.setValue(114,1,7);
data.setValue(115,0,’WHITE SAND Missile range, NM’);
data.setValue(115,1,67);
data.setValue(116,0,’WILL ROGERS WORLD, OK’);
data.setValue(116,1,121);
data.setValue(117,0,’WILLOW GROVE, PA’);
data.setValue(117,1,120);
data.setValue(118,0,’WRIGHT PATTERSON, OH’);
data.setValue(118,1,114);
data.setValue(119,0,’ZANESVILLE, OH’);
data.setValue(119,1,120);
var options = {};
options[‘region’] = ‘US’;
//options[‘width’] = 900;
//options[‘height’] = 600;
options[‘colors’] = [0xFF8747, 0xFFB581, 0xc06000]; //orange colors
options[‘dataMode’] = ‘markers’;

var geomap = new google.visualization.GeoMap(
document.getElementById(‘visualization’));
geomap.draw(data, options);
}

google.setOnLoadCallback(drawVisualization);

Guard Locations

google.load(‘visualization’, ‘1’, {‘packages’: [‘geomap’]});
google.setOnLoadCallback(drawMap);
function drawMap() {
var data = new google.visualization.DataTable();
data.addRows(56);
data.addColumn(‘string’, ‘City’);
data.addColumn(‘number’, ‘Auths’);
data.setValue(0,0,’ABSTON, AL’);
data.setValue(0,1,50);
data.setValue(1,0,’ALCOA, TN’);
data.setValue(1,1,276);
data.setValue(2,0,’BARKING SANDS, HI’);
data.setValue(2,1,138);
data.setValue(3,0,’BOISE AIR TERMINAL, ID’);
data.setValue(3,1,48);
data.setValue(4,0,’BRUNSWICK, GA’);
data.setValue(4,1,202);
data.setValue(5,0,’CAPE CANAVERAL, FL’);
data.setValue(5,1,122);
data.setValue(6,0,’Capital Airport Air Guard Station, IL’);
data.setValue(6,1,121);
data.setValue(7,0,’CLEAR, AK’);
data.setValue(7,1,108);
data.setValue(8,0,’COVENTRY, RI’);
data.setValue(8,1,55);
data.setValue(9,0,’CP MURRAY, WA’);
data.setValue(9,1,46);
data.setValue(10,0,’DOBBINS, GA’);
data.setValue(10,1,118);
data.setValue(11,0,’ELLINGTON, TX’);
data.setValue(11,1,121);
data.setValue(12,0,’F E WARREN, WY’);
data.setValue(12,1,170);
data.setValue(13,0,’FOUR LAKES, WA’);
data.setValue(13,1,124);
data.setValue(14,0,’FT GEORGE MEADE, MD’);
data.setValue(14,1,59);
data.setValue(15,0,’FT INDIANTOWN GAP, PA’);
data.setValue(15,1,254);
data.setValue(16,0,’GARLAND, TX’);
data.setValue(16,1,171);
data.setValue(17,0,’GENERAL DOWNING P, IL’);
data.setValue(17,1,127);
data.setValue(18,0,’GREELEY, CO’);
data.setValue(18,1,384);
data.setValue(19,0,’GRIFFISS, NY’);
data.setValue(19,1,80);
data.setValue(20,0,’HAMMOND, LA’);
data.setValue(20,1,123);
data.setValue(21,0,’HILO INTL, HI’);
data.setValue(21,1,123);
data.setValue(22,0,’JACK BROOKS RGNL, TX’);
data.setValue(22,1,56);
data.setValue(23,0,’JB PRL HBR HICKAM, HI’);
data.setValue(23,1,50);
data.setValue(24,0,’KAHULUI, HI’);
data.setValue(24,1,123);
data.setValue(25,0,’Lambert-St Louis International-Stl, Saint Louis, St. Louis, MO’);
data.setValue(25,1,123);
data.setValue(26,0,’LOVELL FIELD, TN’);
data.setValue(26,1,126);
data.setValue(27,0,’MACDILL, FL’);
data.setValue(27,1,200);
data.setValue(28,0,’MCCHORD, WA’);
data.setValue(28,1,113);
data.setValue(29,0,’MCCONNELL, KS’);
data.setValue(29,1,218);
data.setValue(30,0,’MILFORD, MA’);
data.setValue(30,1,123);
data.setValue(31,0,’MSP’);
data.setValue(31,1,118);
data.setValue(32,0,’MONTGOMERY, AL’);
data.setValue(32,1,122);
data.setValue(33,0,’NEW CASTLE, DE’);
data.setValue(33,1,66);
data.setValue(34,0,’NEW ORLEANS NAS, LA’);
data.setValue(34,1,120);
data.setValue(35,0,’North Highlands Air National Guard Station, Sacramento, CA’);
data.setValue(35,1,178);
data.setValue(36,0,’N. Smithfield, RI 02896′);
data.setValue(36,1,255);
data.setValue(37,0,’NORTHFIELD, VT’);
data.setValue(37,1,35);
data.setValue(38,0,’OTIS, MA’);
data.setValue(38,1,183);
data.setValue(39,0,’PAINE, WA’);
data.setValue(39,1,122);
data.setValue(40,0,’ROBINS, GA’);
data.setValue(40,1,121);
data.setValue(41,0,’SALT LAKE CITY, UT’);
data.setValue(41,1,119);
data.setValue(42,0,’SAN DIEGO, CA’);
data.setValue(42,1,126);
data.setValue(43,0,’SEATTLE, WA’);
data.setValue(43,1,120);
data.setValue(44,0,’SEPULVEDA, CA’);
data.setValue(44,1,123);
data.setValue(45,0,’SO PORTLAND, ME’);
data.setValue(45,1,242);
data.setValue(46,0,’SPOKANE ANG, WA’);
data.setValue(46,1,120);
data.setValue(47,0,’SPRINGFIELD, OH’);
data.setValue(47,1,175);
data.setValue(48,0,’STANLY COUNTY, NC’);
data.setValue(48,1,206);
data.setValue(49,0,’STEWART, NY’);
data.setValue(49,1,119);
data.setValue(50,0,’TULSA, OK’);
data.setValue(50,1,119);
data.setValue(51,0,’TYSON, TN’);
data.setValue(51,1,35);
data.setValue(52,0,’VANDENBERG, CA’);
data.setValue(52,1,212);
data.setValue(53,0,’WILL ROGERS WORLD, OK’);
data.setValue(53,1,121);
data.setValue(54,0,’WILLOW GROVE, PA’);
data.setValue(54,1,120);
data.setValue(55,0,’ZANESVILLE, OH’);
data.setValue(55,1,120);
var options = {};
options[‘region’] = ‘US’;
options[‘width’] = 1200;
options[‘height’] = 600;
options[‘colors’] = [0xFF8747, 0xFFB581, 0xc06000]; //orange colors
options[‘dataMode’] = ‘markers’;
var container = document.getElementById(‘markers_guard’);
var geomap = new google.visualization.GeoMap(container);
geomap.draw(data, options);
};

Reserve Locations

google.load(‘visualization’, ‘1’, {‘packages’: [‘geomap’]});
google.setOnLoadCallback(drawMap);
function drawMap() {
var data = new google.visualization.DataTable();
data.addRows(25);
data.addColumn(‘string’, ‘City’);
data.addColumn(‘number’, ‘Auths’);
data.setValue(0,0,’BOULDER, CO’);
data.setValue(0,1,4);
data.setValue(1,0,’BROOKS CITY BASE, TX’);
data.setValue(1,1,41);
data.setValue(2,0,’BUCKLEY, CO’);
data.setValue(2,1,230);
data.setValue(3,0,’CAPE CANAVERAL, FL’);
data.setValue(3,1,7);
data.setValue(4,0,’CAPE COD, MA’);
data.setValue(4,1,4);
data.setValue(5,0,’CHANTILLY, VA’);
data.setValue(5,1,43);
data.setValue(6,0,’CHEYENNE MTN, CO’);
data.setValue(6,1,1);
data.setValue(7,0,’COLORADO SPRINGS, CO’);
data.setValue(7,1,54);
data.setValue(8,0,’FT GEORGE MEADE, MD’);
data.setValue(8,1,1);
data.setValue(9,0,’JB LANGLEY EUSTIS, VA’);
data.setValue(9,1,35);
data.setValue(10,0,’Johnson Space Center, TX’);
data.setValue(10,1,2);
data.setValue(11,0,’KIRTLAND, NM’);
data.setValue(11,1,17);
data.setValue(12,0,’LACKLAND, TX’);
data.setValue(12,1,35);
data.setValue(13,0,’LOS ANGELES, CA’);
data.setValue(13,1,99);
data.setValue(14,0,’MCGUIRE, NJ’);
data.setValue(14,1,103);
data.setValue(15,0,’NEW BOSTON, NH’);
data.setValue(15,1,1);
data.setValue(16,0,’OFFUTT, NE’);
data.setValue(16,1,37);
data.setValue(17,0,’PATRICK, FL’);
data.setValue(17,1,92);
data.setValue(18,0,’PETERSON, CO’);
data.setValue(18,1,407);
data.setValue(19,0,’ROBINS, GA’);
data.setValue(19,1,112);
data.setValue(20,0,’Schriever AFB, El Paso, Colorado’);
data.setValue(20,1,413);
data.setValue(21,0,’SCOTT, IL’);
data.setValue(21,1,2);
data.setValue(22,0,’TINKER, OK’);
data.setValue(22,1,92);
data.setValue(23,0,’TRAVIS, CA’);
data.setValue(23,1,105);
data.setValue(24,0,’VANDENBERG, CA’);
data.setValue(24,1,200);
var options = {};
options[‘region’] = ‘US’;
options[‘width’] = 800;
options[‘height’] = 600;
options[‘colors’] = [0xFF8747, 0xFFB581, 0xc06000]; //orange colors
options[‘dataMode’] = ‘markers’;
var container = document.getElementById(‘markers_reserve’);
var geomap = new google.visualization.GeoMap(container);
geomap.draw(data, options);
};

By 0 Comments

All Air National Guard Forces

google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});

function drawVisualization() {

var data = new google.visualization.DataTable();
data.addRows(51);
data.addColumn(‘string’, ‘Country’);
data.addColumn(‘number’, ‘Guard Authorizations’);
data.setValue(0,0,’US-AK’);
data.setValue(0,1,723);
data.setValue(1,0,’US-AL’);
data.setValue(1,1,759);
data.setValue(2,0,’US-AR’);
data.setValue(2,1,658);
data.setValue(3,0,’US-AZ’);
data.setValue(3,1,762);
data.setValue(4,0,’US-CA’);
data.setValue(4,1,1627);
data.setValue(5,0,’US-CO’);
data.setValue(5,1,464);
data.setValue(6,0,’US-CT’);
data.setValue(6,1,442);
data.setValue(7,0,’US-DC’);
data.setValue(7,1,49);
data.setValue(8,0,’US-DE’);
data.setValue(8,1,374);
data.setValue(9,0,’US-FL’);
data.setValue(9,1,703);
data.setValue(10,0,’US-GA’);
data.setValue(10,1,937);
data.setValue(11,0,’US-HI’);
data.setValue(11,1,735);
data.setValue(12,0,’US-IA’);
data.setValue(12,1,670);
data.setValue(13,0,’US-ID’);
data.setValue(13,1,394);
data.setValue(14,0,’US-IL’);
data.setValue(14,1,1120);
data.setValue(15,0,’US-IN’);
data.setValue(15,1,635);
data.setValue(16,0,’US-KS’);
data.setValue(16,1,746);
data.setValue(17,0,’US-KY’);
data.setValue(17,1,435);
data.setValue(18,0,’US-LA’);
data.setValue(18,1,465);
data.setValue(19,0,’US-MA’);
data.setValue(19,1,792);
data.setValue(20,0,’US-MD’);
data.setValue(20,1,998);
data.setValue(21,0,’US-ME’);
data.setValue(21,1,409);
data.setValue(22,0,’US-MI’);
data.setValue(22,1,958);
data.setValue(23,0,’US-MN’);
data.setValue(23,1,703);
data.setValue(24,0,’US-MO’);
data.setValue(25,1,839);
data.setValue(25,0,’US-MS’);
data.setValue(25,1,935);
data.setValue(26,0,’US-MT’);
data.setValue(26,1,362);
data.setValue(27,0,’US-NC’);
data.setValue(27,1,459);
data.setValue(28,0,’US-ND’);
data.setValue(28,1,391);
data.setValue(29,0,’US-NE’);
data.setValue(29,1,382);
data.setValue(30,0,’US-NH’);
data.setValue(30,1,360);
data.setValue(31,0,’US-NJ’);
data.setValue(31,1,754);
data.setValue(32,0,’US-NM’);
data.setValue(32,1,372);
data.setValue(33,0,’US-NV’);
data.setValue(33,1,385);
data.setValue(34,0,’US-NY’);
data.setValue(34,1,1876);
data.setValue(35,0,’US-OH’);
data.setValue(35,1,1445);
data.setValue(36,0,’US-OK’);
data.setValue(36,1,718);
data.setValue(37,0,’US-OR’);
data.setValue(37,1,719);
data.setValue(38,0,’US-PA’);
data.setValue(38,1,1293);
data.setValue(39,0,’US-RI’);
data.setValue(39,1,400);
data.setValue(40,0,’US-SC’);
data.setValue(40,1,375);
data.setValue(41,0,’US-SD’);
data.setValue(41,1,323);
data.setValue(42,0,’US-TN’);
data.setValue(42,1,1085);
data.setValue(43,0,’US-TX’);
data.setValue(43,1,1139);
data.setValue(44,0,’US-UT’);
data.setValue(44,1,466);
data.setValue(45,0,’US-VA’);
data.setValue(45,1,579);
data.setValue(46,0,’US-VT’);
data.setValue(46,1,359);
data.setValue(47,0,’US-WA’);
data.setValue(47,1,787);
data.setValue(48,0,’US-WI’);
data.setValue(48,1,741);
data.setValue(49,0,’US-WV’);
data.setValue(49,1,661);
data.setValue(50,0,’US-WY’);
data.setValue(50,1,404);

var options = {};
options[‘region’] = ‘US’;
options[‘dataMode’] = ‘regions’;
options[‘width’] = 900;
options[‘height’] = 600;

var geomap = new google.visualization.GeoMap(
document.getElementById(‘visualization’));
geomap.draw(data, options);
}

google.setOnLoadCallback(drawVisualization);

 
By 0 Comments

Arc versus Active Duty

test

google.load(‘visualization’, ‘1’, {packages: [‘geomap’]});

function drawVisualization() {
var data = new google.visualization.DataTable();
data.addRows(51);
data.addColumn(‘string’, ‘State’);
data.addColumn(‘number’, ‘Military’);
data.setValue(0,0,’US-AK’);
data.setValue(0,1,108);
data.setValue(1,0,’US-AL’);
data.setValue(1,1,172);
data.setValue(2,0,’US-CA’);
data.setValue(2,1,639);
data.setValue(3,0,’US-CO’);
data.setValue(3,1,384);
data.setValue(4,0,’US-DE’);
data.setValue(4,1,66);
data.setValue(5,0,’US-FL’);
data.setValue(5,1,322);
data.setValue(6,0,’US-GA’);
data.setValue(6,1,441);
data.setValue(7,0,’US-HI’);
data.setValue(7,1,434);
data.setValue(8,0,’US-ID’);
data.setValue(8,1,48);
data.setValue(9,0,’US-IL’);
data.setValue(9,1,248);
data.setValue(10,0,’US-KS’);
data.setValue(10,1,218);
data.setValue(11,0,’US-LA’);
data.setValue(11,1,243);
data.setValue(12,0,’US-MA’);
data.setValue(12,1,306);
data.setValue(13,0,’US-MD’);
data.setValue(13,1,59);
data.setValue(14,0,’US-ME’);
data.setValue(14,1,242);
data.setValue(15,0,’US-MN’);
data.setValue(15,1,118);
data.setValue(16,0,’US-MO’);
data.setValue(16,1,123);
data.setValue(17,0,’US-NC’);
data.setValue(17,1,206);
data.setValue(18,0,’US-NY’);
data.setValue(18,1,199);
data.setValue(19,0,’US-OH’);
data.setValue(19,1,295);
data.setValue(20,0,’US-OK’);
data.setValue(20,1,240);
data.setValue(21,0,’US-PA’);
data.setValue(21,1,374);
data.setValue(22,0,’US-RI’);
data.setValue(22,1,310);
data.setValue(23,0,’US-TN’);
data.setValue(23,1,437);
data.setValue(24,0,’US-TX’);
data.setValue(24,1,348);
data.setValue(25,0,’US-UT’);
data.setValue(25,1,119);
data.setValue(26,0,’US-VT’);
data.setValue(26,1,35);
data.setValue(27,0,’US-WA’);
data.setValue(27,1,645);
data.setValue(28,0,’US-WY’);
data.setValue(28,1,170);

var options = {};
options[‘width’] = 800;
options[‘height’] = 500;
options[‘showLegend’] = false;
options[‘region’] = ‘US’;
options[‘dataMode’] = ‘regions’;

var geomap = new google.visualization.GeoMap(
document.getElementById(‘visualization’));
geomap.draw(data, options);
}

google.setOnLoadCallback(drawVisualization);
​

By 0 Comments

My start as an IMA in the Air Force

This article has become incredibly popular. It was written six years ago at the start of my reserve career. Since then, I’ve had an amazing fun, rewarding and high-impact career. First, I’ve had amazing bosses, Shawn Barnes and Tim Kelly, who are both amazing leaders but understood the difficulty of balancing my day job with a fast paced reserve commitment. They have become both good friends and mentors. Second, as I’ve come to know the system, the AF reserve community can be both supportive and helpful. In any case, don’t let the post below cloud your view of the program. I love the reserves and would recommend it to anyone who wants to keep making a difference while pursuing opportunities outside of active duty. Third, the reserves have given me opportunities that I wouldn’t have had otherwise. I’ve been able to more than double my impact on the DoD as a civilian and reserve member.

From what I hear the onboarding process is much more streamlined now. In 2014, the IMA program management transitioned to Headquarters Individual Reservist Readiness and Integration Organization (HQ RIO), a new organization focused on streamlining and optimizing the program. The HQ RIO staff acts as an advocate for the IMA program at higher headquarters and is focused on process improvements to enhance the IMA experience. Subordinate to HQ RIO there are seven detachments and their eight operating locations, which are directly responsible for facilitating and meeting the individual needs of the IMAs assigned to them. These folks are good people and work with you to avoid situations like the one I describe below.

If you’re thinking about becoming an IMA, go ahead and visit www.arpc.afrc.af.mil/home/hqrio.aspx. Also, let me know if I can help in any way: tim@theboohers.org.

I’ve had a rough start to my life as a reservist in the Air Force.

It was tough to find time to learn a new bureaucracy. Long and busy workdays in the Pentagon don’t leave free time to work this and as a reservist my first lesson is that you are on your own. Period. No one is looking out for you. To any potential reservist, you need to acknowledge this and repeat it to yourself. This was a shock for someone whose basic model was to work really hard, focus on my job–not myself, and watch good stuff happen. Unlike the active duty military where you are told what you have to do administratively and basically just have to hang on to whatever speed they put the treadmill on, reserve duty is like finding your way to the lost temple in the middle of a thick jungle. This article is meant to help some future IMA find their way a little more easily. Since we IMA’s have to learn a new bureaucracy, we should at least help each other out.

My history up to this point is that my Pentagon reserve recruiter was very nice and made the system sound wonderful. She took my resume and was going to line up an excellent job for me. I made it very clear I wanted to participate in the reserves as an IMA and sent her everything she requested. It seemed like there were folks to help make the transition easier and I rushed forward with the knowledge that this process was going in the right direction.

But months passed and I didn’t hear from her and my voice mails went unanswered. I wasn’t too worried since a friend from my current office had taken a program management job at the Air Force Research Lab and she told me she wanted to hire me to support her. Great. It was a perfect fit for my skill set, she just needed to get the position created and funded. I put together a resume and sent it her way.

After almost a year of waiting for that to happen, I started to get nervous. She kept hitting bureaucratic barriers to getting a position. (A position was always one meeting away.) However, at the last minute her husband, also an Air Force officer, needed help starting up a new program and he had a number of positions he could hire against. He approached me with a plan to hire me to help his program and he would “loan” me to his wife. He is a good friend with an exciting program and it sounded like a perfect solution.

We tried to make it happen, but despite stating that I wanted to work as a reservist at every opportunity during my outprocessing, my assignment orders said DISCHARGE, not “RELEASE FROM ACTIVE DUTY/TRANSFERS TO RESAF”. I didn’t know to check this box, which was my bad. But I was frustrated no-one asked and nothing I was given told me to check this. It would have been helpful to have been asked or, better, the reserve recruiter could have told me to ensure my orders released me to transfer to RESAF.

Regardless, this made things complicated as I got close to my one year point and I was told I was going to be discharged. It was incredibly confusing to figure out who I should talk to. The reserve recruiter had moved on and her replacement informed me that she couldn’t help me since she was an “in-service” recruiter and only could talk to active duty members. She got me in touch with the Officer Accession Recruiter for the Pentagon, who was at Andrews in Maryland.

I called her on June 25, 2010 (August 8, 2009 was my date of separation so I was getting nervous). She called me back three days later and told me I had been “scrolled” (a new term for me that I still can’t define) and she confirmed I was going to be dis-enrolled unless we did some crazy bureaucratic maneuvering. I couldn’t figure out what I was going to be dis-enrolled from, but she told me it meant that I would lose my commission and would have to re-apply. Since I work in the Pentagon, but live in Virginia, she told me she couldn’t help me and that I had to work with a officer accessions recruiter from Richmond, VA–over 100 miles away! I called and emailed him right away (on 6/28). After 3 or 4 more phone calls, 36 precious days later, I had only gotten one phone call on my voicemail from him.

In desperation, I called back to the physically closest recruiter at Andrews who agreed to be helpful (“this is outside my job . . .”) and get me back to S7 status (anyone know what that is?) so I could get the process moving. She told me I needed to take an oath of office immediately to get into the reserves (a form AF133). I quickly found a flag and had a friend swear me in and sent the form to the recruiter at Andrews.

The following email was sent to ARPC/DPAAA:

As per our brief conversation, Mrs xxx confirmed that Maj Booher has been previously scroll approved and still authorized to complete a reserve oath within in his 12 month window. She requested that AF133 be dated for 4 Aug 2010 and once received ARPC/DPAAA will be able to update him back to S7-IRR status. Please see the attached AF133 and update accordingly.

Also note that Maj Booher is now working with recruiting to obtain a AFR position and transfer out of IRR and into a CAT B billet so anything you can do to ensure he is updated back to S7 status as soon as possible would be greatly appreciated. His original AF133 has been placed in snail mail and will arrive to you shortly.

Thank you so much for the short notice assistance!!!

Then, to the Virginia reserve recruiter (AFRC/RS) on 3 August:

Maj Booher has completed his AF133 (Attached) and it has been forwarded to ARPC/DPAAA for update back to S7-IRR status. Maj Booher has been interviewed and tentatively offered a IMA position out at WPAFB and needs recruiter assistance to proceed with his application. Please contact Maj Booher at your earliest convenience he is ready to proceed with processing.

That day, I finally heard back from the reserve recruiter in Virgina at 7:19 pm:

I apologize for not contacting you sooner. No excuse on my part. Would you be able to talk tomorrow afternoon? Please name the time and I will make it happen. We can discuss the next step. Yes, I would like the contact information for the gaining unit. Thank you. Have a good evening.

O.K. I was ready to get to work and the gaining unit wanted me. I sent him the contact information for the gaining unit. Then started sending him a ton of forms. He needed:

  • DD 214
  • Last 3 OPR’s
  • Resume
  • copy of physical once it is accomplished.

Fortunately, I had scanned everything in and could get it to him quickly. The only complication was that I didn’t have an up to date physical. Since I wasn’t “in” the reserves, this was a really complicated bureaucratic catch-22. I couldn’t use a DoD medical facility, but I needed a DoD physical. I could get a recruiting physical (months away), but that didn’t work either since I had sworn an oath and was now a sweet S7-IRR. The Virginia recruiter told me to see if I could get a DoD doctor friend to give me a physical it would make the situation work out. I was able to beg/cajole my way into a doctor’s office and since I was still in the computer system, confuse enough admin people into processing the physical and administering a PHA. When I finally got to a doctor (someone who is allowed to think!), it was easy to lay out the situation and he gave me all the paperwork I needed, which I quickly sent to the Virginia recruiter.

After this, we sent maybe 20 emails back and forth, mostly me bugging him to get me “gained to file”. Finally, on 14 October, I got this email:

I found out that the reason that you were not gained on 1 Oct is due to 2 things. One, the folks in the assignments branch at ARPC are working at 50% manning right not and are about 30 days behind. Two, your file was turned into the wrong technician at ARPC. So, I confirmed with our liaison at ARPC that it is now turned into the correct technician. So, I will be checking every few days to see if they have projected you to your new assignment. I apologize for the delays, but it is not really in my hands at this point. All I can do is follow up. Please let me know if you have any other questions sir. I will be TDY all next week with limited phone and e-mail access. I hope that by the time I return you are all squared away.

OK, so I was getting close. I didn’t hear anything until 25 October until I got this email:

I just became aware that you are being reported in Air Force Fitness Management System (AFFMS) as being an IMA member for xxx. The report also show that you are due for a PFA and I can assist you in scheduling for this event. If this is an error please let me know.

Wow, so that is how you find out you have been gained to file. However, once I was gained to file life just started getting complicated. Neither supervisor knew the ropes and the administrative “support” started pelting me with emails demanding OPRs, feedbacks, PFA’s, orientations, etc. This was all couched in the language of the system I didn’t understand — all in a process I didn’t understand. For example, I didn’t know how to get an id card so I went to my local MPF and asked for one and they gave it to me with a “Maj” stamped on the front. That worked well, but it didn’t get any easier.

I started getting questions like this from my supervisor:

do you come with your own days or do you need mandays? I heard that all IMAs get about 30 days or more from a central pot to use thru year and that you only need mandays to go above that amount.

Answer: I don’t “need” mandays. I had an actual position so I just “need” individual training days (IDT’s) and my two week tour.

In this whole process, the only people with the corporate knowledge are existing IMA’s. Information comes in emails such as this one from a friend:

IDTs and the 2-week annual tour are centrally funded.

All mandays will need to come from [your supervisor]. Mandays also require a TDY fund cite. For locals, we get paid for driving one round trip for the entire tour (e.g. I’d get 20 miles for driving to work on day 1 and 20 miles for driving home on day 90). Locals get no per diem, but [I] would get per diem, hotel, travel, etc.

Below is what each IMA is required to do each year for the unit that owns his/her billet. Mandays can be done for any unit (apparently), whether or not they own the billet. IMAs may also do additional unpaid IDTs, but the unit that owns their billet must sign off.

Mandatory IMA participation:

IMA CategoryIDTsAT
A48 paid2 weeks
B24 paid2 weeks
E24 unpaid2 weeks

[My supervisor] may have the option to pay for [my] travel and hotel for the unpaid IDTs; I’m pretty sure it isn’t centrally funded. In general, the 24 IDTs will have to be done wherever [I could] do them for free. The 2-week tour includes travel and per diem from the central fund. [I] will be expected to do those at WPAFB.
Any mandays for any IMA are on top of the above requirements.
The 2-week tour and all mandays count as active duty time. IDTs do not.

O.K., that was helpful. But where do I do things like medical? Why was I getting emails saying I was late for my OPR, etc? Check out this one:

I am in the process of updating your records and changing your rater. However, you have a projected OPR C/O of 23 Mar 10 through Maj xxxx. Can you tell me the status of when this OPR will be closed? As soon as the 23 Mar OPR is closed out in MILPDS I will be able to update your information for your current IMA position.

followed by:

What is the status of your 23 Mar 10 OPR? This is overdue and is affecting directorate staff meeting charts. Would you please check into this and let me know when it might be completed? Please send me a copy of the OPR when complete.

What? I haven’t started yet? Then, I get:

I am reviewing the IMA Readiness Roster. . .You are showing Red across the board. I just wanted to find out the status of your dental, RCPHA, Fitness, Immunizations and OPR.

Then, I was asked to provide:

  • Duty Schedule (UTAPs – IDT/Annual/MPA)
  • Assignment Order
  • vRED
  • SGLI (SGLV 8286) – ARMS
  • vMPF Record Review RIP
  • Point Credit Summary
  • Form 40As / IMT 938s
  • Fitness Test Results
  • Family Care Determination Checklist

Status? Of what? What is an RCPHA? Sorry, but I didn’t know what SGLI form they wanted. Which page of the vMPF gave the record review? What was a Point Credit Summary? Form 40A, is that the same as an IMT 938? Where do I do my fitness test? I live in VA, but work at WPAFB, if I am overdue, do I need to fund my travel there to take a PT test? What travel gets funded? What is a Family Care determination checklist and where do I get this from? What is a vRED again? What the heck is UTAPs? You get the point.

All this is possible to find out, but I didn’t have the time to become a personnel expert. I could guess on all of this and send stuff over, but on what status should I be on as I train myself for all of this. I have to make phone calls, but I can’t do it from my day job. This might only be 5 hours of work, but it needed to be during the day.

The end result of all of this is that I ended up working 3 IDTs for my friend at AFRL, but my supervisor could never figure out how to give me credit for my IDTs (as of March 12th I still haven’t gotten credit). I never figured out where and how to get all the administrative stuff figured out. The difficulty of being shared, the logistical problems of an out of town initial assignment, and the administrative difficulties made the decision easier to take a local position which fit my skills well and had extensive experience integrating reservists. Wish me luck!

I’ll admit that I’m a an overworked Pentagon analyst who doesn’t have much time to master all of this during the day, but I hope I’ve had particularly bad luck getting everything started and my experience is out of the norm. Comments greatly appreciated.

By 31 Comments

Congressional District GIS Exploration

MathJax.Hub.Config({tex2jax: {inlineMath: [[‘$’,’$’], [‘(‘,’)’]]}});

I wanted to be able to do this with my ip address:

I do development and consulting in two areas I really love: fitness and political engagement. For some work I’m doing on the latter, I needed to figure out the latitude and longitude of the geographic center for each of the 437 US congressional districts in order to display the districts using the google maps API. “GovTrack”:http://www.govtrack.us/congress/findyourreps.xpd has done the hard work to get the data from the census to KML and as a WMS service so congressional districts can be displayed on Google maps, but there was no source online to get the geographic centers for these regions and google maps requires a zoom level and geographic center for the map.

The first question I had to face, was what a geographic centroid really is. Matlab has a “meanm”:http://www.mathworks.com/help/toolbox/map/ref/meanm.html function, which can find the center of a number of points on an arbitrary geodetic ellipsoid (e.g. WGS84), but I really felt the point should be inside the district. My first thought was to write a quick genetic algorithm that found the point that minimized the average distance to the exterior of the district, but it took forever to run and I was on ground that smelled as if smarter folks had trod here. This suspicion led me to look into some research done by the Royal Melbourne Institute of Technology which cataloged how to compute geographic centroids a number of different ways, the most relevant being the @moment@ @centroid@. This took a good bit of time to play with an implement, but I’ll refer the discussion to their paper. The end result was that *meanm* was good enough and the genetic algorithm was canned. (Email me if you want the code.)

From their paper:
The New Shorter Oxford English Dictionary (SOED 1993) defines the centroid as: “A point defined in relation to a given figure in a manner analogous to the centre of mass of a corresponding body.” Using this definition, and regarding the body as a plane area A of uniformly thin material, its centroid is
$$begin{matrix}
{bar y} = frac{M_y}{A} = frac{M_x}{A}
end{matrix}$$
are (first) moments with respect to the x- and y-axes respectively.
[The moment $M_L$ of a plane area with respect to a line L is the product of the area and the perpendicular distance of its centroid from the line.] The centroid computed using this method has a physical characteristic that is intuitively reassuring. That is, if we cut out a shape from uniformly thin material (say thin cardboard) and suspend it freely on a string connected to its centroid, the shape will lie horizontal in the earth’s gravity field.

I’m sharing a bit of my code, in the hope that some of the other folks in the OpenGovernment movement will find these datapoints useful. The first challenge was to find the (very poorly documented) “source data”:http://www.census.gov/geo/www/cob/cd110.html and get it into Matlab. The source code below is fairly straightforward: some data conditioning then find the geographic centers based on *meanm*. The moment centroid was interesting, but took too long to compute for my timeline, and the trival solution seems to be working well, the remaining challenge was to work with the data, something my day job has me practice a good bit.

One of the biggest challenges was to get the US census data into a standard two letter postal abbreviation format, the first part of my primary key (XXYY), where XX is the state and YY is the district number. The census had an arbitrary number assigned to each state without any documentation that I could find, so I had to resort to using regular expressions with ruby on the file names to pull out the data which would create a nice Matlab cell array, so I could then get a good ruby hash of the centroids from the Matlab script. Those two codes follow for any other data conditioners out there who might find them useful. I had to two challenges that required fancy regular expressions: to get the census number to US state, then to get the full state name to the two letter code.

And, in conclusion, I provide the geographic centers of all 437 congressional districts:

So this is really pretty boring, but now that I am working with this dataset, I hope to have some future posts on interesting GIS computations which combine demographics with members voting patterns. Please let me know if there are any questions or interesting ideas for exploration.

By 2 Comments