Igor Kromin |   Consultant. Coder. Blogger. Tinkerer. Gamer.

After upgrading to Google Cloud SDK version 184.0.0, I started to get this error whenever trying to access my app's URLs - "ImportError: No module named ipaddr".

The full log looked like this...
INFO 2018-01-15 06:55:09,031 devappserver2.py:105] Skipping SDK update check.
INFO 2018-01-15 06:55:09,073 api_server.py:308] Starting API server at: http://localhost:62928
INFO 2018-01-15 06:55:09,078 dispatcher.py:255] Starting module "default" running at: http://localhost:8080
INFO 2018-01-15 06:55:09,080 admin_server.py:146] Starting admin server at: http://localhost:8000
ERROR 2018-01-15 06:55:10,805 http_runtime.py:396] bad runtime process port ['']
Traceback (most recent call last):
File "/Applications/devtools/google-cloud-sdk/platform/google_appengine/_php_runtime.py", line 103, in <module>
_run_file(__file__, globals())
File "/Applications/devtools/google-cloud-sdk/platform/google_appengine/_php_runtime.py", line 97, in _run_file
execfile(_PATHS.script_file(script_name), globals_)
File "/Applications/devtools/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/php/runtime/runtime.py", line 39, in <module>
from google.appengine.tools.devappserver2 import wsgi_server
File "/Applications/devtools/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 34, in <module>
import ipaddr
ImportError: No module named ipaddr

Running `gcloud version` gave these results...
 gcloud version
Google Cloud SDK 184.0.0
app-engine-python 1.9.65
beta 2017.09.15
bq 2.0.28
core 2018.01.05
gsutil 4.28

Continue reading...  

, , , , ,

Fascinations has kicked off their Legends line of kits with the Justice League and The Avengers models and now they are adding Guardians of the Galaxy to their line up. I was lucky enough to have received a sneak peek at one of the kits - the Groot model (MEM006). I wasn't disappointed!

Unlike other kits from the Metal Earth 3D series, the Legends series of kits are not just plain metal, they have colour. This really makes each of the models stand out and gives it that much more character.

I must say that initially I thought it weird to have figurine kits from Metal Earth 3D, but after having assembled one it really grew on me. Here's my Groot fully assembled. Read on to see what's in the kit, the assembly and my overall thoughts.

The Groot kit was a single-sheet model. It was ranked 3 out of 10 on the difficulty scale and took me about an hour to make. I really like the fact that these newer kits have difficultly ratings printed on the back, that's something the original Metal Earth 3D kits were missing.

DSC03540.JPG DSC03541.JPG

Inside the kit was a single metal sheet with all the parts of the model stamped out. Along side that were the instructions, which came on a single large piece of paper. On the most part these instructions were easy to follow, however I did notice that the left/right arms were mixed up. Instead of using pieces 1, 2 and 3 for the left arm I actually had to use pieces 4, 5 and 6. Hopefully this issue will not be present once the kits are available to purchase.

DSC03547.JPG DSC03548.JPG

Continue reading...  

, ,

I've been running the Riverside Expressway Cam for a number of years now. Unfortunately it's become too much of a drain on my server resources so I've made the decision to shut it down permanently.

If you're interested in setting up your own time lapse cam, I wrote a handy article on how to do that here: Set up a time lapse webcam with Trafficr.

Continue reading...  

, ,

I've used Google DoubleClick for Publishers on a number of my sites and when it came to thinking about monetising my new project (AtariGamer) that was my goto choice once again. However, compared to my previous approaches, I wanted to do things differently over at AtariGamer. My goal was to try and use well established web app frameworks as much as possible and so I decided to use Backbone.js for all dynamic UI generation. This was to include all of the ads. I also used jQuery to make some things simpler.

To get DFP ads working with Backbone.js I had to create a template, model and a view. My first implementation of this failed spectacularly due to DFP's use of closures for its command execution. I learned from that mistake and rewrote the code and came up with something that worked pretty well.

The DFP reference was useful documentation in helping me resolve the issues I came across. In this article I will not cover basics such as setting up ad units or adding the googletag code to your pages - these are covered in my previous articles: How to use Google AdSense on infinite scroll web pages and Using Google DFP with AdSense on responsive pages. Have a look at those to get up to speed if you're not familiar with DFP.

So lets first look at the template. I've simplified this one from my actual implementation (I require the use of tables for ads over at AtariGamer). This template keeps things simple and down to the bare essentials. Here it is...
 HTML body
<script type="text/template" id="ad-template">
<div id="<%- id %>"></div>

That's all there's to it! The template of course goes somewhere inside the HTML body element.

Next up is the JavaScript for the Backbone model and view. These take care of encapsulating configuration and ad data and also generating ad elements for rendering,
DfpAdModel = Backbone.Model.extend({
defaults: function() {
/* update pubId, adUnitCode and size to suit your DFP account details */
this.set('pubId', '12345678');
this.set('adUnitCode', 'MyAdUnit');
this.set('size', [728, 90]);
/* don't change the id */
this.set('id', 'dfpslot' + DfpAdModel.dfpSlotId++);
dfp: function() {
var adUnitPath = '/' + this.get('pubId') + '/' + this.get('adUnitCode');
var adSize = this.get('size');
var id = this.get('id');
if (typeof googletag !== 'undefined') {
googletag.cmd.push(function() {
var slot = googletag.defineSlot(adUnitPath, adSize, id)
{ dfpSlotId: 1 }
DfpAdView = Backbone.View.extend({
tagName: 'div',
template: _.template($('#ad-template').html()),
render: function () {
return this;

Continue reading...  

, , , , , ,
Hi! You can search my blog here ⤵
Or browse the recent top tags...

Recent Blog Posts

How to fix Google Cloud SDK dev server error - No module named ipaddr

Adorable but totally metal - Metal Earth 3D Guardians of the Galaxy Groot model kit

Riverside Expressway Cam shut down permanently

Inserting Google DFP ads with Backbone, Underscore and jQuery

How to resolve the domain is already mapped to a project error in Google App Engine

A quick look at the Nyko Super MiniBoss wireless controllers for the SNES mini

Loading and displaying a collection from bootstrapped data in Backbone.js

Add this handy function to your Bash profile file to display the compiled JDK version for a .class file

How does PCBWay stack up as a low budget PCB fab

Resolving the Cannot reference X before supertype constructor is called compiler error in Java

Recent Galleries

BMB-012 Nanoblock T-Rex Skeleton Model assembly

Tiny Arcade revision 6 kit assembly and decal application

Atari Lynx repair - Part 5 - McWill LED screen mod installation

Atari Lynx repair - Part 4 - screen cover replacement

Atari Lynx repair - Part 2 - re-capping the motherboard

Atari Lynx repair - Part 3 - broken speaker replacement

Atari Lynx repair - Part 1 - introduction and case disassembly

Building a custom Atari Lynx game box storage shelf unit in a day

Protecting old Atari Lynx game boxes with snug fit plastic sleeves

Monument Valley 2 is released and does not disappoint

Blogs and Friends

Matt Moores Blog
Georgi's FlatPress Guide
Perplexing Permutations
The Security Sleuth
Ilia Rogatchevski
Travelling Fairy

Blog Activity

Blog Activity