<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" lang="en-US">
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" lang="en-US">
<![endif]-->
<!--[if !(IE 7) & !(IE 8)]><!-->
<html lang="en-US">
<!--<![endif]-->
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
	<title>Nomadic Code Monkey | Just another WordPress site</title>
	<link rel="profile" href="https://gmpg.org/xfn/11">
	<link rel="pingback" href="http://www.nomadiccodemonkey.com/xmlrpc.php">
	<!--[if lt IE 9]>
	<script src="http://www.nomadiccodemonkey.com/wp-content/themes/twentyfourteen/js/html5.js"></script>
	<![endif]-->
	<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='dns-prefetch' href='//s.w.org' />
<link href='https://fonts.gstatic.com' crossorigin rel='preconnect' />
<link rel="alternate" type="application/rss+xml" title="Nomadic Code Monkey &raquo; Feed" href="http://www.nomadiccodemonkey.com/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="Nomadic Code Monkey &raquo; Comments Feed" href="http://www.nomadiccodemonkey.com/?feed=comments-rss2" />
<link rel='stylesheet' id='crayon-css'  href='http://www.nomadiccodemonkey.com/wp-content/plugins/crayon-syntax-highlighter/css/min/crayon.min.css?ver=_2.7.2_beta' type='text/css' media='all' />
<link rel='stylesheet' id='crayon-theme-classic-css'  href='http://www.nomadiccodemonkey.com/wp-content/plugins/crayon-syntax-highlighter/themes/classic/classic.css?ver=_2.7.2_beta' type='text/css' media='all' />
<link rel='stylesheet' id='crayon-font-monaco-css'  href='http://www.nomadiccodemonkey.com/wp-content/plugins/crayon-syntax-highlighter/fonts/monaco.css?ver=_2.7.2_beta' type='text/css' media='all' />
<link rel='stylesheet' id='wp-block-library-css'  href='http://www.nomadiccodemonkey.com/wp-includes/css/dist/block-library/style.min.css?ver=5.3.3' type='text/css' media='all' />
<link rel='stylesheet' id='twentyfourteen-lato-css'  href='https://fonts.googleapis.com/css?family=Lato%3A300%2C400%2C700%2C900%2C300italic%2C400italic%2C700italic&#038;subset=latin%2Clatin-ext' type='text/css' media='all' />
<link rel='stylesheet' id='genericons-css'  href='http://www.nomadiccodemonkey.com/wp-content/themes/twentyfourteen/genericons/genericons.css?ver=3.0.3' type='text/css' media='all' />
<link rel='stylesheet' id='twentyfourteen-style-css'  href='http://www.nomadiccodemonkey.com/wp-content/themes/twentyfourteen/style.css?ver=5.3.3' type='text/css' media='all' />
<!--[if lt IE 9]>
<link rel='stylesheet' id='twentyfourteen-ie-css'  href='http://www.nomadiccodemonkey.com/wp-content/themes/twentyfourteen/css/ie.css?ver=20131205' type='text/css' media='all' />
<![endif]-->
<script type='text/javascript' src='http://www.nomadiccodemonkey.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp'></script>
<script type='text/javascript' src='http://www.nomadiccodemonkey.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
<script type='text/javascript'>
/* <![CDATA[ */
var quicktagsL10n = {"closeAllOpenTags":"Close all open tags","closeTags":"close tags","enterURL":"Enter the URL","enterImageURL":"Enter the URL of the image","enterImageDescription":"Enter a description of the image","textdirection":"text direction","toggleTextdirection":"Toggle Editor Text Direction","dfw":"Distraction-free writing mode","strong":"Bold","strongClose":"Close bold tag","em":"Italic","emClose":"Close italic tag","link":"Insert link","blockquote":"Blockquote","blockquoteClose":"Close blockquote tag","del":"Deleted text (strikethrough)","delClose":"Close deleted text tag","ins":"Inserted text","insClose":"Close inserted text tag","image":"Insert image","ul":"Bulleted list","ulClose":"Close bulleted list tag","ol":"Numbered list","olClose":"Close numbered list tag","li":"List item","liClose":"Close list item tag","code":"Code","codeClose":"Close code tag","more":"Insert Read More tag"};
/* ]]> */
</script>
<script type='text/javascript' src='http://www.nomadiccodemonkey.com/wp-includes/js/quicktags.min.js?ver=5.3.3'></script>
<script type='text/javascript'>
/* <![CDATA[ */
var CrayonSyntaxSettings = {"version":"_2.7.2_beta","is_admin":"0","ajaxurl":"http:\/\/www.nomadiccodemonkey.com\/wp-admin\/admin-ajax.php","prefix":"crayon-","setting":"crayon-setting","selected":"crayon-setting-selected","changed":"crayon-setting-changed","special":"crayon-setting-special","orig_value":"data-orig-value","debug":""};
var CrayonSyntaxStrings = {"copy":"Press %s to Copy, %s to Paste","minimize":"Click To Expand Code"};
var CrayonTagEditorSettings = {"home_url":"http:\/\/www.nomadiccodemonkey.com","css":"crayon-te","css_selected":"crayon-selected","code_css":"#crayon-code","url_css":"#crayon-url","url_info_css":"#crayon-te-url-info","lang_css":"#crayon-lang","title_css":"#crayon-title","mark_css":"#crayon-mark","range_css":"#crayon-range","inline_css":"crayon-inline","inline_hide_css":"crayon-hide-inline","inline_hide_only_css":"crayon-hide-inline-only","hl_css":"#crayon-highlight","switch_html":"#content-html","switch_tmce":"#content-tmce","tinymce_button_generic":".mce-btn","tinymce_button":"a.mce_crayon_tinymce,.mce-i-crayon_tinymce","tinymce_button_unique":"mce_crayon_tinymce","tinymce_highlight":"mce-active","submit_css":"#crayon-te-ok","cancel_css":"#crayon-te-cancel","content_css":"#crayon-te-content","dialog_title_css":"#crayon-te-title","submit_wrapper_css":"#crayon-te-submit-wrapper","data_value":"data-value","attr_sep":":","css_sep":"_","fallback_lang":"default","add_text":"Add Code","edit_text":"Edit Code","quicktag_text":"crayon","submit_add":"Add","submit_edit":"Save","bar":"#crayon-te-bar","bar_content":"#crayon-te-bar-content","extensions":{"scpt":"applescript","applescript":"applescript","swf":"as","fla":"as","cs":"c#","h":"c++","hh":"c++","hpp":"c++","hxx":"c++","h++":"c++","cc":"c++","cpp":"c++","cxx":"c++","c++":"c++","pas":"delphi","java":"java","class":"java","jar":"java","mel":"mel","ma":"mel","mv":"miva","mvc":"miva","mvt":"miva","m":"objc","mm":"objc","psc":"papyrus","pl":"perl","py":"python","pyw":"python","pyc":"python","pyo":"python","pyd":"python","rb":"ruby","rbx":"ruby","rhtml":"ruby","vbs":"vb"}};
var CrayonSyntaxSettings = {"version":"_2.7.2_beta","is_admin":"0","ajaxurl":"http:\/\/www.nomadiccodemonkey.com\/wp-admin\/admin-ajax.php","prefix":"crayon-","setting":"crayon-setting","selected":"crayon-setting-selected","changed":"crayon-setting-changed","special":"crayon-setting-special","orig_value":"data-orig-value","debug":""};
var CrayonSyntaxStrings = {"copy":"Press %s to Copy, %s to Paste","minimize":"Click To Expand Code"};
/* ]]> */
</script>
<script type='text/javascript' src='http://www.nomadiccodemonkey.com/wp-content/plugins/crayon-syntax-highlighter/js/min/crayon.te.min.js?ver=_2.7.2_beta'></script>
<link rel='https://api.w.org/' href='http://www.nomadiccodemonkey.com/index.php?rest_route=/' />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.nomadiccodemonkey.com/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 5.3.3" />
<style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><meta data-pso-pv="1.2.1" data-pso-pt="front" data-pso-th="bae4ec4ac3bfd3ed75dab970eb864534"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><script pagespeed_no_defer="" data-pso-version="20170502_060509">window.dynamicgoogletags={config:[]};dynamicgoogletags.config=["ca-pub-5122685663108342",[[[["DIV",null,"secondary",[]],["10px","10px",0],1,null,"7056548517",0],[["ARTICLE",0,null,[],0],["10px","10px",0],0,null,"1010014915",0]]],[[[],[],[]]],"WordPressFront","5579815317",null,0.01,null,[null,1209600000],0.01,0,null,null,"http://www.nomadiccodemonkey.com"];(function(){var h=this,aa=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
else if("function"==b&&"undefined"==typeof a.call)return"object";return b},p=function(a){return"number"==typeof a},ba=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},r=function(a,b){function c(){}c.prototype=b.prototype;a.Sa=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.Ua=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,
d)}};var ca=document,da=window;var ea=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},fa=function(a,b){return a<b?-1:a>b?1:0},ga=function(a){return String(a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()})};var ha=Array.prototype.forEach?function(a,b,c){Array.prototype.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e="string"==typeof a?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a)};var t;a:{var ia=h.navigator;if(ia){var ja=ia.userAgent;if(ja){t=ja;break a}}t=""}var v=function(a){return-1!=t.indexOf(a)};var ka=function(a){ka[" "](a);return a};ka[" "]=function(){};var ma=function(a,b){var c=la;Object.prototype.hasOwnProperty.call(c,a)||(c[a]=b(a))};var na=v("Opera"),w=v("Trident")||v("MSIE"),oa=v("Edge"),pa=v("Gecko")&&!(-1!=t.toLowerCase().indexOf("webkit")&&!v("Edge"))&&!(v("Trident")||v("MSIE"))&&!v("Edge"),qa=-1!=t.toLowerCase().indexOf("webkit")&&!v("Edge"),ra=function(){var a=h.document;return a?a.documentMode:void 0},sa;
a:{var ta="",ua=function(){var a=t;if(pa)return/rv\:([^\);]+)(\)|;)/.exec(a);if(oa)return/Edge\/([\d\.]+)/.exec(a);if(w)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(qa)return/WebKit\/(\S+)/.exec(a);if(na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();ua&&(ta=ua?ua[1]:"");if(w){var va=ra();if(null!=va&&va>parseFloat(ta)){sa=String(va);break a}}sa=ta}
var wa=sa,la={},xa=function(a){ma(a,function(){for(var b=0,c=ea(String(wa)).split("."),d=ea(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var g=c[f]||"",k=d[f]||"";do{g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];k=/(\d*)(\D*)(.*)/.exec(k)||["","","",""];if(0==g[0].length&&0==k[0].length)break;b=fa(0==g[1].length?0:parseInt(g[1],10),0==k[1].length?0:parseInt(k[1],10))||fa(0==g[2].length,0==k[2].length)||fa(g[2],k[2]);g=g[3];k=k[3]}while(0==b)}return 0<=b})},ya;var za=h.document;
ya=za&&w?ra()||("CSS1Compat"==za.compatMode?parseInt(wa,10):5):void 0;var Aa;if(!(Aa=!pa&&!w)){var Ba;if(Ba=w)Ba=9<=Number(ya);Aa=Ba}Aa||pa&&xa("1.9.1");w&&xa("9");var x=function(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d};x.prototype.floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.left);return this};var Da=function(){var a=Ca;try{var b;if(b=!!a&&null!=a.location.href)a:{try{ka(a.foo);b=!0;break a}catch(c){}b=!1}return b}catch(c){return!1}},Ea=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.call(void 0,a[c],c,a)};var Fa=function(){var a=!1;try{var b=Object.defineProperty({},"passive",{get:function(){a=!0}});h.addEventListener("test",null,b)}catch(c){}return a}();var Ga=function(a){h.google_image_requests||(h.google_image_requests=[]);var b=h.document.createElement("img");b.src=a;h.google_image_requests.push(b)};var Ha=!!window.google_async_iframe_id,Ca=Ha&&window.parent||window;var Ia=function(a,b,c,d,e){this.ma=c||4E3;this.H=a||"&";this.ya=b||",$";this.T=void 0!==d?d:"trn";this.Ta=e||null;this.xa=!1;this.V={};this.Ka=0;this.L=[]},Ka=function(a,b,c,d,e){var f=[];Ea(a,function(a,k){(a=Ja(a,b,c,d,e))&&f.push(k+"="+a)});return f.join(b)},Ja=function(a,b,c,d,e){if(null==a)return"";b=b||"&";c=c||",$";"string"==typeof c&&(c=c.split(""));if(a instanceof Array){if(d=d||0,d<c.length){for(var f=[],g=0;g<a.length;g++)f.push(Ja(a[g],b,c,d+1,e));return f.join(c[d])}}else if("object"==
typeof a)return e=e||0,2>e?encodeURIComponent(Ka(a,b,c,d,e+1)):"...";return encodeURIComponent(String(a))},Ma=function(a,b,c,d){b=b+"//"+c+d;var e=La(a)-d.length-0;if(0>e)return"";a.L.sort(function(a,b){return a-b});d=null;c="";for(var f=0;f<a.L.length;f++)for(var g=a.L[f],k=a.V[g],m=0;m<k.length;m++){if(!e){d=null==d?g:d;break}var l=Ka(k[m],a.H,a.ya);if(l){l=c+l;if(e>=l.length){e-=l.length;b+=l;c=a.H;break}else a.xa&&(c=e,l[c-1]==a.H&&--c,b+=l.substr(0,c),c=a.H,e=0);d=null==d?g:d}}f="";a.T&&null!=
d&&(f=c+a.T+"="+(a.Ta||d));return b+f+""},La=function(a){if(!a.T)return a.ma;var b=1,c;for(c in a.V)b=c.length>b?c.length:b;return a.ma-a.T.length-b-a.H.length-1};var Pa=function(a,b,c,d){var e=Na;if((c?e.Qa:Math.random())<(d||e.Ba))try{if(b instanceof Ia)var f=b;else f=new Ia,Ea(b,function(a,b){var c=f,d=c.Ka++,e={};e[b]=a;a=[e];c.L.push(d);c.V[d]=a});var g=Ma(f,e.Na,e.Da,e.Ma+a+"&");g&&Ga(g)}catch(k){}};var Qa=function(a,b){this.events=[];this.Z=b||h;var c=null;b&&(b.google_js_reporting_queue=b.google_js_reporting_queue||[],this.events=b.google_js_reporting_queue,c=b.google_measure_js_timing);this.ja=null!=c?c:Math.random()<a;a:{try{var d=(this.Z||h).top.location.hash;if(d){var e=d.match(/\bdeid=([\d,]+)/);var f=e&&e[1]||"";break a}}catch(g){}f=""}a=f;b=this.Z.performance;this.sa=!!(b&&b.mark&&b.clearMarks&&a.indexOf&&0<a.indexOf("1337"))};
Qa.prototype.disable=function(){this.sa&&ha(this.events,this.Aa,this);this.events.length=0;this.ja=!1};Qa.prototype.Aa=function(a){if(a&&this.sa){var b=this.Z.performance;b.clearMarks("goog_"+a.uniqueId+"_start");b.clearMarks("goog_"+a.uniqueId+"_end")}};var Na,y;if(Ha&&!Da()){var Ra="."+ca.domain;try{for(;2<Ra.split(".").length&&!Da();)ca.domain=Ra=Ra.substr(Ra.indexOf(".")+1),Ca=window.parent}catch(a){}Da()||(Ca=window)}y=Ca;var Sa=new Qa(1,y);Na=new function(){this.Na="http:"===da.location.protocol?"http:":"https:";this.Da="pagead2.googlesyndication.com";this.Ma="/pagead/gen_204?id=";this.Ba=.01;this.Qa=Math.random()};
if("complete"==y.document.readyState)y.google_measure_js_timing||Sa.disable();else if(Sa.ja){var Ta=function(){y.google_measure_js_timing||Sa.disable()};y.addEventListener?y.addEventListener("load",Ta,Fa?void 0:!1):y.attachEvent&&y.attachEvent("onload",Ta)};var z=function(){},Ua="function"==typeof Uint8Array,B=function(a,b,c){a.a=null;b||(b=[]);a.Wa=void 0;a.M=-1;a.l=b;a:{if(a.l.length){b=a.l.length-1;var d=a.l[b];if(d&&"object"==typeof d&&"array"!=aa(d)&&!(Ua&&d instanceof Uint8Array)){a.R=b-a.M;a.G=d;break a}}a.R=Number.MAX_VALUE}a.Va={};if(c)for(b=0;b<c.length;b++)d=c[b],d<a.R?(d+=a.M,a.l[d]=a.l[d]||A):a.G[d]=a.G[d]||A},A=[],C=function(a,b){if(b<a.R){b+=a.M;var c=a.l[b];return c===A?a.l[b]=[]:c}c=a.G[b];return c===A?a.G[b]=[]:c},Wa=function(a){a=
C(Va,a);return null==a?a:+a},D=function(a,b,c){b<a.R?a.l[b+a.M]=c:a.G[b]=c},E=function(a,b,c){a.a||(a.a={});if(!a.a[c]){var d=C(a,c);d&&(a.a[c]=new b(d))}return a.a[c]},F=function(a,b,c){a.a||(a.a={});if(!a.a[c]){for(var d=C(a,c),e=[],f=0;f<d.length;f++)e[f]=new b(d[f]);a.a[c]=e}b=a.a[c];b==A&&(b=a.a[c]=[]);return b},Xa=function(a,b,c){a.a||(a.a={});c=c||[];for(var d=[],e=0;e<c.length;e++)d[e]=G(c[e]);a.a[b]=c;D(a,b,d)},Ya=function(a){if(a.a)for(var b in a.a){var c=a.a[b];if("array"==aa(c))for(var d=
0;d<c.length;d++)c[d]&&G(c[d]);else c&&G(c)}},G=function(a){Ya(a);return a.l};z.prototype.toString=function(){Ya(this);return this.l.toString()};var Za=function(a){var b;if("array"==aa(a)){for(var c=Array(a.length),d=0;d<a.length;d++)null!=(b=a[d])&&(c[d]="object"==typeof b?Za(b):b);return c}if(Ua&&a instanceof Uint8Array)return new Uint8Array(a);c={};for(d in a)null!=(b=a[d])&&(c[d]="object"==typeof b?Za(b):b);return c};var H=function(a){this.oa={};this.oa.c=a;this.o=[];this.u=null;this.v=[];this.fa=0};H.prototype.g=function(a){for(var b=0;b<this.o.length;b++)if(this.o[b]==a)return this;this.o.push(a);return this};var $a=function(a,b){a.u=a.u?a.u:b;return a};H.prototype.C=function(a){for(var b=0;b<this.v.length;b++)if(this.v[b]==a)return this;this.v.push(a);return this};
H.prototype.getData=function(a){var b=this.oa,c={};for(d in b)c[d]=b[d];0<this.fa&&(c.t=this.fa);c.err=this.o.join();c.warn=this.v.join();if(this.u){c.excp_n=this.u.name;c.excp_m=this.u.message&&this.u.message.substring(0,512);if(b=this.u.stack){var d=this.u.stack;try{-1==d.indexOf("")&&(d="\n"+d);for(var e;d!=e;)e=d,d=d.replace(/((https?:\/..*\/)[^\/:]*:\d+(?:.|\n)*)\2/,"$1");b=d.replace(/\n */g,"\n")}catch(f){b=""}}c.excp_s=b}c.w=0<a.innerWidth?a.innerWidth:null;c.h=0<a.innerHeight?a.innerHeight:
null;return c};var bb=function(a,b){ab(a,a.Ga,a.X,b)},ab=function(a,b,c,d){var e=d.u;d=d.getData(a.K);a.Ia?(d.type=b,a.K.console.log(d),e&&a.K.console.error(e)):0<c&&(d.r=c,Pa(b,d,"jserror"!=b,c))};var I=function(a){return a.dynamicgoogletags=a.dynamicgoogletags||{}};var J=function(a){B(this,a,cb)};r(J,z);var cb=[4];J.prototype.getId=function(){return C(this,3)};var K=function(a){B(this,a,null)};r(K,z);var db=function(a){B(this,a,null)};r(db,z);var L=function(a){return E(a,J,1)},M=function(a){B(this,a,eb)};r(M,z);var eb=[1];M.prototype.i=function(){return F(this,db,1)};M.prototype.qa=function(a){Xa(this,1,a)};var N=function(a){B(this,a,fb)};r(N,z);var fb=[2],gb=function(a){B(this,a,null)};r(gb,z);N.prototype.la=function(){return C(this,3)};N.prototype.ra=function(a){D(this,3,a)};var O=function(a){B(this,a,hb)};r(O,z);var hb=[1,2,3];O.prototype.i=function(){return F(this,db,2)};
O.prototype.qa=function(a){Xa(this,2,a)};var P=function(a){B(this,a,ib)};r(P,z);var ib=[3],jb=function(a){B(this,a,null)};r(jb,z);P.prototype.A=function(){return C(this,1)};P.prototype.D=function(){return E(this,M,2)};P.prototype.O=function(){return C(this,4)};P.prototype.la=function(){return C(this,5)};P.prototype.ra=function(a){D(this,5,a)};P.prototype.N=function(){return E(this,jb,9)};var kb=function(a){this.m=a;this.ua=[]};kb.prototype.f=function(){return 0<F(this.m,O,3).length?F(this.m,O,3)[0]:null};var lb=function(a){var b=["adsbygoogle-placeholder"];a=a.className?a.className.split(/\s+/):[];for(var c={},d=0;d<a.length;++d)c[a[d]]=!0;for(d=0;d<b.length;++d)if(!c[b[d]])return!1;return!0};var mb=function(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=ga(d.Xa);a[e]=d.value}},pb=function(a,b){var c=nb;b.setAttribute("data-adsbygoogle-status","reserved");b={element:b};(c=c&&c.Oa)&&(b.params=c);ob(a).push(b)},ob=function(a){return a.adsbygoogle=a.adsbygoogle||[]};var qb=function(a,b){if(!a)return!1;a=b.getComputedStyle?b.getComputedStyle(a,null):a.currentStyle;if(!a)return!1;a=a.cssFloat||a.styleFloat;return"left"==a||"right"==a},rb=function(a){for(a=a.previousSibling;a&&1!=a.nodeType;)a=a.previousSibling;return a?a:null},sb=function(a){return!!a.nextSibling||!!a.parentNode&&sb(a.parentNode)};var tb=function(a,b){var c=a.length;if(null!=c)for(var d=0;d<c;d++)b.call(void 0,a[d],d)};var ub=function(a,b,c,d){this.na=a;this.aa=b;this.ba=c;this.P=d};ub.prototype.query=function(a){var b=[];try{b=a.querySelectorAll(this.na)}catch(f){}if(!b.length)return[];a=b;b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];a=c}else a=[];a=vb(this,a);p(this.aa)&&(b=this.aa,0>b&&(b+=a.length),a=0<=b&&b<a.length?[a[b]]:[]);if(p(this.ba)){b=[];for(c=0;c<a.length;c++){var d=wb(a[c]),e=this.ba;0>e&&(e+=d.length);0<=e&&e<d.length&&b.push(d[e])}a=b}return a};
ub.prototype.toString=function(){return JSON.stringify({nativeQuery:this.na,occurrenceIndex:this.aa,paragraphIndex:this.ba,ignoreMode:this.P})};
var vb=function(a,b){if(null==a.P)return b;switch(a.P){case 1:return b.slice(1);case 2:return b.slice(0,b.length-1);case 3:return b.slice(1,b.length-1);case 0:return b;default:throw Error("Unknown ignore mode: "+a.P);}},wb=function(a){var b=[];tb(a.getElementsByTagName("p"),function(a){100<=xb(a)&&b.push(a)});return b},xb=function(a){if(3==a.nodeType)return a.length;if(1!=a.nodeType||"SCRIPT"==a.tagName)return 0;var b=0;tb(a.childNodes,function(a){b+=xb(a)});return b},yb=function(a){return 0==a.length||
isNaN(a[0])?a:"\\"+(30+parseInt(a[0],10))+" "+a.substring(1)};var zb=function(a,b){var c=0,d=C(a,6);if(void 0!==d)switch(d){case 0:c=1;break;case 1:c=2;break;case 2:c=3}var d=null,e=C(a,7);if(C(a,1)||a.getId()||0<C(a,4).length){var f=a.getId(),g=C(a,1),e=C(a,4),d=C(a,2);a=C(a,5);var k="";g&&(k+=g);f&&(k+="#"+yb(f));if(e)for(f=0;f<e.length;f++)k+="."+yb(e[f]);d=(e=k)?new ub(e,d,a,c):null}else e&&(d=new ub(e,C(a,2),C(a,5),c));return d?d.query(b):[]},Ab=function(a,b){if(a==b)return!0;if(!a||!b||C(a,1)!=C(b,1)||C(a,2)!=C(b,2)||a.getId()!=b.getId()||C(a,7)!=C(b,
7)||C(a,5)!=C(b,5)||C(a,6)!=C(b,6))return!1;a=C(a,4);b=C(b,4);if(a||b)if(a&&b&&a.length==b.length)for(var c=0;c<a.length;c++){if(a[c]!=b[c])return!1}else return!1;return!0};var Bb=function(a){a=a.document;return("CSS1Compat"==a.compatMode?a.documentElement:a.body)||{}},Cb=function(a){return void 0===a.pageYOffset?(a.document.documentElement||a.document.body.parentNode||a.document.body).scrollTop:a.pageYOffset};var Db=function(a,b){b=L(b);if(!b)return null;a=zb(b,a);return 0<a.length?a[0]:null},Fb=function(a,b){b=Eb(a,b,!0);return p(b)&&!(b<=Bb(a).clientHeight)},Gb=function(a,b){return a.body?b-a.body.getBoundingClientRect().top:b},Eb=function(a,b,c){if(!c||!p(C(b,8))){var d=Db(a.document,b);if(d){var e=null!=E(b,K,2)?C(E(b,K,2),3):void 0;c=a.document.createElement("div");c.className="googlepublisherpluginad";var f=c.style;f.textAlign="center";f.width="100%";f.height="0px";f.clear=e?"both":"none";Hb(c,d,
C(b,3));d=c.getBoundingClientRect().top+Cb(a);c.parentNode.removeChild(c);D(b,8,d)}}b=C(b,8);return p(b)?b-Cb(a):null},Ib={0:0,1:1,2:2,3:3},Jb={0:"auto",1:"horizontal",2:"vertical",3:"rectangle"},Kb=function(a,b){a.sort(function(a,d){a=Eb(b,a,!0);a=p(a)?a:Number.POSITIVE_INFINITY;d=Eb(b,d,!0);d=p(d)?d:Number.POSITIVE_INFINITY;return a-d})},Hb=function(a,b,c){switch(Ib[c]){case 0:b.parentNode&&b.parentNode.insertBefore(a,b);break;case 3:if(c=b.parentNode){var d=b.nextSibling;if(d&&d.parentNode!=c)for(;d&&
8==d.nodeType;)d=d.nextSibling;c.insertBefore(a,d)}break;case 1:b.insertBefore(a,b.firstChild);break;case 2:b.appendChild(a)}if(1!=b.nodeType?0:"INS"==b.tagName&&lb(b))b.style.display="block"};var nb=new function(){this.ia="googlepublisherpluginad";this.Oa={google_tag_origin:"pso"}},Q=function(a){this.b=a;this.j=[];this.ea=0;this.o=[];this.v=[];this.Y=null;this.pa=!1},Lb=function(a,b){a=E(a.f(),J,4);if(!(a&&b&&C(b,1)==C(a,1)&&b.getId()==a.getId()&&p(C(b,2))&&p(C(b,5))))return!1;a=C(a,4);b=C(b,4);if(a.length!=b.length)return!1;for(var c=0;c<a.length;++c)if(b[c]!=a[c])return!1;return!0},Mb=function(a){var b=p(void 0)?void 0:20;var c=a.f();var d=c.i(),e=E(c,J,4);if(!(a.pa||0>=b)&&e&&0!=zb(e,
a.b.document).length){a.pa=!0;for(var f=[],g=0;g<d.length;++g){var k=d[g];var m=L(k);Lb(a,m)&&(c=C(m,2),m=C(m,5),null!=c&&null!=m&&0<=c&&0<=m&&(!f[c]||C(L(f[c]),5)<m)&&(f[c]=k))}m=0;d=zb(e,a.b.document);for(c=0;c<f.length&&m<b;++c){var e=m,g=a,l=d[c],k=f[c];m=b-m;var u=g.f().i(),q=0;if(l&&k){l=wb(l).length;switch(C(L(k),6)){case 0:case 1:--l;break;case 2:l-=2}for(var n=C(L(k),5)+1;n<l&&q<m;++n){var Oa=new k.constructor(Za(G(k))),Hc=L(Oa);D(Hc,5,n);u.push(Oa);q++}}q&&g.f().qa(u);m=e+q}}};
Q.prototype.g=function(a){for(var b=0;b<this.o.length;++b)if(this.o[b]==a)return;this.o.push(a)};Q.prototype.C=function(a){for(var b=0;b<this.v.length;++b)if(this.v[b]==a)return;this.v.push(a)};
var Nb=function(a,b,c){var d=Ib[C(b,3)],e=Db(a.b.document,b);if(e){a:{var f=a.b;switch(d){case 0:f=qb(rb(e),f);break a;case 3:f=qb(e,f);break a;case 2:var g=e.lastChild;f=qb(g?1==g.nodeType?g:rb(g):null,f);break a}f=!1}if(!f&&(c||2!=d||sb(e))&&(c=1==d||2==d?e:e.parentNode,!c||(1!=c.nodeType?0:"INS"==c.tagName&&lb(c))||!(0>=c.offsetWidth)))a:if(C(b,7))a.C(8);else{b:if(C(b,5))c=C(b,5);else{if(c=R(a).f())if(c=C(c,3),a.ea<c.length){c=c[a.ea++];break b}a.g(4);c=null}if(null!=c){D(b,7,!0);d=[];(f=a.O())&&
d.push(f);f=R(a).ua;for(g=0;g<f.length;++g)d.push(f[g]);p(C(b,9))&&d.push("pso-lv-"+C(b,9));var k=a.b.document;f=a.A();var g=C(b,6),g=null!=g?Jb[g]:g,m=E(b,K,2),l={};m&&(l.ta=C(m,1),l.ha=C(m,2),l.za=!!C(m,3));var m=c,u=nb,q=k.createElement("div"),n=q.style;n.textAlign="center";n.width="100%";n.height="auto";n.clear=l.za?"both":"none";l.La&&mb(n,l.La);k=k.createElement("ins");n=k.style;n.display="block";n.margin="auto";n.backgroundColor="transparent";l.ta&&(n.marginTop=l.ta);l.ha&&(n.marginBottom=
l.ha);l.va&&mb(n,l.va);q.appendChild(k);k.setAttribute("data-ad-format",g?g:"auto");if(g=u&&u.ia)q.className=g;k.className="adsbygoogle";k.setAttribute("data-ad-client",f);m&&k.setAttribute("data-ad-slot",m);d.length&&k.setAttribute("data-ad-channel",d.join("+"));Hb(q,e,C(b,3));try{pb(a.b,k)}catch(Oa){C(b,5)!=c&&a.ea--;D(b,7,!1);a.C(6);q&&q.parentNode&&q.parentNode.removeChild(q);break a}a.j.push(q)}}}},Ob=function(a,b){for(var c=Number.POSITIVE_INFINITY,d=0;d<a.j.length;++d)var e=a.j[d].getBoundingClientRect().top,
f=a.j[d].getBoundingClientRect().bottom,c=Math.min(c,b<e?e-b:f<b?b-f:0);return c},R=function(a){a=I(a.b).ps||null;if(!a)throw Error("No placementState");return a},Pb=function(a,b){var c=R(a).m;if(!c||!c.A())return a.g(5),!1;c=F(c,O,3)[0];return c?C(c,3).length<b?(a.g(4),a.g(5),!1):!0:(a.g(5),!1)};Q.prototype.A=function(){return R(this).m.A()||""};Q.prototype.O=function(){return R(this).m.O()||void 0};Q.prototype.D=function(){return R(this).m.D()||new M};
Q.prototype.f=function(){var a=R(this).f();if(!a)throw Error("No mConfig");return a};var Qb=function(a){a=C(a.f(),6);return null!=a&&0<a};var Rb=function(){this.I=this.J=this.ca=null};var S=function(a){Q.call(this,a)};r(S,Q);S.prototype.apply=function(a){var b;(b=R(this).m)&&b.A()&&b.D()?b=!0:(this.g(5),b=!1);if(b){b=this.D().i();for(var c=0;c<b.length;c++){var d=b[c];C(d,7)||Nb(this,d,a)}}};S.prototype.B=function(){return(0==this.D().i().length||0<this.j.length)&&0==this.o.length};var Sb=function(a){Q.call(this,a);if(Pb(this,0)){a=this.D().i();for(var b=this.f().i(),c=0;c<a.length;c++){var d=a[c];a:{var e=d;var f=b;if(e&&L(e))for(var g=0;g<f.length;g++){var k=f[g];if(C(e,3)==C(k,3)&&Ab(L(e),L(k))){e=k;break a}}e=null}e&&E(e,K,2)&&(e=E(e,K,2),d.a||(d.a={}),f=e?G(e):e,d.a[2]=e,D(d,2,f))}}};r(Sb,S);var Ub=function(a,b){var c=void 0===b.pageXOffset?(b.document.documentElement||b.document.body.parentNode||b.document.body).scrollLeft:b.pageXOffset,d=Cb(b);if(a.getBoundingClientRect)return a=a.getBoundingClientRect(),Tb(a)?new x(a.top+d,a.right+c,a.bottom+d,a.left+c):new x(0,0,0,0);b=b.document.createRange();b.selectNodeContents(a);return b.collapsed?new x(0,0,0,0):b.getBoundingClientRect?(a=b.getBoundingClientRect(),Tb(a)?new x(a.top+d,a.right+c,a.bottom+d,a.left+c):new x(0,0,0,0)):new x(0,0,0,
0)},Tb=function(a){return!!a&&p(a.top)&&!isNaN(a.top)&&p(a.right)&&!isNaN(a.right)&&p(a.bottom)&&!isNaN(a.bottom)&&p(a.left)&&!isNaN(a.left)};var Zb=function(a){this.K=a;this.Ha=Vb(a);this.wa=T("ins.adsbygoogle",a);this.ga=Wb(a);this.Pa=T("[__lsu_res=reserved]",a);this.U=[];a=Xb(this);for(var b=0;b<a.length;b++)this.U.push(new Yb(a[b]))},Vb=function(a){var b=a.googletag;if(!b||"function"!=typeof b.pubads)return T("div[id^=div-gpt-ad]",a);var c=[];try{for(var d=b.pubads().getSlots(),b=0;b<d.length;b++){var e=d[b].getSlotElementId(),f=a.document.getElementById(e);null!=f&&c.push(f)}}catch(g){Pa("ladd_evt",{ok:0,err:g.toString()},!0,.1)}return c},
Wb=function(a){return T("iframe[id^=aswift_],iframe[id^=google_ads_frame]",a)},T=function(a,b){return Array.prototype.slice.call(b.document.querySelectorAll(a))},Xb=function(a){return[].concat(a.Ha,a.wa,a.ga,a.Pa)},Yb=function(a){this.Ea=a;this.W=null};var U=function(a){Q.call(this,a)};r(U,Q);U.prototype.apply=function(){};U.prototype.B=function(){if(Qb(this)){var a=this.b;var b=Vb(a);a=0<[].concat(b,T("ins.adsbygoogle",a),Wb(a),T("[__lsu_res=reserved]",a)).length}else a=!0;return a};var $b=function(a){Q.call(this,a);this.F=null};r($b,Q);
$b.prototype.apply=function(a){if(a&&Pb(this,2)){Mb(this);a=Bb(this.b).clientHeight||640;null==this.F&&(this.F=new Zb(this.b));var b=this.F.ga.length;if(!(5<=b)){var b=Math.min(2,5-b),c=this.f().i();Kb(c,this.b);for(var d=0;d<c.length&&this.j.length<b;++d){var e=c[d];if(Fb(this.b,e)){var f=Eb(this.b,e,!0);if(void 0!==f){a:{var g=this.F;for(var k=a,m=f,l=0;l<g.U.length;l++){var u=m,q=k;var n=g.U[l];n.W||(n.W=Ub(n.Ea,g.K));n=n.W;if(n.top-q<u&&u<n.bottom+q){g=!0;break a}}g=!1}g||Ob(this,f)<a||Nb(this,
e,!0)}}}0==this.j.length&&this.C(1)}}};$b.prototype.B=function(){return Qb(this)?0<Xb(this.F).length:!0};var ac=function(a){Q.call(this,a);this.$=!1};r(ac,U);
ac.prototype.apply=function(a){if(a&&!this.$){a:{var b=this.b.document;var c=b.body;if(a&&c){a=this.A();var d=nb,e=b.createElement("div");e.style.display="block";if(d=d&&d.ia)e.className=d;b=b.createElement("ins");b.className="adsbygoogle";b.setAttribute("data-ad-client",a);b.setAttribute("data-reactive-ad-format","1");b.style.display="none";e.appendChild(b);Hb(e,c,2);try{pb(this.b,b)}catch(f){this.C(6);e&&e.parentNode&&e.parentNode.removeChild(e);c=5;break a}this.j.push(e);c=0}else c=4}this.$=0==
c}};ac.prototype.B=function(){return this.$&&U.prototype.B.call(this)};var bc=function(a){Q.call(this,a);a=Bb(a).clientHeight;this.Ca=.1*a;this.Ja=.75*a};r(bc,Q);
bc.prototype.apply=function(a){if(Pb(this,3)&&!this.B()){Mb(this);var b=this.f().i();Kb(b,this.b);var c=this.Ca;var d=document;d=d.querySelectorAll?d.querySelectorAll("header,#header,#masthead,.header,.site-header"):[];for(var e=d.length,f=0<e?d[0]:null,g=1;g<e;g++)d[g].getBoundingClientRect().top<f.getBoundingClientRect().top&&(f=d[g]);(d=f)&&(d=d.getBoundingClientRect())&&d.top!=d.bottom&&d.left!=d.right&&(c=Math.min(c,Gb(document,d.bottom)));for(d=0;d<b.length&&3>this.j.length;d++){e=b[d];var f=
c,g=this.b.document,k=Eb(this.b,e,!1);!p(k)||Gb(g,k)<f?f=!1:(f=Ob(this,k),f=this.Ja<f);f&&(f=Fb(this.b,e),g=C(e,6)||0,f&&0==g&&D(e,6,3),!f&&a||Nb(this,e,a))}}};bc.prototype.B=function(){return 3==this.j.length};var V={};V[16]=S;V[17]=S;V[19]=U;V[29]=$b;V[33]=U;V[30]=ac;V[28]=bc;V[34]=bc;V[32]=Sb;V[1]=S;V[8]=U;V[11]=S;var cc=[19,29,33,30,16,32,17,34],dc=[16,19,33,30,17,1,6,8,11];var ec=function(a,b){a=a.google_ad_modifications=a.google_ad_modifications||{};(a.ad_channels=a.ad_channels||[]).push(b)};var fc=function(a){return 0>a||99<a?null:10>a?"0"+a:""+a};var gc=function(a,b){a=a.google_ad_modifications=a.google_ad_modifications||{};a=a.loeids=a.loeids||[];for(var c=0;c<b.length;c++)a.push(b[c])};var hc=function(a,b,c){this.ka=a;this.Fa=c?c:new jb};hc.prototype.N=function(){return this.Fa||new jb};var ic=function(a){if(!p(a))return!1;for(var b=0;b<cc.length;++b)if(a==cc[b])return!1;return!0},nc=function(){var a=W,b=jc,c=kc,d=b.f();if(!d)return lc(16);var e=null,f;a:{var g=F(d,N,1);for(f=0;f<g.length;++f){for(var k=!0,m=0;m<dc.length;++m)C(g[f],4)==dc[m]&&(k=!1);if(k){g=[];0==d.i().length&&g.push("PsoInvalidVariant");0==C(d,3).length&&g.push("PsoNoAdSlotCodes");f=g;break a}}f=[]}g=c.ka;if(0==f.length)a:{e=F(d,N,1);if(p(g))for(f=0;f<e.length;f++)if(k=e[f],V[C(k,4)])for(var m=F(k,gb,2),l=0;l<
m.length;l++){var u=m[l],q=C(u,1),u=C(u,2);if(p(q)&&p(u)&&g>=q&&g<=u){e=k;break a}}e=null}else for(k=0;k<f.length;++k)b.ua.push(f[k]);if(!e){f=F(d,N,1);e={};for(k=0;k<f.length;k++)e[C(f[k],4)]=!0;f=null;e[19]||e[8]?f=19:e[16]||e[1]?f=16:0<d.i().length&&0<C(d,3).length&&e[34]&&(f=34);null!=f?(e=new N,D(e,6,3),D(e,4,f),16!=f&&19!=f&&e.ra("pso-ama-fallback")):e=null}(f=!e)||(!p(g)||800>g?f=!1:820>g?(gc(a,["26835111"]),f=!0):(840>g&&gc(a,["26835112"]),f=!1));if(f)return lc(16);(g=e.la())&&ec(a,g);g=!0;
C(c.N(),2)&&(Date.now?Date.now():+new Date)<C(c.N(),2)||(ec(a,"pso-ama-exd"),g=!1);C(b.m,11)&&(ec(a,"pso-ama-stl-tmp"),g=!1);g&&ec(a,"pso-ama-elig");2==C(e,6)&&(b=C(e,1),null!=b&&gc(a,[""+b]));if(g&&(2==C(e,6)||1==C(e,6))){d=F(d,N,1);if(null===c.ka)c=[];else{b={};c=[];for(g=0;g<d.length;g++)f=mc(d[g]),null==f||b[f]||(b[f]=!0,c.push(f));b=mc(e);if(null!=b){d=[];b=fc(b);g=!1;if(b)for(f=0;f<c.length;f++)k=fc(c[f]),b==k&&(g=!0),k&&d.push("950"+b+k);g||(d=[]);c=d}else c=[]}gc(a,c)}a=new Rb;a.ca=C(e,5);
a.J=C(e,4);return a},lc=function(a){var b=new Rb;b.J=a;return b},oc=function(a){a=a.google_ad_modifications=a.google_ad_modifications||{};a.remove_ads_by_default=!0;a.ad_whitelist=[{ad_tag_origin:"pso"}];a.ad_blacklist=[];a.space_collapsing="slot"},mc=function(a){switch(C(a,6)){case 1:var b=C(a,4);break;case 2:b=C(a,7)}return null!=b?b:null};var pc=function(a){this.document=a};var X=function(a){H.call(this,a)};r(X,H);X.prototype.getData=function(a){var b=X.Sa.getData.call(this,a);a:{var c=(new pc(a.document)).document.getElementsByTagName("script");for(var d=0;d<c.length;++d)if(c[d].hasAttribute("data-pso-version")){c=c[d].getAttribute("data-pso-version");break a}c=null}b.sv=c;if(d=I(a).ps||null){c=d.m;var d=d.f(),e=b.wpc;b.wpc=null!=e?e:c.A();b.su=C(c,14);b.tn=c.O();b.ev=d&&C(d,5)}if(a=I(a).ss||null)b.s=a.J,b.st=a.ca;return b};var qc=null,rc=!1,uc=function(a){var b=sc,c=tc;b.addEventListener?(a&&b.addEventListener("DOMContentLoaded",a,!1),c&&b.addEventListener("load",c,!1)):b.attachEvent&&c&&b.attachEvent("onload",c)},wc=function(a){p(qc)&&a.clearInterval&&(a.clearInterval(qc),qc=null);rc||vc(a,!1);vc(a,!0)},xc=function(a,b){try{wc(b);var c=I(b).ss||null;if(c&&c.I){var d=c.I,e=d.B(),f=d.o,g=d.v,k=d.Y,m=d.j.length;e||0!=m||f.push(6);for(var l=new X(m),c=0;c<g.length;c++)l.C(g[c]);if(e&&0==f.length&&null===k)ab(a,a.Ra,a.da,
l);else{for(e=0;e<f.length;e++)l.g(f[e]);bb(a,$a(l,k))}}else bb(a,(new X(0)).g(2))}catch(u){bb(a,$a((new X(0)).g(1),u))}I(b).loaded=!0},vc=function(a,b){b||(rc=!0);if((a=I(a).ss||null)&&a.I){a=a.I;try{a.apply(b)}catch(c){a.g(1),null===a.Y&&(a.Y=c)}}},yc=function(){vc(window,!1)};var Y=new function(a){this.Ra="pso_success";this.Ga="pso_failure";this.X=this.da=.01;this.Ia=!1;this.K=a}(window);
try{var W=window,Va,zc=I(W).config;Va=zc?new P(zc):null;if(!Va)throw Error("No config");var Ac=Wa(10),Bc=Wa(7);Y.da=null!=Ac?Ac:Y.da;Y.X=null!=Bc?Bc:Y.X;var jc=new kb(Va),Cc=jc;I(W).ps=Cc;var Z,kc;if(v("iPad")||v("Android")&&!v("Mobile")||v("Silk")||!(v("iPod")||v("iPhone")||v("Android")||v("IEMobile")))Z=lc(16);else{var Dc,Ec=/^#([^=]*)=(\d+)$/.exec(W.location.hash);if((Dc=Ec&&3==Ec.length&&"pso_strategy"==Ec[1]?+Ec[2]:null)&&V[Dc]){Z=lc(Dc);var Fc=W;ic(Dc)&&oc(Fc)}else{var Gc=W,Ic=jc.m.N(),Jc;try{var Kc=
parseInt(Gc.localStorage.getItem("PSO_EXP0"),10);Jc=isNaN(Kc)?null:Kc}catch(a){Jc=null}if(null==Jc){var Lc=Jc=Math.floor(1024*Math.random());try{Gc.localStorage.setItem("PSO_EXP0",Lc.toString())}catch(a){}}kc=new hc(Jc,0,Ic);Z=nc()}if(1==Z.ca){var Mc=W;ic(Z.J)&&oc(Mc)}}if(!Z)throw Error("No strategyState created!");var Nc=Z;I(W).ss=Nc;var Oc=W,Pc=Z,Qc=Pc.J;if(p(Qc)){var Rc=V[Qc];Qc&&Rc&&(Pc.I=new Rc(Oc))}var sc=W,tc=ba(xc,Y,sc),Sc=ba(wc,sc);switch(sc.document.readyState){case "complete":tc();break;
case "interactive":Sc();uc();break;default:var Tc=sc,Uc=ob(Tc);Uc.loaded||(Uc.onload=yc);qc=Tc.setInterval(yc,10);uc(Sc)}}catch(a){bb(Y,$a(new X(0),a))};})();
</script></head>

<body class="home blog masthead-fixed list-view full-width grid">
<div id="page" class="hfeed site">
	
	<header id="masthead" class="site-header" role="banner">
		<div class="header-main">
			<h1 class="site-title"><a href="http://www.nomadiccodemonkey.com/" rel="home">Nomadic Code Monkey</a></h1>

			<div class="search-toggle">
				<a href="#search-container" class="screen-reader-text" aria-expanded="false" aria-controls="search-container">Search</a>
			</div>

			<nav id="primary-navigation" class="site-navigation primary-navigation" role="navigation">
				<button class="menu-toggle">Primary Menu</button>
				<a class="screen-reader-text skip-link" href="#content">Skip to content</a>
				<div id="primary-menu" class="nav-menu"><ul>
<li class="page_item page-item-392"><a href="http://www.nomadiccodemonkey.com/?page_id=392">About Me</a></li>
<li class="page_item page-item-540 page_item_has_children"><a href="http://www.nomadiccodemonkey.com/?page_id=540">Projects</a>
<ul class='children'>
	<li class="page_item page-item-542"><a href="http://www.nomadiccodemonkey.com/?page_id=542">Malaysian Bill Watcher</a></li>
</ul>
</li>
</ul></div>
			</nav>
		</div>

		<div id="search-container" class="search-box-wrapper hide">
			<div class="search-box">
				<form role="search" method="get" class="search-form" action="http://www.nomadiccodemonkey.com/">
				<label>
					<span class="screen-reader-text">Search for:</span>
					<input type="search" class="search-field" placeholder="Search &hellip;" value="" name="s" />
				</label>
				<input type="submit" class="search-submit" value="Search" />
			</form>			</div>
		</div>
	</header><!-- #masthead -->

	<div id="main" class="site-main">

<div id="main-content" class="main-content">


	<div id="primary" class="content-area">
		<div id="content" class="site-content" role="main">

		
<article id="post-1379" class="post-1379 post type-post status-publish format-standard hentry category-uncategorized">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=1379" rel="bookmark">Where can A Malaysian get Electronics Components</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=1379" rel="bookmark"><time class="entry-date" datetime="2014-09-05T12:46:21+00:00">September 5, 2014</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=1379#respond"><span class="dsq-postid" data-dsqidentifier="1379 http://www.nomadiccodemonkey.com/?p=1379">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>One of the common question from people interested in Arduino or doing electronics with the Raspberry Pi is where do I get components.</p>
<p>Here is a few places that you can get your components. I will only cover local source, not sites outsite Malaysia, though they can be a good source.</p>
<ol>
<li>Jalan Pasar at Pudu. Not newbie friendly, but it is a go to place to get components, but no arduino and raspberry pi though. You need to do your research before getting stuff there.</li>
<li><a href="http://www.cytron.com.my/">Cytron</a>, their online store have a very good collection of item, from components, to tools to dev board like arduino, pic, and raspberry pi.</li>
<li><a title="myduino" href="http://myduino.com/">MyDuino</a> is a local store specialize with arduino and drone, they also sell 3d printers. These folks are very active in the local arduino community.</li>
<li><a title="Element14" href="http://my.element14.com/">Element14</a> is also a popular place for local enthusiast.</li>
<li><a title="RS Online" href="http://my.rs-online.com/web/">RS Online</a> is also another of the popular one.</li>
<li>Community site such as the <a href="https://www.facebook.com/groups/arduinomalaysia/">Arduino Malaysia</a> Facebook group on facebook occasionally have members letting their stuff go, it worth checking it out.</li>
</ol>
<p>I only been through cytron and Jalan Pasar personally, the rest just from my friend that also into electronics.</p>
<p>I hope the brief guide can be helpful</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
	</div><!-- .entry-content -->
	
	</article><!-- #post-## -->

<article id="post-1372" class="post-1372 post type-post status-publish format-standard hentry category-uncategorized">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=1372" rel="bookmark">Solving own problem</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=1372" rel="bookmark"><time class="entry-date" datetime="2014-08-15T12:20:44+00:00">August 15, 2014</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=1372#respond"><span class="dsq-postid" data-dsqidentifier="1372 http://www.nomadiccodemonkey.com/?p=1372">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>One of the best thing about a programmer is that we are able to solve own problem. In this case, I need to clean up my mess on my gmail. So I hacked a script to clean it up</p>
<p><a href="https://github.com/sweemeng/personal_gmail_script">https://github.com/sweemeng/personal_gmail_script</a></p>
	</div><!-- .entry-content -->
	
	</article><!-- #post-## -->

<article id="post-1369" class="post-1369 post type-post status-publish format-standard hentry category-linux">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=8" rel="category">linux</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=1369" rel="bookmark">IPC with named pipe</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=1369" rel="bookmark"><time class="entry-date" datetime="2013-08-17T05:01:19+00:00">August 17, 2013</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=1369#respond"><span class="dsq-postid" data-dsqidentifier="1369 http://www.nomadiccodemonkey.com/?p=1369">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>Linux user would know what is a pipe, and named &#8220;|&#8221; as the pipe character. Named pipe is actually similar, the difference is, a linux pipe persist as long as the process that uses the pipe last. But a named pipe persist even if the process have closed.</p>
<p>Why you need a named pipe? It is actually a nice way to provide IPC to 2 processes. The coolest thing of all, It is shares file semantics, i.e you can use open() and close()</p>
<p>Here is how you create and use a named pipe</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279b457589289261" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title">simple named_pipe example</span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Shell</span></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
$ mkfifo /tmp/named_pipe
$ echo "w00t" &gt; /tmp/named_pipe
# get w00t
$ cat /tmp/named_pipe
$ rm /tmp/named_pipe</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279b457589289261-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b457589289261-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279b457589289261-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b457589289261-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279b457589289261-5">5</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279b457589289261-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-r">mkfifo</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-v">tmp</span><span class="crayon-o">/</span><span class="crayon-v">named</span><span class="crayon-sy">_</span>pipe</div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b457589289261-2"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-r">echo</span><span class="crayon-h"> </span><span class="crayon-s">"w00t"</span><span class="crayon-h"> </span><span class="crayon-o">&gt;</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-v">tmp</span><span class="crayon-o">/</span><span class="crayon-v">named_pipe</span></div><div class="crayon-line" id="crayon-5eb69e279b457589289261-3"><span class="crayon-c"># get w00t</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b457589289261-4"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-r">cat</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-v">tmp</span><span class="crayon-o">/</span><span class="crayon-v">named</span><span class="crayon-sy">_</span>pipe</div><div class="crayon-line" id="crayon-5eb69e279b457589289261-5"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-r">rm</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-v">tmp</span><span class="crayon-o">/</span><span class="crayon-v">named_pipe</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0003 seconds] -->
<p>Of course you can replace cat and echo with your own process. One way this is really useful is by opening the pipe in your program.</p>
<p>This is how you write a writer</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279b460235528557" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title">Writer in python</span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Python</span></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
def writer():
    f = open("/tmp/named_pipe", "w")
    # BLOCKING
    f.write("Hello")
    # Will block reader
    f.close()
    # Release reader and now read

if __name__ == "__main__":
    writer()</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279b460235528557-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b460235528557-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279b460235528557-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b460235528557-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279b460235528557-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b460235528557-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279b460235528557-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b460235528557-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279b460235528557-9">9</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b460235528557-10">10</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279b460235528557-1"><span class="crayon-r">def</span><span class="crayon-h"> </span><span class="crayon-e">writer</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b460235528557-2"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">f</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-k ">open</span><span class="crayon-sy">(</span><span class="crayon-s">"/tmp/named_pipe"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"w"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279b460235528557-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-c"># BLOCKING</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b460235528557-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">f</span><span class="crayon-sy">.</span><span class="crayon-e">write</span><span class="crayon-sy">(</span><span class="crayon-s">"Hello"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279b460235528557-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-c"># Will block reader</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b460235528557-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">f</span><span class="crayon-sy">.</span><span class="crayon-e">close</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279b460235528557-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-c"># Release reader and now read</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b460235528557-8">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279b460235528557-9"><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">__name__</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"__main__"</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b460235528557-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">writer</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0004 seconds] -->
<p></p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279b463113213998" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title">this is the reader</span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
def reader():
    f = open("/tmp/named_pipe")
    # BLOCKING
    print f.read() 
    # Blocking until writer is closed
    f.close()

if __name__ == "__main__": 
    reader()</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279b463113213998-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b463113213998-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279b463113213998-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b463113213998-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279b463113213998-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b463113213998-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279b463113213998-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279b463113213998-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279b463113213998-9">9</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279b463113213998-1"><span class="crayon-e">def </span><span class="crayon-e">reader</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b463113213998-2"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">f</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">open</span><span class="crayon-sy">(</span><span class="crayon-s">"/tmp/named_pipe"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279b463113213998-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-p"># BLOCKING</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b463113213998-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-i">print</span><span class="crayon-h"> </span><span class="crayon-v">f</span><span class="crayon-sy">.</span><span class="crayon-e">read</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-h"> </span></div><div class="crayon-line" id="crayon-5eb69e279b463113213998-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-p"># Blocking until writer is closed</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b463113213998-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">f</span><span class="crayon-sy">.</span><span class="crayon-e">close</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279b463113213998-7">&nbsp;</div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279b463113213998-8"><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">__name__</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"__main__"</span><span class="crayon-o">:</span><span class="crayon-h"> </span></div><div class="crayon-line" id="crayon-5eb69e279b463113213998-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">reader</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0003 seconds] -->
<p>As you can see it shares semantic with file object, with open(), read(), write(), but with caveat.</p>
<ul>
<li>open() can block if it is called on one side</li>
<li>read() can block if close() is not called on the writer</li>
</ul>
<p>Here you are a simple way to do IPC on linux using file semantic.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
	</div><!-- .entry-content -->
	
	</article><!-- #post-## -->

<article id="post-1348" class="post-1348 post type-post status-publish format-standard hentry category-javascript category-python category-uncategorized tag-flask tag-html5 tag-javascript tag-python tag-socketio">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=107" rel="category">javascript</a>, <a href="http://www.nomadiccodemonkey.com/?cat=17" rel="category">python</a>, <a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=1348" rel="bookmark">Ping Pong with gevent, socket-io and flask</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=1348" rel="bookmark"><time class="entry-date" datetime="2012-11-15T03:40:26+00:00">November 15, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=1348#respond"><span class="dsq-postid" data-dsqidentifier="1348 http://www.nomadiccodemonkey.com/?p=1348">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>So recently one of my project allow me to have experience on gevent-socketio. While the code is open source, it can be complicated. Thus the example I show here, while not serious hopefully will make things easier to see.</p>
<p>You will need these dependency,</p>
<ul>
<li>gevent-socketio : <a href="https://gevent-socketio.readthedocs.org/en/latest/">http://gevent-socketio.readthedocs.org/en/latest/</a></li>
<li>socket-io-client: <a href="https://github.com/LearnBoost/socket.io-client">https://github.com/LearnBoost/socket.io-client</a></li>
<li>flask: <a href="http://flask.pocoo.org/docs/">http://flask.pocoo.org/docs/</a></li>
<li>jquery: <a href="https://jquery.com/">http://jquery.com/</a></li>
</ul>
<p>Before we can start to create a view for socket-io you will need to define the namespace to be used</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279d15e692903158" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title">Ping  Pong Namespace</span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Python</span></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
from socketio.namespace import BaseNamespace

class PingPong(BaseNamespace):
    def on_ping(self,attack):
        if attack['type'] == 'fireball':
            for i in range(10):
                self.emit('pong',{'sound':'bang!'})
        else:
            self.emit('pong',{'sound':'pong'})</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279d15e692903158-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d15e692903158-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279d15e692903158-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d15e692903158-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279d15e692903158-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d15e692903158-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279d15e692903158-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d15e692903158-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279d15e692903158-9">9</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279d15e692903158-1"><span class="crayon-st">from</span><span class="crayon-h"> </span><span class="crayon-v">socketio</span><span class="crayon-sy">.</span><span class="crayon-e">namespace </span><span class="crayon-r">import</span><span class="crayon-h"> </span><span class="crayon-e">BaseNamespace</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d15e692903158-2">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d15e692903158-3"><span class="crayon-t">class</span><span class="crayon-h"> </span><span class="crayon-e">PingPong</span><span class="crayon-sy">(</span><span class="crayon-v">BaseNamespace</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d15e692903158-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">def</span><span class="crayon-h"> </span><span class="crayon-e">on_ping</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">,</span><span class="crayon-v">attack</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d15e692903158-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">attack</span><span class="crayon-sy">[</span><span class="crayon-s">'type'</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">'fireball'</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d15e692903158-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-i">i</span><span class="crayon-h"> </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-k ">range</span><span class="crayon-sy">(</span><span class="crayon-cn">10</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d15e692903158-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-e">emit</span><span class="crayon-sy">(</span><span class="crayon-s">'pong'</span><span class="crayon-sy">,</span><span class="crayon-sy">{</span><span class="crayon-s">'sound'</span><span class="crayon-o">:</span><span class="crayon-s">'bang!'</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d15e692903158-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">else</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d15e692903158-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-e">emit</span><span class="crayon-sy">(</span><span class="crayon-s">'pong'</span><span class="crayon-sy">,</span><span class="crayon-sy">{</span><span class="crayon-s">'sound'</span><span class="crayon-o">:</span><span class="crayon-s">'pong'</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0005 seconds] -->
<p>The gevent-socketio library uses Namespace as the view logic, all the logics will be in a namespace, along with namespace, there is also Mixins that is built on top of namespace that provide extra functionality, gevent-socketio provide BroadcastMixin and RoomMixin, which is useful.</p>
<p>line 3: We create our namespace by subclassing Namespace Class</p>
<p>line 4: This is method defined by us. We prefix on_ to an event that we want to process. In this case it is the ping event. The event will be send from socketio client. The parameter attack, that is essentially the payload that we will be receiving, and we don&#8217;t need to do any conversion from json to dict, as the library handle it for us.</p>
<p>line 7 and 9: Self.emit will emit an event to the socketio client, again the dict, is the payload that will be sent, no converstion to json necessary.</p>
<p>Now we can finally define a view</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279d167401821722" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title">socket-io view</span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Python</span></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
from flask import Flask
from flask import request
from socketio import socketio_manage

app = Flask(__name__)

@app.route('/socket.io/&lt;path:remaining&gt;')
def pingpong(remaining):
    socketio_manage(request.environ,{'/pingpong':PingPong},request)
    return 'done'</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279d167401821722-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d167401821722-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279d167401821722-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d167401821722-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279d167401821722-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d167401821722-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279d167401821722-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d167401821722-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279d167401821722-9">9</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d167401821722-10">10</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279d167401821722-1"><span class="crayon-st">from</span><span class="crayon-h"> </span><span class="crayon-e">flask </span><span class="crayon-r">import</span><span class="crayon-h"> </span><span class="crayon-e">Flask</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d167401821722-2"><span class="crayon-st">from</span><span class="crayon-h"> </span><span class="crayon-e">flask </span><span class="crayon-r">import</span><span class="crayon-h"> </span><span class="crayon-e">request</span></div><div class="crayon-line" id="crayon-5eb69e279d167401821722-3"><span class="crayon-st">from</span><span class="crayon-h"> </span><span class="crayon-e">socketio </span><span class="crayon-r">import</span><span class="crayon-h"> </span><span class="crayon-e">socketio_manage</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d167401821722-4">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d167401821722-5"><span class="crayon-v">app</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">Flask</span><span class="crayon-sy">(</span><span class="crayon-v">__name__</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d167401821722-6">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d167401821722-7"><span class="crayon-sy">@</span><span class="crayon-v">app</span><span class="crayon-sy">.</span><span class="crayon-e">route</span><span class="crayon-sy">(</span><span class="crayon-s">'/socket.io/&lt;path:remaining&gt;'</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d167401821722-8"><span class="crayon-r">def</span><span class="crayon-h"> </span><span class="crayon-e">pingpong</span><span class="crayon-sy">(</span><span class="crayon-v">remaining</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d167401821722-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">socketio_manage</span><span class="crayon-sy">(</span><span class="crayon-v">request</span><span class="crayon-sy">.</span><span class="crayon-v">environ</span><span class="crayon-sy">,</span><span class="crayon-sy">{</span><span class="crayon-s">'/pingpong'</span><span class="crayon-o">:</span><span class="crayon-v">PingPong</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span><span class="crayon-v">request</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d167401821722-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-s">'done'</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0005 seconds] -->
<p>This is the view for socketio. app is just your standard flask app.</p>
<p>line 7: is the route necessary for the socketio client to connect</p>
<p>line 9: this is the same across socketio app, the difference here is the namespace &#8216;/pingpong&#8217; and the namespace PingPong, that you will need to define yourself.</p>
<p>Now to serve this guy</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279d16a360240046" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
from socketio.server import SocketIOServer

# app will be somewhere around here

def main():
    SocketIOServer(('',5000),app,resource="socket.io").serve_forever()

if __name__ == "__main__":
    main()</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279d16a360240046-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16a360240046-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279d16a360240046-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16a360240046-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279d16a360240046-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16a360240046-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279d16a360240046-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16a360240046-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279d16a360240046-9">9</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279d16a360240046-1"><span class="crayon-e">from </span><span class="crayon-v">socketio</span><span class="crayon-sy">.</span><span class="crayon-e">server </span><span class="crayon-e">import </span><span class="crayon-v">SocketIOServer</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16a360240046-2">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d16a360240046-3"><span class="crayon-p"># app will be somewhere around here</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16a360240046-4">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d16a360240046-5"><span class="crayon-e">def </span><span class="crayon-e">main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16a360240046-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">SocketIOServer</span><span class="crayon-sy">(</span><span class="crayon-sy">(</span><span class="crayon-s">''</span><span class="crayon-sy">,</span><span class="crayon-cn">5000</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-v">app</span><span class="crayon-sy">,</span><span class="crayon-v">resource</span><span class="crayon-o">=</span><span class="crayon-s">"socket.io"</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">serve_forever</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d16a360240046-7">&nbsp;</div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16a360240046-8"><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">__name__</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"__main__"</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d16a360240046-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0003 seconds] -->
<p>line 6: this will be the line that serve the app. It will serve all the views include the non-socketio one.</p>
<p>I will skip the view to render the main page and the html, I will focus on the javascript alone.</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279d16c580306978" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title">the javascript code</span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">JavaScript</span></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
$(function(){
        var socket = io.connect('/pingpong');
        socket.on('pong',function(data){
            console.log('pong')
            console.log(data)
            $('#result').append(data.sound + '&lt;br/&gt;');
        });
        $('.ping').click(function(event){
            event.preventDefault();
            attack = $(this).data('attack');
            console.log(attack);
            socket.emit('ping',{'type':attack}) 
        }); 
    });</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-9">9</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-10">10</div><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-11">11</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-12">12</div><div class="crayon-num" data-line="crayon-5eb69e279d16c580306978-13">13</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d16c580306978-14">14</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279d16c580306978-1"><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-t">function</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-2"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-t">var</span><span class="crayon-h"> </span><span class="crayon-v">socket</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">io</span><span class="crayon-sy">.</span><span class="crayon-e">connect</span><span class="crayon-sy">(</span><span class="crayon-s">'/pingpong'</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-5eb69e279d16c580306978-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">socket</span><span class="crayon-sy">.</span><span class="crayon-e">on</span><span class="crayon-sy">(</span><span class="crayon-s">'pong'</span><span class="crayon-sy">,</span><span class="crayon-t">function</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">console</span><span class="crayon-sy">.</span><span class="crayon-e">log</span><span class="crayon-sy">(</span><span class="crayon-s">'pong'</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d16c580306978-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">console</span><span class="crayon-sy">.</span><span class="crayon-e">log</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-s">'#result'</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">append</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">.</span><span class="crayon-v">sound</span><span class="crayon-h"> </span><span class="crayon-o">+</span><span class="crayon-h"> </span><span class="crayon-s">'&lt;br/&gt;'</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-5eb69e279d16c580306978-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-s">'.ping'</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">click</span><span class="crayon-sy">(</span><span class="crayon-t">function</span><span class="crayon-sy">(</span><span class="crayon-v">event</span><span class="crayon-sy">)</span><span class="crayon-sy">{</span></div><div class="crayon-line" id="crayon-5eb69e279d16c580306978-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">event</span><span class="crayon-sy">.</span><span class="crayon-e">preventDefault</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">attack</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-r">this</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">data</span><span class="crayon-sy">(</span><span class="crayon-s">'attack'</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-5eb69e279d16c580306978-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">console</span><span class="crayon-sy">.</span><span class="crayon-e">log</span><span class="crayon-sy">(</span><span class="crayon-v">attack</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">socket</span><span class="crayon-sy">.</span><span class="crayon-e">emit</span><span class="crayon-sy">(</span><span class="crayon-s">'ping'</span><span class="crayon-sy">,</span><span class="crayon-sy">{</span><span class="crayon-s">'type'</span><span class="crayon-o">:</span><span class="crayon-v">attack</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span><span class="crayon-h"> </span></div><div class="crayon-line" id="crayon-5eb69e279d16c580306978-13"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span><span class="crayon-h"> </span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d16c580306978-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0007 seconds] -->
<p>line 2: This is how you define a socket io.connect(&#8216;/namespace&#8217;)</p>
<p>line 10: We bind a javascript click an event, to send an event we use socket.emit(event,data). data will be a javascript object, event will be a string, notice the on_ping method on the Namespace we define on top.</p>
<p>line 3: As the socketio server emit a pong event, this will event handler and do something with it in callback. Again don&#8217;t worry about conversion, the data is converted into a javascript object.</p>
<p>Hopefully this will make things slightly clearer. Btw the example on <a href="https://github.com/sweemeng/flask-socketio-pingpong">github</a>.</p>
<p>&nbsp;</p>
	</div><!-- .entry-content -->
	
	<footer class="entry-meta"><span class="tag-links"><a href="http://www.nomadiccodemonkey.com/?tag=flask" rel="tag">flask</a><a href="http://www.nomadiccodemonkey.com/?tag=html5" rel="tag">html5</a><a href="http://www.nomadiccodemonkey.com/?tag=javascript" rel="tag">javascript</a><a href="http://www.nomadiccodemonkey.com/?tag=python" rel="tag">python</a><a href="http://www.nomadiccodemonkey.com/?tag=socketio" rel="tag">socketio</a></span></footer></article><!-- #post-## -->

<article id="post-966" class="post-966 post type-post status-publish format-standard hentry category-uncategorized">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=966" rel="bookmark">List on Tech Initiative for Good in Malaysia</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=966" rel="bookmark"><time class="entry-date" datetime="2012-09-09T05:32:59+00:00">September 9, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=966#respond"><span class="dsq-postid" data-dsqidentifier="966 http://www.nomadiccodemonkey.com/?p=606">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>I have been involved in Sinar Project for some time. Along the way we have found similar initiative, different approach but using tech for doing  good thing in general. Some are commercial, some are voluntary citizen initiative.</p>
<p>None of these are with sinar project.</p>
<ol>
<li>Jom Pantau is ushahidi installation, for reporting election issue in Malaysia <a href="http://pru13.info/ushahidi/">http://pru13.info/ushahidi/</a></li>
<li>An election websites <a href="http://backup.myaddress.com.my/">http://backup.myaddress.com.my/</a></li>
<li>Malaysia crime <a href="http://www.malaysiacrime.com/">http://www.malaysiacrime.com/</a></li>
<li>Do something good for linking volunteers to organization <a href="http://beta.dosomething.gd/">http://beta.dosomething.gd/</a></li>
<li>eparliment</li>
</ol>
<p>Project sinar project that we are currently working on</p>
<ol>
<li>Malysian Representation <a href="http://reps.sinarproject.org/">http://reps.sinarproject.org/</a></li>
<li>The api from reps project. <a href="https://github.com/Sinar/Zelus">https://github.com/Sinar/Zelus</a></li>
<li>Curruption <a href="http://accountable.sinarproject.org/">http://accountable.sinarproject.org/</a></li>
<li>Billwatcher.</li>
</ol>
<p>Got a feeling we going to have more on the list.</p>
<p>&nbsp;</p>
	</div><!-- .entry-content -->
	
	</article><!-- #post-## -->

<article id="post-598" class="post-598 post type-post status-publish format-standard hentry category-uncategorized tag-books">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=598" rel="bookmark">Reading Data Analysis With Open Source Tools</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=598" rel="bookmark"><time class="entry-date" datetime="2012-08-07T14:27:11+00:00">August 7, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=598#respond"><span class="dsq-postid" data-dsqidentifier="598 http://www.nomadiccodemonkey.com/?p=598">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>&nbsp;</p>
<p>&nbsp;</p>
<figure id="attachment_600" aria-describedby="caption-attachment-600" style="width: 1224px" class="wp-caption aligncenter"><a href="http://www.nomadiccodemonkey.com/wp-content/uploads/2012/08/2012-07-31-10.45.22.jpg"><img class="size-full wp-image-600" title="Data Analysis with Open Source Tools" src="http://www.nomadiccodemonkey.com/wp-content/uploads/2012/08/2012-07-31-10.45.22.jpg" alt="Data Analysis with Open Source Tools" width="1224" height="1632" /></a><figcaption id="caption-attachment-600" class="wp-caption-text">Data Analysis with Open Source Tools</figcaption></figure>
<p>Recently I have been reading the book Data Analysis with Open Source Tools, by Philipp K. Janert. This is a book for anyone that is working with Data. Partly because of the big data buzz, partly is the work I do in Sinar Project. But this is not a book on big data, just data analysis in general.</p>
<p>Unlike other book that deals with data, this don&#8217;t cover specific tools, rather use tools as a example, and this books covers a few. But this book focuses on experiences and methods of doing data analysis.</p>
<p>The book have 18 chapter, covers a variety of topic, from statistics, to simulation, clustering etc. Each with enough theory to understand, enough insights coming from the authors experience, enough hands on from demo for us to pick up from there.</p>
<p>While this book don&#8217;t covers tools comprehensively, but the method, insights in this book make it worth keeping as a reference for doing data analysis.</p>
	</div><!-- .entry-content -->
	
	<footer class="entry-meta"><span class="tag-links"><a href="http://www.nomadiccodemonkey.com/?tag=books" rel="tag">books</a></span></footer></article><!-- #post-## -->

<article id="post-590" class="post-590 post type-post status-publish format-standard hentry category-uncategorized tag-python">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=590" rel="bookmark">Adventure in Overriding Python Str</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=590" rel="bookmark"><time class="entry-date" datetime="2012-08-05T08:24:38+00:00">August 5, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=590#comments"><span class="dsq-postid" data-dsqidentifier="590 http://www.nomadiccodemonkey.com/?p=590">2 Comments</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>Recently I have given a project where we are overriding the python str object, I rather not say the reason because it is job related. But the process of it is pretty general, and is pretty interesting.</p>
<p>So here is an example.</p><!-- Crayon Syntax Highlighter v_2.7.2_beta -->

		<div id="crayon-5eb69e279d8f6644104055" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
		
			<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span>
			<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div></div></div>
			<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
			<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
import re

class BleepedString(str):

    def __new__(cls, data=''):
        """
            this will forced inherited object to return new object
            assigned value in data must be bleeped
        """
        data = cls.bleep(data)
        new_obj = str.__new__(cls,data)
        return new_obj

    def __iadd__(self,data):
        return self.__add__(data)

    def __add__(self,data):
        data = self.bleep(data)
        return super(BleepedString,self).__add__(data)

    def __str__(self):
        data = super(BleepedString,self).__str__()
        return self.bleep(data)

    def __repr__(self):
        data = super(BleepedString,self).__repr__()
        return self.bleep(data)

    @classmethod
    def bleep(cls, data):
        if not type(data) == str or type(data) == unicode:
            data = str(data)
        pattern = r'nsfw_word' 
        compiled = re.compile(pattern,re.MULTILINE)
        data = re.sub(compiled,'bleep',data)
        return data</textarea></div>
			<div class="crayon-main" style="">
				<table class="crayon-table">
					<tr class="crayon-row">
				<td class="crayon-nums " data-settings="show">
					<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-2">2</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-4">4</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-6">6</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-8">8</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-9">9</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-10">10</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-11">11</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-12">12</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-13">13</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-14">14</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-15">15</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-16">16</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-17">17</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-18">18</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-19">19</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-20">20</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-21">21</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-22">22</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-23">23</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-24">24</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-25">25</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-26">26</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-27">27</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-28">28</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-29">29</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-30">30</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-31">31</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-32">32</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-33">33</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-34">34</div><div class="crayon-num" data-line="crayon-5eb69e279d8f6644104055-35">35</div><div class="crayon-num crayon-striped-num" data-line="crayon-5eb69e279d8f6644104055-36">36</div></div>
				</td>
						<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-1"><span class="crayon-e">import </span><span class="crayon-e">re</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-2">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-3"><span class="crayon-t">class</span><span class="crayon-h"> </span><span class="crayon-e">BleepedString</span><span class="crayon-sy">(</span><span class="crayon-v">str</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-4">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">__new__</span><span class="crayon-sy">(</span><span class="crayon-v">cls</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">data</span><span class="crayon-o">=</span><span class="crayon-s">''</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">""</span><span class="crayon-s">"</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-7"><span class="crayon-s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this will forced inherited object to return new object</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-8"><span class="crayon-s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assigned value in data must be bleeped</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-9"><span class="crayon-s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"</span><span class="crayon-s">""</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">data</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">cls</span><span class="crayon-sy">.</span><span class="crayon-e">bleep</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">new_obj</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">str</span><span class="crayon-sy">.</span><span class="crayon-e">__new__</span><span class="crayon-sy">(</span><span class="crayon-v">cls</span><span class="crayon-sy">,</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">new_obj</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-13">&nbsp;</div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-14"><span class="crayon-e">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">__iadd__</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">,</span><span class="crayon-v">data</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-15"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-e">__add__</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-16">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">__add__</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">,</span><span class="crayon-v">data</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-18"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">data</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-e">bleep</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-19"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-r">super</span><span class="crayon-sy">(</span><span class="crayon-v">BleepedString</span><span class="crayon-sy">,</span><span class="crayon-r">self</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">__add__</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-20">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-21"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">__str__</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-22"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">data</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-r">super</span><span class="crayon-sy">(</span><span class="crayon-v">BleepedString</span><span class="crayon-sy">,</span><span class="crayon-r">self</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">__str__</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-23"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-e">bleep</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-24">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-25"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">__repr__</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-26"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">data</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-r">super</span><span class="crayon-sy">(</span><span class="crayon-v">BleepedString</span><span class="crayon-sy">,</span><span class="crayon-r">self</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">__repr__</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-27"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-e">bleep</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-28">&nbsp;</div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-29"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">@</span><span class="crayon-e">classmethod</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-30"><span class="crayon-e">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">bleep</span><span class="crayon-sy">(</span><span class="crayon-v">cls</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">data</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-31"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-st">not</span><span class="crayon-h"> </span><span class="crayon-e">type</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-e">str </span><span class="crayon-st">or</span><span class="crayon-h"> </span><span class="crayon-e">type</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-v">unicode</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-32"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">data</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">str</span><span class="crayon-sy">(</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-33"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">pattern</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-i">r</span><span class="crayon-s">'nsfw_word'</span><span class="crayon-h"> </span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-34"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">compiled</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">re</span><span class="crayon-sy">.</span><span class="crayon-e">compile</span><span class="crayon-sy">(</span><span class="crayon-v">pattern</span><span class="crayon-sy">,</span><span class="crayon-v">re</span><span class="crayon-sy">.</span><span class="crayon-v">MULTILINE</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5eb69e279d8f6644104055-35"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">data</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">re</span><span class="crayon-sy">.</span><span class="crayon-e">sub</span><span class="crayon-sy">(</span><span class="crayon-v">compiled</span><span class="crayon-sy">,</span><span class="crayon-s">'bleep'</span><span class="crayon-sy">,</span><span class="crayon-v">data</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-5eb69e279d8f6644104055-36"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-v">data</span></div></div></td>
					</tr>
				</table>
			</div>
		</div>
<!-- [Format Time: 0.0013 seconds] -->
<p></p>
<p class="brush: python; gutter: true">A few thing to take note here.</p>
<ol>
<li>Notice that there is a <em>__new__</em> method? In python object lifecycle, the first thing to be called is actually <em>__new__</em> not <em>__init__</em>. <em>__new__</em> will choose whether whether to replace <em>__init__</em> or use a new one. In this case, I set the current object <em>cls</em> to <em>str</em>, with value bleeped</li>
<li>Now if object is not setup in <em>__new__</em> yet, how do object access the bleep method? Introducing, classmethod. Classmethod is a method the bind to a class, not an object. This is useful if you want to do call a function before a class is initiated.</li>
<li>Classmethod binds to the child class, not the parent class it inherited from, and you need the first parameter to be a class. It can be set with a <em>@classmethod</em> on a method</li>
<li>Now because we also want the string to be appended to <em>BleepedString</em> object, to also be bleeped, so we need to override <em>__add__</em>, so when string appended via + operator, will also be bleeped. Interestingly <em>__iadd__</em> is not inherited, so I need to add <em>__iadd__</em> method too, so that I can do <em>+=</em></li>
<li>Notice that inside <em>__add__</em> I use <em>bleep</em> method like a normal method. That is the reason is set a <em>@classmethod</em> decorator in <em>bleep</em> method, I need the method to be available without need to be instantiated, while able to use it like a normal method in a object.</li>
<li>Actually just override <em>__add__</em> and <em>__iadd__</em> is not enough to override the <em>str</em> behavior. Because the parent class <em>str</em> uses <em>__repr__</em> to provide value to be used in a <em>+</em> and += operation, which is why I override <em>__repr__</em> method, by replacing the return value to bleeped string.</li>
<li>Then we need to override <em>__str__</em> so that it return a bleeped string.</li>
</ol>
<p>This is just a modified example what I used in my work, and have a very different and useful function. But it capture the same idea, overriding the default string behavior and return value.</p>
<p>Cheers!</p>
	</div><!-- .entry-content -->
	
	<footer class="entry-meta"><span class="tag-links"><a href="http://www.nomadiccodemonkey.com/?tag=python" rel="tag">python</a></span></footer></article><!-- #post-## -->

<article id="post-585" class="post-585 post type-post status-publish format-standard hentry category-uncategorized">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=585" rel="bookmark">Long time no post</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=585" rel="bookmark"><time class="entry-date" datetime="2012-07-15T14:53:50+00:00">July 15, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=585#respond"><span class="dsq-postid" data-dsqidentifier="585 http://www.nomadiccodemonkey.com/?p=585">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>A few thing happens in between,</p>
<ol>
<li>Construction Industry Development Board dataset have been release, you can find it <a href="http://sinarproject.org/projects/construction-industry-development-board-cidb-database">here</a>.</li>
<li>CPB is not dead, and the survey is over for long time, in which I too participate. Waiting for the parliament to see how.</li>
<li>I have join <a href="http://www.julython.org/sweemeng/">Julython</a> with a new <a href="http://www.julython.org/projects/gh-sweemeng-scrapedump/">project</a>.</li>
<li>Python Meetup Malaysia coming next 2 week. And still going on</li>
<li>Join pycon, and realize that I am still interested in big data.</li>
<li>Join Super Happy Dev House, know some very awesome people there.</li>
</ol>
<div><span style="font-size: medium;"><span style="line-height: 24px;">Btw my project <a href="http://sinarproject.org/">sinarproject</a> begin to be known to more people. I most probably juggling between day job and this. So will be more busy doing than actually blogging. </span></span></div>
<p>&nbsp;</p>
	</div><!-- .entry-content -->
	
	</article><!-- #post-## -->

<article id="post-567" class="post-567 post type-post status-publish format-standard hentry category-uncategorized">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=567" rel="bookmark">Python Malaysia Meetup April 2012: The Report</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=567" rel="bookmark"><time class="entry-date" datetime="2012-04-23T14:46:58+00:00">April 23, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=567#respond"><span class="dsq-postid" data-dsqidentifier="567 http://www.nomadiccodemonkey.com/?p=567">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p>So I have organized a python Malaysia meetup in <a href="http://hackerspace.my/">hackerspacekl</a> last weekend. It is a good crowd, within we have developers that uses Django, Bottle and Plone to share their experience in using their respective technology stack.</p>
<p>The group is a diverse one, from experienced developer using python for sometime, to new python user. We have the usual introduction, then we have introduction to Python Malaysia.</p>
<p>Then a talk by Yours Truly, on experience of using bottle micro framework and pyes.</p>
<p><iframe src="https://www.slideshare.net/slideshow/embed_code/12640419" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> </p>
<div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/sweemenghacker/how-we-use-bottle-and-elasticsearch" title="How we use Bottle and Elasticsearch" target="_blank">How we use Bottle and Elasticsearch</a> </strong> from <strong><a href="http://www.slideshare.net/sweemenghacker" target="_blank">swee meng ng</a></strong> </div>
<p>&nbsp;</p>
<p>Then have a talk on Mezzanine by renyi khor</p>
<p><iframe src="https://www.slideshare.net/slideshow/embed_code/12637094" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> </p>
<div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/renyiace/why-i-liked-mezzanine-cms-12637094" title="Why I liked Mezzanine CMS" target="_blank">Why I liked Mezzanine CMS</a> </strong> from <strong><a href="http://www.slideshare.net/renyiace" target="_blank">Renyi Khor</a></strong> </div>
<p>&nbsp;</p>
<p>And Felix shows us how one can use to use tornadio to provide socket.io for django apps. Which is awesome, actually. Again no slide, but the repo is below</p>
<p><a href="https://github.com/felixleong/tornadio-with-django">https://github.com/felixleong/tornadio-with-django</a></p>
<p>and Finally a talk by Khairil Yussoff, which is about Plone Dexterity framework, and also plone development in general. He don&#8217;t have slides, but he did hands on demo on plone development and how things work.</p>
<p>Then in between we have some networking session. Which is good, because this meetup is not just about Python, it is about the people that uses or want to try/use it. We have everybody not just the presenter that share their experience, which is awesome.</p>
<p>In the end of the day, this is a good event(I hope). But by July, python.my will finally be updated, things will gone more smoothly for us.</p>
<p>Notes: A few times running an event I still can&#8217;t get it right. A few thing is missing is, video, proper photo, groups shots, etc. Maybe I should add a list.</p>
<p>p.s The next meetup will be on May 26, in MindValley, just beside Bangsar LRT station. Detail is <a href="https://www.eventbrite.com/event/3414166865">http://www.eventbrite.com/event/3414166865</a></p>
<p>[pe2-gallery class=&#8221;alignleft&#8221; ] <a class="thickbox" title="IMG_20120421_151710.jpg" href="https://lh5.ggpht.com/-IiexOUzEY9g/T5JkrytDB_I/AAAAAAAACrg/IFErhStnzwk/IMG_20120421_151710.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_151710.jpg" src="https://lh5.ggpht.com/-IiexOUzEY9g/T5JkrytDB_I/AAAAAAAACrg/IFErhStnzwk/s150-c/IMG_20120421_151710.jpg" alt="IMG_20120421_151710.jpg" width="150" height="150" /></a><a class="thickbox" title="IMG_20120421_151700.jpg" href="https://lh4.ggpht.com/-7cxk79g48Z8/T5Jkr6O2WWI/AAAAAAAACrg/5uUOJHzXFIs/IMG_20120421_151700.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_151700.jpg" src="https://lh4.ggpht.com/-7cxk79g48Z8/T5Jkr6O2WWI/AAAAAAAACrg/5uUOJHzXFIs/s150-c/IMG_20120421_151700.jpg" alt="IMG_20120421_151700.jpg" width="150" height="150" /></a><a class="thickbox" title="IMG_20120421_151644.jpg" href="https://lh3.ggpht.com/-6BrX2go_tlg/T5Jkr2OFkyI/AAAAAAAACrg/GYKFcE7LOvo/IMG_20120421_151644.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_151644.jpg" src="https://lh3.ggpht.com/-6BrX2go_tlg/T5Jkr2OFkyI/AAAAAAAACrg/GYKFcE7LOvo/s150-c/IMG_20120421_151644.jpg" alt="IMG_20120421_151644.jpg" width="150" height="150" /></a><a class="thickbox" title="IMG_20120421_151634.jpg" href="https://lh6.ggpht.com/-_TcLDnaOqLw/T5Jkr5Sg8OI/AAAAAAAACrg/NAbi9ZOg5nI/IMG_20120421_151634.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_151634.jpg" src="https://lh6.ggpht.com/-_TcLDnaOqLw/T5Jkr5Sg8OI/AAAAAAAACrg/NAbi9ZOg5nI/s150-c/IMG_20120421_151634.jpg" alt="IMG_20120421_151634.jpg" width="150" height="150" /></a><a class="thickbox" title="IMG_20120421_151459.jpg" href="https://lh3.ggpht.com/-kElMwbmoEj4/T5Jkr1lljMI/AAAAAAAACrg/c6MInV_oIiw/IMG_20120421_151459.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_151459.jpg" src="https://lh3.ggpht.com/-kElMwbmoEj4/T5Jkr1lljMI/AAAAAAAACrg/c6MInV_oIiw/s150-c/IMG_20120421_151459.jpg" alt="IMG_20120421_151459.jpg" width="150" height="150" /></a><a class="thickbox" title="IMG_20120421_151453.jpg" href="https://lh3.ggpht.com/-G36vLz3QSgo/T5JkryxFGsI/AAAAAAAACrg/so9L_1tcegI/IMG_20120421_151453.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_151453.jpg" src="https://lh3.ggpht.com/-G36vLz3QSgo/T5JkryxFGsI/AAAAAAAACrg/so9L_1tcegI/s150-c/IMG_20120421_151453.jpg" alt="IMG_20120421_151453.jpg" width="150" height="150" /></a><a class="thickbox" title="IMG_20120421_132859.jpg" href="https://lh4.ggpht.com/-3gw3aftTYxQ/T5Jkr9LSDaI/AAAAAAAACrg/Ff0XNuoHAiQ/IMG_20120421_132859.jpg" rel="4f9568bcb7efd"><img class="alignleft" title="IMG_20120421_132859.jpg" src="https://lh4.ggpht.com/-3gw3aftTYxQ/T5Jkr9LSDaI/AAAAAAAACrg/Ff0XNuoHAiQ/s150-c/IMG_20120421_132859.jpg" alt="IMG_20120421_132859.jpg" width="150" height="150" /></a>[/pe2-gallery]</p>
<p>&nbsp;</p>
	</div><!-- .entry-content -->
	
	</article><!-- #post-## -->

<article id="post-563" class="post-563 post type-post status-publish format-standard hentry category-uncategorized tag-cpb2011 tag-rant">
	
	<header class="entry-header">
				<div class="entry-meta">
			<span class="cat-links"><a href="http://www.nomadiccodemonkey.com/?cat=1" rel="category">Uncategorized</a></span>
		</div>
		<h1 class="entry-title"><a href="http://www.nomadiccodemonkey.com/?p=563" rel="bookmark">Thus The Bill is dropped..For now</a></h1>
		<div class="entry-meta">
			<span class="entry-date"><a href="http://www.nomadiccodemonkey.com/?p=563" rel="bookmark"><time class="entry-date" datetime="2012-04-18T06:43:20+00:00">April 18, 2012</time></a></span> <span class="byline"><span class="author vcard"><a class="url fn n" href="http://www.nomadiccodemonkey.com/?author=1" rel="author">sweemeng</a></span></span>			<span class="comments-link"><a href="http://www.nomadiccodemonkey.com/?p=563#respond"><span class="dsq-postid" data-dsqidentifier="563 http://www.nomadiccodemonkey.com/?p=563">Leave a comment</span></a></span>
					</div><!-- .entry-meta -->
	</header><!-- .entry-header -->

		<div class="entry-content">
		<p><a href="http://www.themalaysianinsider.com/malaysia/article/putrajaya-washes-hands-of-computing-bill-wants-industry-to-fix-it">http://www.themalaysianinsider.com/malaysia/article/putrajaya-washes-hands-of-computing-bill-wants-industry-to-fix-it</a></p>
<p>As from the link above, the Computing Professional Bill is dropped for now, asking for the industry to sort it out first. The war on it is not quite ended. One reason(or excuse depends on which side you pick) of the existence of this bill is the dropping of quality of IT professional in Malaysia, and the quality of project I suspect. Registering people will definitely not helping in bringing up quality.</p>
<p>If one of the measurement of quality is how much we knows. Then browsing the Malaysian job sites, I come to the conclusion that we don&#8217;t know that much. Almost all job revolve around .net and php, with a few php and c/c++. Yet we knows that the industry is more than that. I mean where is the job on python, ruby and rails or node.js, where the job for CMS&#8217;es?</p>
<p>Does it mean that the industry in Malaysia don&#8217;t know about it? Gone to local tech meet up, only a few that use stuff that is not PHP and .net. When people develop a buzz in nosql, or node or devops etc. Where is the Malaysian? Are there only that few people will blog about this? Are there only that few people that can go to the meetup, join communities? Are there only that few people in this neighbourhood that cares about this?</p>
<p>Maybe the real problem in IT in Malaysia, it is really just that most of the people involve in IT in Malaysia, don&#8217;t care. That even with help of a legislation, it doesn&#8217;t help improve it, but only to make things worst.</p>
<p>p.s This is very programmer specific, I apologize. But this is the group of people I have seen the most.</p>
<p>p.p.s Yes I know hack weekend exist, but there is only one hackathon in the whole Malaysia?</p>
	</div><!-- .entry-content -->
	
	<footer class="entry-meta"><span class="tag-links"><a href="http://www.nomadiccodemonkey.com/?tag=cpb2011" rel="tag">cpb2011</a><a href="http://www.nomadiccodemonkey.com/?tag=rant" rel="tag">rant</a></span></footer></article><!-- #post-## -->
		<nav class="navigation paging-navigation" role="navigation">
		<h1 class="screen-reader-text">Posts navigation</h1>
		<div class="pagination loop-pagination">
			<span aria-current="page" class="page-numbers current">1</span>
<a class="page-numbers" href="http://www.nomadiccodemonkey.com/feed/?paged=2">2</a>
<span class="page-numbers dots">&hellip;</span>
<a class="page-numbers" href="http://www.nomadiccodemonkey.com/feed/?paged=40">40</a>
<a class="next page-numbers" href="http://www.nomadiccodemonkey.com/feed/?paged=2">Next &rarr;</a>		</div><!-- .pagination -->
	</nav><!-- .navigation -->
	
		</div><!-- #content -->
	</div><!-- #primary -->
	</div><!-- #main-content -->

<div id="secondary">
		<h2 class="site-description">Just another WordPress site</h2>
	
	
		<div id="primary-sidebar" class="primary-sidebar widget-area" role="complementary">
		<aside id="search-2" class="widget widget_search"><form role="search" method="get" class="search-form" action="http://www.nomadiccodemonkey.com/">
				<label>
					<span class="screen-reader-text">Search for:</span>
					<input type="search" class="search-field" placeholder="Search &hellip;" value="" name="s" />
				</label>
				<input type="submit" class="search-submit" value="Search" />
			</form></aside>		<aside id="recent-posts-2" class="widget widget_recent_entries">		<h1 class="widget-title">Recent Posts</h1>		<ul>
											<li>
					<a href="http://www.nomadiccodemonkey.com/?p=1379">Where can A Malaysian get Electronics Components</a>
									</li>
											<li>
					<a href="http://www.nomadiccodemonkey.com/?p=1372">Solving own problem</a>
									</li>
											<li>
					<a href="http://www.nomadiccodemonkey.com/?p=1369">IPC with named pipe</a>
									</li>
											<li>
					<a href="http://www.nomadiccodemonkey.com/?p=1348">Ping Pong with gevent, socket-io and flask</a>
									</li>
											<li>
					<a href="http://www.nomadiccodemonkey.com/?p=966">List on Tech Initiative for Good in Malaysia</a>
									</li>
					</ul>
		</aside><aside id="recent-comments-2" class="widget widget_recent_comments"><h1 class="widget-title">Recent Comments</h1><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href="https://www.facebook.com/profile.php?id=100003459773353" rel='external nofollow ugc' class='url'>Aziz</a></span> on <a href="http://www.nomadiccodemonkey.com/?p=31#comment-274">My Post On Robots Making</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://github.com/wrightrocket/' rel='external nofollow ugc' class='url'>Keith Wright</a></span> on <a href="http://www.nomadiccodemonkey.com/?p=590#comment-228">Adventure in Overriding Python Str</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://github.com/wrightrocket/' rel='external nofollow ugc' class='url'>Keith Wright</a></span> on <a href="http://www.nomadiccodemonkey.com/?p=590#comment-227">Adventure in Overriding Python Str</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://www.nomadiccodemonkey.com/2012/02/12/android-interface-with-adk-the-arduino-part/' rel='external nofollow ugc' class='url'>Android Interface with ADK: The Arduino Part | Nomadic Code Monkey</a></span> on <a href="http://www.nomadiccodemonkey.com/?p=445#comment-212">Android Interface With ADK: The Android Part</a></li><li class="recentcomments"><span class="comment-author-link"><a href="https://www.blogger.com/profile/14817270953353756568" rel='external nofollow ugc' class='url'>sweemeng ng</a></span> on <a href="http://www.nomadiccodemonkey.com/?p=13#comment-106">Rooting HTC Desire HD on 64bit Linux Mint</a></li></ul></aside><aside id="archives-2" class="widget widget_archive"><h1 class="widget-title">Archives</h1>		<ul>
				<li><a href='http://www.nomadiccodemonkey.com/?m=201409'>September 2014</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201408'>August 2014</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201308'>August 2013</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201211'>November 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201209'>September 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201208'>August 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201207'>July 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201204'>April 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201203'>March 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201202'>February 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201201'>January 2012</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201112'>December 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201111'>November 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201110'>October 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201109'>September 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201108'>August 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201106'>June 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201105'>May 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201103'>March 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201102'>February 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201101'>January 2011</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201012'>December 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201011'>November 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201010'>October 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201009'>September 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201008'>August 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201007'>July 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201006'>June 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201005'>May 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201004'>April 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201003'>March 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201002'>February 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=201001'>January 2010</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200912'>December 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200911'>November 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200910'>October 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200909'>September 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200908'>August 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200907'>July 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200906'>June 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200905'>May 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200904'>April 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200903'>March 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200902'>February 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200901'>January 2009</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200812'>December 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200811'>November 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200810'>October 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200809'>September 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200808'>August 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200807'>July 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200806'>June 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200805'>May 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200804'>April 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200803'>March 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200802'>February 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200801'>January 2008</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200712'>December 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200711'>November 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200710'>October 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200709'>September 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200708'>August 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200707'>July 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200705'>May 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200704'>April 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200703'>March 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200701'>January 2007</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200610'>October 2006</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200609'>September 2006</a></li>
	<li><a href='http://www.nomadiccodemonkey.com/?m=200608'>August 2006</a></li>
		</ul>
			</aside><aside id="categories-2" class="widget widget_categories"><h1 class="widget-title">Categories</h1>		<ul>
				<li class="cat-item cat-item-39"><a href="http://www.nomadiccodemonkey.com/?cat=39">#mosc2010</a>
</li>
	<li class="cat-item cat-item-77"><a href="http://www.nomadiccodemonkey.com/?cat=77">adobe air</a>
</li>
	<li class="cat-item cat-item-9"><a href="http://www.nomadiccodemonkey.com/?cat=9">android</a>
</li>
	<li class="cat-item cat-item-56"><a href="http://www.nomadiccodemonkey.com/?cat=56">api</a>
</li>
	<li class="cat-item cat-item-42"><a href="http://www.nomadiccodemonkey.com/?cat=42">april fools</a>
</li>
	<li class="cat-item cat-item-4"><a href="http://www.nomadiccodemonkey.com/?cat=4">arduino</a>
</li>
	<li class="cat-item cat-item-67"><a href="http://www.nomadiccodemonkey.com/?cat=67">barcamp</a>
</li>
	<li class="cat-item cat-item-64"><a href="http://www.nomadiccodemonkey.com/?cat=64">barcampjb</a>
</li>
	<li class="cat-item cat-item-40"><a href="http://www.nomadiccodemonkey.com/?cat=40">barcampkl</a>
</li>
	<li class="cat-item cat-item-41"><a href="http://www.nomadiccodemonkey.com/?cat=41">barcampmalaysia</a>
</li>
	<li class="cat-item cat-item-90"><a href="http://www.nomadiccodemonkey.com/?cat=90">bash</a>
</li>
	<li class="cat-item cat-item-93"><a href="http://www.nomadiccodemonkey.com/?cat=93">beos</a>
</li>
	<li class="cat-item cat-item-82"><a href="http://www.nomadiccodemonkey.com/?cat=82">bluetooth</a>
</li>
	<li class="cat-item cat-item-85"><a href="http://www.nomadiccodemonkey.com/?cat=85">broadband</a>
</li>
	<li class="cat-item cat-item-106"><a href="http://www.nomadiccodemonkey.com/?cat=106">chart</a>
</li>
	<li class="cat-item cat-item-60"><a href="http://www.nomadiccodemonkey.com/?cat=60">community</a>
</li>
	<li class="cat-item cat-item-97"><a href="http://www.nomadiccodemonkey.com/?cat=97">computer history</a>
</li>
	<li class="cat-item cat-item-19"><a href="http://www.nomadiccodemonkey.com/?cat=19">Computing Profession Act 2011</a>
</li>
	<li class="cat-item cat-item-11"><a href="http://www.nomadiccodemonkey.com/?cat=11">Computing Profession Board 2011</a>
</li>
	<li class="cat-item cat-item-100"><a href="http://www.nomadiccodemonkey.com/?cat=100">database</a>
</li>
	<li class="cat-item cat-item-102"><a href="http://www.nomadiccodemonkey.com/?cat=102">databse</a>
</li>
	<li class="cat-item cat-item-96"><a href="http://www.nomadiccodemonkey.com/?cat=96">desktop</a>
</li>
	<li class="cat-item cat-item-43"><a href="http://www.nomadiccodemonkey.com/?cat=43">dfd</a>
</li>
	<li class="cat-item cat-item-38"><a href="http://www.nomadiccodemonkey.com/?cat=38">django</a>
</li>
	<li class="cat-item cat-item-66"><a href="http://www.nomadiccodemonkey.com/?cat=66">drm</a>
</li>
	<li class="cat-item cat-item-74"><a href="http://www.nomadiccodemonkey.com/?cat=74">ebooks</a>
</li>
	<li class="cat-item cat-item-62"><a href="http://www.nomadiccodemonkey.com/?cat=62">eeepc</a>
</li>
	<li class="cat-item cat-item-29"><a href="http://www.nomadiccodemonkey.com/?cat=29">events</a>
</li>
	<li class="cat-item cat-item-79"><a href="http://www.nomadiccodemonkey.com/?cat=79">facebook</a>
</li>
	<li class="cat-item cat-item-51"><a href="http://www.nomadiccodemonkey.com/?cat=51">fedora</a>
</li>
	<li class="cat-item cat-item-114"><a href="http://www.nomadiccodemonkey.com/?cat=114">flickr</a>
</li>
	<li class="cat-item cat-item-35"><a href="http://www.nomadiccodemonkey.com/?cat=35">foss</a>
</li>
	<li class="cat-item cat-item-34"><a href="http://www.nomadiccodemonkey.com/?cat=34">foss.my</a>
</li>
	<li class="cat-item cat-item-110"><a href="http://www.nomadiccodemonkey.com/?cat=110">free</a>
</li>
	<li class="cat-item cat-item-111"><a href="http://www.nomadiccodemonkey.com/?cat=111">fun</a>
</li>
	<li class="cat-item cat-item-98"><a href="http://www.nomadiccodemonkey.com/?cat=98">games</a>
</li>
	<li class="cat-item cat-item-54"><a href="http://www.nomadiccodemonkey.com/?cat=54">geekcamp</a>
</li>
	<li class="cat-item cat-item-30"><a href="http://www.nomadiccodemonkey.com/?cat=30">geeks</a>
</li>
	<li class="cat-item cat-item-112"><a href="http://www.nomadiccodemonkey.com/?cat=112">generator</a>
</li>
	<li class="cat-item cat-item-80"><a href="http://www.nomadiccodemonkey.com/?cat=80">google</a>
</li>
	<li class="cat-item cat-item-49"><a href="http://www.nomadiccodemonkey.com/?cat=49">google app engine</a>
</li>
	<li class="cat-item cat-item-105"><a href="http://www.nomadiccodemonkey.com/?cat=105">google chart</a>
</li>
	<li class="cat-item cat-item-48"><a href="http://www.nomadiccodemonkey.com/?cat=48">google waves</a>
</li>
	<li class="cat-item cat-item-10"><a href="http://www.nomadiccodemonkey.com/?cat=10">hackerspacekl</a>
</li>
	<li class="cat-item cat-item-108"><a href="http://www.nomadiccodemonkey.com/?cat=108">hcl</a>
</li>
	<li class="cat-item cat-item-117"><a href="http://www.nomadiccodemonkey.com/?cat=117">i18n</a>
</li>
	<li class="cat-item cat-item-87"><a href="http://www.nomadiccodemonkey.com/?cat=87">java</a>
</li>
	<li class="cat-item cat-item-107"><a href="http://www.nomadiccodemonkey.com/?cat=107">javascript</a>
</li>
	<li class="cat-item cat-item-53"><a href="http://www.nomadiccodemonkey.com/?cat=53">jobs</a>
</li>
	<li class="cat-item cat-item-81"><a href="http://www.nomadiccodemonkey.com/?cat=81">kde</a>
</li>
	<li class="cat-item cat-item-88"><a href="http://www.nomadiccodemonkey.com/?cat=88">kde 4</a>
</li>
	<li class="cat-item cat-item-52"><a href="http://www.nomadiccodemonkey.com/?cat=52">learning</a>
</li>
	<li class="cat-item cat-item-8"><a href="http://www.nomadiccodemonkey.com/?cat=8">linux</a>
</li>
	<li class="cat-item cat-item-73"><a href="http://www.nomadiccodemonkey.com/?cat=73">lisp</a>
</li>
	<li class="cat-item cat-item-68"><a href="http://www.nomadiccodemonkey.com/?cat=68">mainframe</a>
</li>
	<li class="cat-item cat-item-6"><a href="http://www.nomadiccodemonkey.com/?cat=6">malaysia</a>
</li>
	<li class="cat-item cat-item-99"><a href="http://www.nomadiccodemonkey.com/?cat=99">mame</a>
</li>
	<li class="cat-item cat-item-118"><a href="http://www.nomadiccodemonkey.com/?cat=118">Meetup</a>
</li>
	<li class="cat-item cat-item-116"><a href="http://www.nomadiccodemonkey.com/?cat=116">mobile development</a>
</li>
	<li class="cat-item cat-item-55"><a href="http://www.nomadiccodemonkey.com/?cat=55">mscosconf</a>
</li>
	<li class="cat-item cat-item-47"><a href="http://www.nomadiccodemonkey.com/?cat=47">mygosscon</a>
</li>
	<li class="cat-item cat-item-65"><a href="http://www.nomadiccodemonkey.com/?cat=65">myoss</a>
</li>
	<li class="cat-item cat-item-94"><a href="http://www.nomadiccodemonkey.com/?cat=94">network</a>
</li>
	<li class="cat-item cat-item-18"><a href="http://www.nomadiccodemonkey.com/?cat=18">open data</a>
</li>
	<li class="cat-item cat-item-37"><a href="http://www.nomadiccodemonkey.com/?cat=37">open hardware</a>
</li>
	<li class="cat-item cat-item-15"><a href="http://www.nomadiccodemonkey.com/?cat=15">open source</a>
</li>
	<li class="cat-item cat-item-76"><a href="http://www.nomadiccodemonkey.com/?cat=76">os</a>
</li>
	<li class="cat-item cat-item-21"><a href="http://www.nomadiccodemonkey.com/?cat=21">pdf</a>
</li>
	<li class="cat-item cat-item-75"><a href="http://www.nomadiccodemonkey.com/?cat=75">pidgin</a>
</li>
	<li class="cat-item cat-item-20"><a href="http://www.nomadiccodemonkey.com/?cat=20">policy</a>
</li>
	<li class="cat-item cat-item-5"><a href="http://www.nomadiccodemonkey.com/?cat=5">politics</a>
</li>
	<li class="cat-item cat-item-101"><a href="http://www.nomadiccodemonkey.com/?cat=101">postgresql</a>
</li>
	<li class="cat-item cat-item-70"><a href="http://www.nomadiccodemonkey.com/?cat=70">powershell</a>
</li>
	<li class="cat-item cat-item-14"><a href="http://www.nomadiccodemonkey.com/?cat=14">programming</a>
</li>
	<li class="cat-item cat-item-17"><a href="http://www.nomadiccodemonkey.com/?cat=17">python</a>
</li>
	<li class="cat-item cat-item-3"><a href="http://www.nomadiccodemonkey.com/?cat=3">random</a>
</li>
	<li class="cat-item cat-item-32"><a href="http://www.nomadiccodemonkey.com/?cat=32">rant post</a>
</li>
	<li class="cat-item cat-item-63"><a href="http://www.nomadiccodemonkey.com/?cat=63">rexx</a>
</li>
	<li class="cat-item cat-item-26"><a href="http://www.nomadiccodemonkey.com/?cat=26">robot</a>
</li>
	<li class="cat-item cat-item-103"><a href="http://www.nomadiccodemonkey.com/?cat=103">ruby</a>
</li>
	<li class="cat-item cat-item-104"><a href="http://www.nomadiccodemonkey.com/?cat=104">ruby on rails</a>
</li>
	<li class="cat-item cat-item-27"><a href="http://www.nomadiccodemonkey.com/?cat=27">scraper</a>
</li>
	<li class="cat-item cat-item-7"><a href="http://www.nomadiccodemonkey.com/?cat=7">screen</a>
</li>
	<li class="cat-item cat-item-115"><a href="http://www.nomadiccodemonkey.com/?cat=115">server project</a>
</li>
	<li class="cat-item cat-item-36"><a href="http://www.nomadiccodemonkey.com/?cat=36">sfdkl2010</a>
</li>
	<li class="cat-item cat-item-72"><a href="http://www.nomadiccodemonkey.com/?cat=72">shell</a>
</li>
	<li class="cat-item cat-item-95"><a href="http://www.nomadiccodemonkey.com/?cat=95">showoff</a>
</li>
	<li class="cat-item cat-item-78"><a href="http://www.nomadiccodemonkey.com/?cat=78">skype</a>
</li>
	<li class="cat-item cat-item-24"><a href="http://www.nomadiccodemonkey.com/?cat=24">software</a>
</li>
	<li class="cat-item cat-item-23"><a href="http://www.nomadiccodemonkey.com/?cat=23">sqlite3</a>
</li>
	<li class="cat-item cat-item-89"><a href="http://www.nomadiccodemonkey.com/?cat=89">squid</a>
</li>
	<li class="cat-item cat-item-69"><a href="http://www.nomadiccodemonkey.com/?cat=69">startupcampkl</a>
</li>
	<li class="cat-item cat-item-33"><a href="http://www.nomadiccodemonkey.com/?cat=33">startupweekendjk2010</a>
</li>
	<li class="cat-item cat-item-31"><a href="http://www.nomadiccodemonkey.com/?cat=31">sysadmin</a>
</li>
	<li class="cat-item cat-item-28"><a href="http://www.nomadiccodemonkey.com/?cat=28">tech</a>
</li>
	<li class="cat-item cat-item-44"><a href="http://www.nomadiccodemonkey.com/?cat=44">tedxkl</a>
</li>
	<li class="cat-item cat-item-50"><a href="http://www.nomadiccodemonkey.com/?cat=50">thought</a>
</li>
	<li class="cat-item cat-item-13"><a href="http://www.nomadiccodemonkey.com/?cat=13">tools</a>
</li>
	<li class="cat-item cat-item-71"><a href="http://www.nomadiccodemonkey.com/?cat=71">twitter</a>
</li>
	<li class="cat-item cat-item-45"><a href="http://www.nomadiccodemonkey.com/?cat=45">ubuntu</a>
</li>
	<li class="cat-item cat-item-61"><a href="http://www.nomadiccodemonkey.com/?cat=61">ubuntu-my</a>
</li>
	<li class="cat-item cat-item-1"><a href="http://www.nomadiccodemonkey.com/?cat=1">Uncategorized</a>
</li>
	<li class="cat-item cat-item-91"><a href="http://www.nomadiccodemonkey.com/?cat=91">unix</a>
</li>
	<li class="cat-item cat-item-59"><a href="http://www.nomadiccodemonkey.com/?cat=59">urejaweekend</a>
</li>
	<li class="cat-item cat-item-58"><a href="http://www.nomadiccodemonkey.com/?cat=58">urekaweekend</a>
</li>
	<li class="cat-item cat-item-92"><a href="http://www.nomadiccodemonkey.com/?cat=92">video</a>
</li>
	<li class="cat-item cat-item-46"><a href="http://www.nomadiccodemonkey.com/?cat=46">vim</a>
</li>
	<li class="cat-item cat-item-84"><a href="http://www.nomadiccodemonkey.com/?cat=84">virtualization</a>
</li>
	<li class="cat-item cat-item-83"><a href="http://www.nomadiccodemonkey.com/?cat=83">web</a>
</li>
	<li class="cat-item cat-item-16"><a href="http://www.nomadiccodemonkey.com/?cat=16">web application</a>
</li>
	<li class="cat-item cat-item-12"><a href="http://www.nomadiccodemonkey.com/?cat=12">web development</a>
</li>
	<li class="cat-item cat-item-22"><a href="http://www.nomadiccodemonkey.com/?cat=22">web framework</a>
</li>
	<li class="cat-item cat-item-109"><a href="http://www.nomadiccodemonkey.com/?cat=109">web hosting</a>
</li>
	<li class="cat-item cat-item-25"><a href="http://www.nomadiccodemonkey.com/?cat=25">windows</a>
</li>
	<li class="cat-item cat-item-86"><a href="http://www.nomadiccodemonkey.com/?cat=86">wireless</a>
</li>
	<li class="cat-item cat-item-57"><a href="http://www.nomadiccodemonkey.com/?cat=57">yahoo</a>
</li>
	<li class="cat-item cat-item-113"><a href="http://www.nomadiccodemonkey.com/?cat=113">yahoo pipes</a>
</li>
		</ul>
			</aside><aside id="meta-2" class="widget widget_meta"><h1 class="widget-title">Meta</h1>			<ul>
						<li><a href="http://www.nomadiccodemonkey.com/wp-login.php">Log in</a></li>
			<li><a href="http://www.nomadiccodemonkey.com/?feed=rss2">Entries feed</a></li>
			<li><a href="http://www.nomadiccodemonkey.com/?feed=comments-rss2">Comments feed</a></li>
			<li><a href="https://wordpress.org/">WordPress.org</a></li>			</ul>
			</aside>	</div><!-- #primary-sidebar -->
	</div><!-- #secondary -->

		</div><!-- #main -->

		<footer id="colophon" class="site-footer" role="contentinfo">

			
			<div class="site-info">
												<a href="https://wordpress.org/" class="imprint">
					Proudly powered by WordPress				</a>
			</div><!-- .site-info -->
		</footer><!-- #colophon -->
	</div><!-- #page -->

	<script type='text/javascript'>
/* <![CDATA[ */
var countVars = {"disqusShortname":"nomadiccodemonkey"};
/* ]]> */
</script>
<script type='text/javascript' src='http://www.nomadiccodemonkey.com/wp-content/plugins/disqus-comment-system/public/js/comment_count.js?ver=3.0.17'></script>
<script type='text/javascript' src='http://www.nomadiccodemonkey.com/wp-content/themes/twentyfourteen/js/functions.js?ver=20150315'></script>
</body>
</html>
