<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3876018023351766162</id><updated>2024-09-08T11:31:16.678-07:00</updated><category term="Android"/><category term="SQLite"/><category term="Inkscape"/><category term="Tools"/><category term="JavaScript"/><category term="Review"/><category term="Localization"/><category term="R"/><category term="AChartEngine"/><category term="Android app"/><category term="CSO"/><category term="Chronometer"/><category term="Cycling"/><category term="Cygwin"/><category term="Ironing Computer"/><category term="JQuery"/><category term="Learning"/><category term="appengine"/><category term="AsyncTask"/><category term="AutoCompleteTextView"/><category term="Certification"/><category term="Cloud"/><category term="Command Line"/><category term="Data Science in HR"/><category term="Dates"/><category term="Event Handlers"/><category term="GPS"/><category term="GPS mock locations"/><category term="Game"/><category term="German"/><category term="Google Analytics"/><category term="Google I/O"/><category term="Google Maps"/><category term="HTML"/><category term="Handy tools"/><category term="Idea"/><category term="Java 8"/><category term="Keras"/><category term="ListActivity"/><category term="Machine Learning"/><category term="Malcolm Gladwell"/><category term="Mapping"/><category term="MySQL"/><category term="Naming convention"/><category term="Notification"/><category term="OCA"/><category term="Oracle"/><category term="Persuasion"/><category term="Philosophy"/><category term="PhysioTrack"/><category term="Pivotal"/><category term="Security"/><category term="Setting up a PC"/><category term="SimpleCursorAdapter"/><category term="Spar"/><category term="Spring"/><category term="Starting a business"/><category term="StopWatch"/><category term="Style"/><category term="Technical Debt"/><category term="The Economist"/><category term="Tips"/><category term="Toast"/><category term="Try it for 30 days"/><category term="Utility"/><category term="VR"/><category term="Wolfram Alpha"/><category term="Zen Coding"/><category term="adb"/><category term="blogger"/><category term="commonsware"/><category term="editor"/><category term="entertainment.ie"/><category term="example"/><category term="geo fix"/><category term="i18n"/><category term="library projects"/><category term="magrittr"/><category term="notifyDataSetChanged"/><category term="onResume"/><category term="seth godin"/><category term="styles"/><category term="telnet"/><category term="themes"/><category term="windows 7"/><title type='text'>Irish Android</title><subtitle type='html'>Software and Data.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>107</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-2648364002007278261</id><published>2018-06-16T07:01:00.000-07:00</published><updated>2018-06-16T07:01:20.158-07:00</updated><title type='text'>Building a choropleth map for Irish agricultural data</title><content type='html'>I wanted to create a &lt;a href=&quot;https://en.wikipedia.org/wiki/Choropleth_map&quot;&gt;choropleth map&lt;/a&gt;&amp;nbsp;using Irish data. The Irish Government has made a large quantity of data available at data.gov.ie. The set I chose was for Bovine TB across Ireland over a number of years.&lt;br /&gt;
You can get geojson for a variety of countries and Ireland&#39;s county boundaries are available. All I had to do was get the data labels to match. In the data some counties are split into 2 parts. I merged and summed these data points to get the choropleth to work with normal county boundaries.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://nbviewer.jupyter.org/github/anthonynolan/bovine-tb/blob/master/tb.ipynb&quot;&gt;You can see the results here&lt;/a&gt;. A link to the github is included at the top of the notebook.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/2648364002007278261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2018/06/building-choropleth-for-irish.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2648364002007278261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2648364002007278261'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2018/06/building-choropleth-for-irish.html' title='Building a choropleth map for Irish agricultural data'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-3155738947363949376</id><published>2018-05-06T04:31:00.001-07:00</published><updated>2018-05-06T04:31:10.346-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Keras"/><category scheme="http://www.blogger.com/atom/ns#" term="Machine Learning"/><title type='text'>Early Stopping with Keras</title><content type='html'>&lt;h3&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Steps to train a model&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;There are a number of things you have to do when working on a Machine Learning problem.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Import your data and transform it as appropriate&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Define&amp;nbsp; your model using something like Keras - this includes your chosen hyperparameter values&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Run the training phase&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Evaluate the model&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;If at the end of this process the evaluation shows that your model is not sufficient for your needs you will need to make some changes and rerun the training.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ideally you should have a way to spot that training is not going as you want and stop it. This is one of the uses of early stopping. The other is if your model has reached a sufficient quality standard for you to use and further improvements have slowed, stopped altogether or an unnecessary.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Early Stopping&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Keras provides a way of doing this using the &lt;b&gt;EarlyStopping callback&lt;/b&gt;. There are a range of callbacks in Keras and you can define your own. Details are &lt;a href=&quot;https://keras.io/callbacks/&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The EarlyStopping callback works by choosing a metric that you want to watch. Indicating what level of change in it is unacceptable and how many epochs you are prepared to tolerate that performance before the training should be abandoned.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Sample Code&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;First the import&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from keras.callbacks import EarlyStopping&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Then create an instance of the EarlyStopping class. In this case we are monitoring the accuracy. The metrics available to you are just those you defined when you compiled your model. &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;patience&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt; is the number of epochs to tolerate a below standard change in the metric.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;early_stopping = EarlyStopping(monitor=&#39;acc&#39;, patience=10, verbose=1)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Note that you can also define a &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;min_delta&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;, which is the amount of difference that the callback should notice, but the default of 0 is fine for our needs.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Finally add the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;callbacks&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt; parameter when you are fitting your model. Note that it takes a list so that you can pass other callbacks too.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;model.fit(X, Y, epochs=50, batch_size=5, verbose=1, callbacks=[early_stopping])&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;So in this case if the accuracy of your model has not improved for 10 consecutive epochs, training will be abandoned. Setting verbose to 1 is a good idea so that you get a better message that the callback ended training. Otherwise everything will just appear to stop.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;A more sophisticated use of this callback could adjust a hyperparameter and try again. However a better way to achieve this may be with grid search.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/3155738947363949376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2018/05/early-stopping-with-keras.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/3155738947363949376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/3155738947363949376'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2018/05/early-stopping-with-keras.html' title='Early Stopping with Keras'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-5604054753412039015</id><published>2016-03-25T08:07:00.001-07:00</published><updated>2016-03-25T08:07:32.349-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring"/><title type='text'>Preventing Mass Assignment Attacks in Spring</title><content type='html'>If you have a wizard to collect data from users in a set of steps you can open yourself up to a mass assignment attack. OWASP as always gives great information on &lt;a href=&quot;https://www.owasp.org/index.php/Mass_Assignment_Cheat_Sheet#Spring_MVC&quot;&gt;this&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
How it works&lt;/h3&gt;
You Bind an object to the model and you want to populate the fields in that object as your user progresses through your wizard. So on the first screen you might collect their name, second screen email and so on. Between each of these steps you perform validation on the just entered values.&lt;br /&gt;
&lt;br /&gt;
However a hacker exploiting mass assignment can bind data from step 1 during a subsequent step just by putting the variable and value in the URL (assuming GET, although obviously this can be done with POST also).&lt;br /&gt;
&lt;br /&gt;
So for the first step you are after this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;https://mywebsite.com/myapp/action?&lt;span style=&quot;background-color: yellow;&quot;&gt;email&lt;/span&gt;=anthonynolan@somemail.com&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
And the second step, this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;https://mywebsite.com/myapp/action2?&lt;span style=&quot;background-color: yellow;&quot;&gt;name&lt;/span&gt;=Anthony&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Instead the hacker supplies this which is fine and passes our validation:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;https://mywebsite.com/myapp/action?email=anthonynolan@somemail.com&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Followed by this. Which is not fine as the email is not validated on this step:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;https://mywebsite.com/myapp/action2?name=Anthony&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;amp;email=bad_guy_email@dodgy.com&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Because Spring binds all params that it can match in the URL the email address will be bound in the last case. Your code may not have included validation of email (restricted domains for example) in that step of the wizard.&lt;br /&gt;
&lt;br /&gt;
There are a number of approaches to fix this.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Repeat the validations on each step&lt;/h3&gt;
Therefore the validation is accretive. Something like this.&lt;br /&gt;
&lt;h4&gt;
Step 1&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Validate condition 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Step2&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Validate condition 1 again&lt;/li&gt;
&lt;li&gt;Validate condition 2&lt;/li&gt;
&lt;/ul&gt;
and so on.&lt;br /&gt;
&lt;br /&gt;
This leads to some duplication of code - but it is very minimal - only method calls. I plan to put together a neater way of achieving this accretion, but for now this will do.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Isolate each wizard step in its own controller&lt;/h3&gt;
This will allow you to use the OWASP recommended method of using a binder (this is the whitelist version, there is blacklist too):&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #f9f9f9; border: 1px solid rgb(221, 221, 221); font-size: 14px; line-height: 1.3em; overflow-x: auto; padding: 1em;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;@Controller
  public class UserController
  {
     @InitBinder
     public void initBinder(WebDataBinder binder, WebRequest request)
     {
        binder.setAllowedFields([&quot;userid&quot;,&quot;password&quot;,&quot;email&quot;]);
     }
  
     ...
  }&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
However if you have the steps in the same controller (a better design in my opinion), this won&#39;t work. You will end up blocking the params at every step, not just the prohibited ones.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Blacklist params in handler&lt;/h3&gt;
You can however use the Params attribute on your RequestMapping annotation to disallow certain parameters. This one will disallow &lt;i&gt;role&lt;/i&gt; in the params list. If role is supplied the user will get a 404.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;@RequestMapping(value = &quot;/bitofurl&quot;, params = &quot;!role&quot;)&lt;/span&gt;&lt;div class=&quot;line number2 index1 alt1&quot; style=&quot;background: none white !important; border-radius: 0px !important; border: 0px !important; bottom: auto !important; box-sizing: content-box !important; color: #262626; float: none !important; font-family: Consolas, &#39;Bitstream Vera Sans Mono&#39;, &#39;Courier New&#39;, Courier, monospace; font-size: 12px; height: auto !important; left: auto !important; line-height: 13.2px; margin: 0px !important; min-height: auto !important; outline: 0px !important; overflow: visible !important; padding: 0px 1em !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; white-space: pre !important; width: auto !important;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;line number3 index2 alt2&quot; style=&quot;background: none white !important; border-radius: 0px !important; border: 0px !important; bottom: auto !important; box-sizing: content-box !important; color: #262626; float: none !important; font-family: Consolas, &#39;Bitstream Vera Sans Mono&#39;, &#39;Courier New&#39;, Courier, monospace; font-size: 12px; height: auto !important; left: auto !important; line-height: 13.2px; margin: 0px !important; min-height: auto !important; outline: 0px !important; overflow: visible !important; padding: 0px 1em !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; white-space: pre !important; width: auto !important;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
All this is a little awkward and removes some of the elegance of a Spring solution. But mass assignment attacks are serious stuff and can result in all manner of nastiness. Better slightly less elegant code than a compromised user DB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/5604054753412039015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2016/03/preventing-mass-assignment-attacks-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/5604054753412039015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/5604054753412039015'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2016/03/preventing-mass-assignment-attacks-in.html' title='Preventing Mass Assignment Attacks in Spring'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-421923601664735974</id><published>2016-02-20T08:47:00.001-08:00</published><updated>2016-02-20T08:47:20.106-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Persuasion"/><category scheme="http://www.blogger.com/atom/ns#" term="VR"/><title type='text'>Encouraging people to do things with VR</title><content type='html'>I read an article a few years ago about a study to see if people contribute more to their pension fund if they have seen a future representation of themselves. Not surprisingly they do. I have been bouncing the idea around in my head, so I decided to look up the study. You can read it &lt;a href=&quot;http://www.dangoldstein.com/papers/Hershfield_Goldstein_et_al_Increasing_Saving_Behavior_Age_Progressed_Renderings_Future_Self.pdf&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
They used some clever software to produce a 3D model of a person&#39;s head which they then aged. The participant was then given a VR headset inside which they could see their older self. They could interact to a limited extent with themselves, so it was better than just a photo of &#39;you old&#39;.&lt;br /&gt;
&lt;br /&gt;
The experiments were very well run, but basically the outcome was that people can relate to their older self if they see the image and pension contributions go up.&lt;br /&gt;
&lt;br /&gt;
I think this idea is generally fascinating, beyond pension contribution. For example encouraging people to adopt healthy lifestyles is very difficult. Often the pull of pleasure now far outweighs some notion of protecting your future self. If people could see themselves sick, fat and maybe with a few limbs missing they might rethink their choices.&lt;br /&gt;
&lt;br /&gt;
Radical stuff, but really no more than letting people make their own minds up based on what they can see will happen.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/421923601664735974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2016/02/encouraging-people-to-do-things-with-vr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/421923601664735974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/421923601664735974'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2016/02/encouraging-people-to-do-things-with-vr.html' title='Encouraging people to do things with VR'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-3606621300409308599</id><published>2016-02-18T12:16:00.000-08:00</published><updated>2016-02-18T12:16:00.652-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Philosophy"/><title type='text'>Continuous Learning for Developers</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQlhCAx-BunTlwSQYPcsUk86HLTMPxpxFBpC6Jq-f_0mq4JFhXRDK5OMTS_aq53rJuPae7RVBivF_F6ocoQCOrxM9vEUGFqSuI3kB1vB_ZcnMAbee9VMw17TZ5PrBcM0_gaF0dEzgRE48F/s1600/saint-jerome-400x400.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQlhCAx-BunTlwSQYPcsUk86HLTMPxpxFBpC6Jq-f_0mq4JFhXRDK5OMTS_aq53rJuPae7RVBivF_F6ocoQCOrxM9vEUGFqSuI3kB1vB_ZcnMAbee9VMw17TZ5PrBcM0_gaF0dEzgRE48F/s320/saint-jerome-400x400.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;Continuous learning is very important in IT. A break from learning new things for a couple of years can put you in the dark ages.&lt;br /&gt;
I have always known this and done my best to keep upskilling, but a few things I have read recently have reminded me how important this is.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Leading Change&lt;/h3&gt;
John Kotter&#39;s &lt;a href=&quot;https://www.goodreads.com/book/show/51370.Leading_Change&quot;&gt;Leading Change&lt;/a&gt; is a book about managing big change in organisations. It gives a set of steps that should be followed based on the author&#39;s experience with change efforts in large numbers of big companies. The most surprising thing about the book is a section at the end where he says that the thing that unites very successful people is lifelong learning.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Big Data&lt;/h3&gt;
O&#39;Reilly publish a weekly Data Science &lt;a href=&quot;http://www.oreilly.com/data/newsletter.html&quot;&gt;newsletter&lt;/a&gt;. It is well worth a spin if statistics and analysis are your thing. I think that an interest in data is in every developer&#39;s interest.&lt;br /&gt;
They published an article this week entitled &lt;a href=&quot;https://www.oreilly.com/ideas/is-my-developer-team-ready-for-big-data&quot;&gt;Is your development team ready for Big Data?&lt;/a&gt;&lt;br /&gt;
Again one of the key skills that a developer should have to be able to handle the challenges of Big Data is continuous learning.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Values in Action&lt;/h3&gt;
A few years ago I read Authentic Happiness by &lt;a href=&quot;https://en.wikipedia.org/wiki/Martin_Seligman&quot;&gt;Martin Seligman&lt;/a&gt;. The author had researched the things that make us happy. He analysed world religions to find commonalities which he called &lt;i&gt;Values. &amp;nbsp;&lt;/i&gt;Then he devised a questionnaire which determined which of these virtues were &#39;yours&#39;. The idea being that if you concentrated on pursuing your virtues you would be happier. The book does a much better job of explaining this and gives solid reasoning too. You can find the survey and others like it &lt;a href=&quot;https://www.viacharacter.org/www/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
Why this talk of happiness and values in a technology blog? Whenever I do this survey &#39;Love of Learning&#39; comes up at the top of my virtues. Lucky me.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/3606621300409308599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2016/02/continuous-learning-for-developers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/3606621300409308599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/3606621300409308599'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2016/02/continuous-learning-for-developers.html' title='Continuous Learning for Developers'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQlhCAx-BunTlwSQYPcsUk86HLTMPxpxFBpC6Jq-f_0mq4JFhXRDK5OMTS_aq53rJuPae7RVBivF_F6ocoQCOrxM9vEUGFqSuI3kB1vB_ZcnMAbee9VMw17TZ5PrBcM0_gaF0dEzgRE48F/s72-c/saint-jerome-400x400.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-620790540749419958</id><published>2016-02-17T12:16:00.000-08:00</published><updated>2016-02-17T12:16:39.220-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Data Science in HR"/><title type='text'>Using Statistics to Hire Developers</title><content type='html'>&lt;h3&gt;
The Interview&lt;/h3&gt;
I was interviewing a developer for a mid level position today and he turned out to be not up to scratch. The CV looked pretty good, but when I dug in with some fundamental Java questions he was found wanting. Not an unusual occurrence, but still costly. It took 30 minutes of my time, his time and a number of other people were involved to get the process to this stage.&lt;br /&gt;
&lt;br /&gt;
I wondered if there might be a way to remove some of the candidate CVs from the batch before we do the costly part of interviewing.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Spam or Ham&lt;/h3&gt;
Classifying CVs could be considered like the Spam/Ham problem. &lt;a href=&quot;http://spamassassin.apache.org/&quot;&gt;Apache SpamAssassin&lt;/a&gt; is a good example of a spam classifier. It can probably be made to classify CVs - or at least try, but it is written in C, I think and that is not my thing any more. &lt;a href=&quot;https://github.com/datumbox/NaiveBayesClassifier&quot;&gt;This&lt;/a&gt; looks interesting, so I forked it, converted it to eclipse and started the process of making it build with Maven.&lt;br /&gt;
&lt;br /&gt;
First I am going to try this out with spam and ham email, then will try it for other text passages. Maybe CVs if I can get my hands on some. I am not expecting a huge amount of success with this, but I want to try out some Machine Learning techniques in my work. I did &lt;a href=&quot;https://www.coursera.org/specializations/jhu-data-science&quot;&gt;this&lt;/a&gt;&amp;nbsp;last year and don&#39;t want to let all that hard work be for nothing.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Java Interview Questions&lt;/h3&gt;
If you are going to find yourself on the receiving end of an interview for a Java job take the time to lookup &#39;Java Interview Questions&#39;. Spending an hour refreshing (or learning) these top items are likely to add considerable polish to your presentation. You can be good, but interviewers have a hard time seeing through rusty skills in an hour.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/620790540749419958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2016/02/using-statistics-to-hire-developers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/620790540749419958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/620790540749419958'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2016/02/using-statistics-to-hire-developers.html' title='Using Statistics to Hire Developers'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-3948285890734147233</id><published>2016-02-16T13:18:00.000-08:00</published><updated>2016-02-16T13:18:11.459-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="Pivotal"/><category scheme="http://www.blogger.com/atom/ns#" term="Technical Debt"/><title type='text'>A Philosophy for Modern Applications</title><content type='html'>I listened to a webinar with Pivotal today and they spoke about some of the thinking behind their Cloud Foundry platform. One of the guides they use to build this is called &lt;a href=&quot;http://12factor.net/&quot;&gt;12 factor.net&lt;/a&gt;. It is a set of principles devised by the people behind the&amp;nbsp;&lt;a href=&quot;https://www.heroku.com/home&quot;&gt;Heroku&lt;/a&gt; cloud platform.&lt;br /&gt;
&lt;br /&gt;
I won&#39;t go into the details here, you can read the brief web page yourself, but they cover a broad range of the factors that we often don&#39;t think about when we develop large scale enterprise systems.&lt;br /&gt;
&lt;br /&gt;
One such concept is the avoidance of &lt;a href=&quot;https://blog.heroku.com/archives/2011/6/28/the_new_heroku_4_erosion_resistance_explicit_contracts&quot;&gt;Software erosion&lt;/a&gt;. This is the gradual degradation of software running in a changing environment. For example as security holes in the OS are discovered your OS is eroded. A service on which you rely fails and is not restarted. If not managed continuously items like this can result in your application going out of service. The costs of getting it back may be too great to pay.&lt;br /&gt;
&lt;br /&gt;
A related concept is &lt;a href=&quot;https://en.wikipedia.org/wiki/Technical_debt&quot;&gt;Technical debt&lt;/a&gt;. This is work within a system which needs to be done in order for some other work to progress to completion. If you don&#39;t attend to the debt it grows as the cost of doing the work gets greater.&lt;br /&gt;
&lt;br /&gt;
Taken together these items are reasons to factor continual maintenance into the costs of software ownership. Using techniques like DevOps in a managed cloud environment - which is what Pivotal were explaining in today&#39;s webinar is a way to keep these time growing problems under control for less cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/3948285890734147233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2016/02/a-philosophy-for-modern-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/3948285890734147233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/3948285890734147233'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2016/02/a-philosophy-for-modern-applications.html' title='A Philosophy for Modern Applications'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-8121063796264774113</id><published>2016-02-15T12:13:00.001-08:00</published><updated>2016-02-15T12:13:34.547-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Certification"/><category scheme="http://www.blogger.com/atom/ns#" term="Java 8"/><category scheme="http://www.blogger.com/atom/ns#" term="OCA"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><title type='text'>Tips for passing Oracle Certified Associate in Java 8</title><content type='html'>I decided to do this exam a few months ago. I have been a Java developer for over 10 years, so this was overdue.&lt;br /&gt;
&lt;br /&gt;
There are a few simple steps and quite a lot of work.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
First get a book&lt;/h3&gt;
I used &lt;a href=&quot;http://www.selikoff.net/java-oca-8-programmer-i-study-guide/&quot;&gt;this one&lt;/a&gt;&amp;nbsp;on Kindle. Kindle is the perfect format for this stuff as you can read snippets while you wait at the bus, checkout etc.&lt;br /&gt;
Read it through cover to cover. I did not do the exercises on this pass, I was just making sure that I could understand almost everything in there.&lt;br /&gt;
Next you should either do the end of chapter exercises, or write small programs to test your understanding. Don&#39;t start taking mock exams too early.&lt;br /&gt;
&lt;h3&gt;
Mock exams&lt;/h3&gt;
These are absolutely required to test your knowledge. I used &lt;a href=&quot;http://enthuware.com/&quot;&gt;these ones&lt;/a&gt;. I (like most of the people whom I spoke to about this) found I did not know the material as well as I thought. The huge plus for the Enthuware mock exams is that they explain in detail why you were wrong. Take your time understanding why you made the mistakes you did. Don&#39;t rush the exams. There are a limited number of them in the download and you can get used to how to answer that set without being prepared for the real exam.&lt;br /&gt;
The Enthuware software also builds up a picture of where you are weak and where you are strong. After a couple of mock exams you can check where you are weakest and concentrate on those areas.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
The exam&lt;/h3&gt;
Once you are passing by a decent margin you can go ahead and take the exam. There is plenty of advice on the immediate preparation for the test in the book I recommended.&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/8121063796264774113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2016/02/tips-for-passing-oracle-certified.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8121063796264774113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8121063796264774113'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2016/02/tips-for-passing-oracle-certified.html' title='Tips for passing Oracle Certified Associate in Java 8'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-2320243954937205761</id><published>2014-10-26T10:17:00.001-07:00</published><updated>2014-10-26T10:17:57.502-07:00</updated><title type='text'>A tool for plotting networks - Cytoscape</title><content type='html'>The networks referred to here are more &lt;a href=&quot;https://en.wikipedia.org/wiki/Graph_(mathematics)&quot;&gt;general&lt;/a&gt; than computer networks. Social networks for example. Cytoscape is a great free and flexible way to produce nice graphical output from &#39;linked node&#39; data. On a recent project I had a requirement for this and Cytoscape did the job well. I would not describe the tool as all that easy to use, but the task it is carrying out is not easy. Once you take some time to familiarise yourself with the basic operation it works very well.&lt;br /&gt;
&lt;br /&gt;
Full details are &lt;a href=&quot;http://cytoscape.org/&quot;&gt;available&lt;/a&gt; here.&lt;br /&gt;
&lt;br /&gt;
A nice feature of Cytoscape is the ability to tie a property of the data to a visual property. For example you can make the thickness of connecting lines very with a property of the relationship - weight. You could also use things like colour.&lt;br /&gt;
&lt;br /&gt;
There is a large set of plugins available. Many focus on biology which as the name suggests is the typical domain for this tool, but it is not limited to that.&lt;br /&gt;
&lt;br /&gt;
Cytoscape presents a steep learning curve, but this type of work was formerly the domain of experts only. Now amateurs can have a go too.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/2320243954937205761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2014/10/a-tool-for-plotting-networks-cytoscape.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2320243954937205761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2320243954937205761'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2014/10/a-tool-for-plotting-networks-cytoscape.html' title='A tool for plotting networks - Cytoscape'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-1248822049976161702</id><published>2014-09-19T01:44:00.002-07:00</published><updated>2014-09-19T01:44:55.037-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSO"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><title type='text'>Population of Ireland on a 3d scatter plot</title><content type='html'>The Central Statistics Office in Ireland has published this dataset:&lt;br /&gt;
&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-32175e89-8d11-ec0a-74d8-0041ac40355b&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;a href=&quot;http://www.cso.ie/en/census/census2011griddataset/&quot; style=&quot;font-family: Arial; font-size: 15px; line-height: 1.15; text-decoration: none; white-space: pre-wrap;&quot;&gt;http://www.cso.ie/en/census/census2011griddataset/&lt;/a&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
And here is the user guide:&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-32175e89-8d12-369b-0727-98ae3e1dec9a&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;http://www.cso.ie/en/media/csoie/census/documents/census2011griddataset/1,Km%C2%B2,Grid,dataset,User,Guide,2011.pdf&quot; style=&quot;text-decoration: none;&quot;&gt;http://www.cso.ie/en/media/csoie/census/documents/census2011griddataset/1,Km%C2%B2,Grid,dataset,User,Guide,2011.pdf&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
It gives the population of each 1km square of Ireland on census night 2011. It has various buckets, but I have just looked at total population. I used the 3dscatterplot package in R which is very easy to use.&amp;nbsp;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Here is my code:&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;line-height: 18.3999996185303px;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cen&amp;lt;-read.csv(&quot;COP2011_Grid_ITM_IE_1Km.csv&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;line-height: 18.3999996185303px;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;install.packages(&#39;scatterplot3d&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;line-height: 18.3999996185303px;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;library(scatterplot3d)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;line-height: 18.3999996185303px;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;scatterplot3d(cen$CENT_EAST, cen$CENT_NORTH, cen$TOT_P)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
and here is the resulting plot&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFYE15UopjowZ_gPG4IibHA97feJOypeplAN5Ai8t5yPvai2TDE_GzeeAehyphenhyphenENudKhL_Z22RBLiKfdw5bKETv59dc_hAjUiqfX6zsZFKtPpvWWrxRlepg0mcb7Faw-9rW-oJn0qSOVg-k5/s1600/Rplot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFYE15UopjowZ_gPG4IibHA97feJOypeplAN5Ai8t5yPvai2TDE_GzeeAehyphenhyphenENudKhL_Z22RBLiKfdw5bKETv59dc_hAjUiqfX6zsZFKtPpvWWrxRlepg0mcb7Faw-9rW-oJn0qSOVg-k5/s1600/Rplot.png&quot; height=&quot;396&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can see the big cities jumping up there. It needs a lot of polish to avoid things like Cork getting swamped in the 3d projection, but that&#39;s it for now.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/1248822049976161702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2014/09/population-of-ireland-on-3d-scatter-plot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1248822049976161702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1248822049976161702'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2014/09/population-of-ireland-on-3d-scatter-plot.html' title='Population of Ireland on a 3d scatter plot'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFYE15UopjowZ_gPG4IibHA97feJOypeplAN5Ai8t5yPvai2TDE_GzeeAehyphenhyphenENudKhL_Z22RBLiKfdw5bKETv59dc_hAjUiqfX6zsZFKtPpvWWrxRlepg0mcb7Faw-9rW-oJn0qSOVg-k5/s72-c/Rplot.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-4564104802468137061</id><published>2014-08-31T06:15:00.002-07:00</published><updated>2014-08-31T06:15:37.099-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="magrittr"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><title type='text'>Using the new pipe feature in R</title><content type='html'>&lt;a href=&quot;http://www.renemagritte.org/images/paintings/The-Treachery-of-Images.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.renemagritte.org/images/paintings/The-Treachery-of-Images.JPG&quot; height=&quot;228&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;The magrittr package has introduced the pipe operator to R. It looks like this:&lt;br /&gt;
&lt;br /&gt;
%&amp;gt;%&lt;br /&gt;
&lt;br /&gt;
You use it the way you use any pipe. First operations result passed to next one and so on.&lt;br /&gt;
Makes for more readable code instead of nested functions.&lt;br /&gt;
&lt;br /&gt;
To use it you need to install the magrittr package. In addition to get the nice easy to use filter, &amp;nbsp;group_by etc. functions used below you need to install the dplyr package. In fact dplyr depends on magrittr, so install it first and magrittr comes along for the ride.&lt;br /&gt;
&lt;br /&gt;
install.packages(&#39;dplyr&#39;)&lt;br /&gt;
library(&#39;dplyr&#39;)&lt;br /&gt;
&lt;br /&gt;
You&#39;ll need the nycflights13 dataset for this example, so do this:&lt;br /&gt;
&lt;br /&gt;
install.packages(&#39;nycflights13&#39;)&lt;br /&gt;
library(nycflights13)&lt;br /&gt;
&lt;br /&gt;
Here is the example which points the finger at airlines with longest delays from NYC:&lt;br /&gt;
&lt;br /&gt;
filter(flights, !is.na(dep_delay)) %&amp;gt;%&lt;br /&gt;
group_by(carrier)&lt;br /&gt;
%&amp;gt;%summarise(delay = mean(dep_delay))&lt;br /&gt;
%&amp;gt;% merge(airlines)&lt;br /&gt;
%&amp;gt;%arrange(desc(delay))&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I really like these functions like the filter one. I find subsetting the &#39;normal&#39; way in R to be v tricky. This makes is a lot easier - to my mind.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Additional stuff I stumbled upon while looking at and getting the nyc data were these bits:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Find the datasets in your installed packages:&lt;br /&gt;
data()&lt;br /&gt;
&lt;br /&gt;
In a specific package:&lt;br /&gt;
data(package = &#39;nycflights13&#39;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://cran.r-project.org/web/packages/dplyr/dplyr.pdf&quot;&gt;Here&lt;/a&gt;&amp;nbsp;are the dplyr docs - 63 page monster pdf.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html&quot;&gt;This&lt;/a&gt; is a bit more manageable.&lt;br /&gt;
&lt;br /&gt;
magrittr github with nice examples is &lt;a href=&quot;https://github.com/smbache/magrittr&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/4564104802468137061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2014/08/using-new-pipe-feature-in-r.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/4564104802468137061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/4564104802468137061'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2014/08/using-new-pipe-feature-in-r.html' title='Using the new pipe feature in R'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-6627765664369573385</id><published>2014-08-13T08:34:00.000-07:00</published><updated>2014-08-13T08:34:04.683-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSO"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><title type='text'>Using R to analyse data from the Central Statistics Office in Ireland</title><content type='html'>&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
I started a Coursera course this week called &lt;a href=&quot;https://www.coursera.org/course/getdata&quot;&gt;Getting and cleaning data&lt;/a&gt;. I was looking at some data from the &lt;a href=&quot;http://www.cso.ie/px/pxeirestat/statire/SelectTable/Omrade0.asp?Planguage=0&quot;&gt;CSO&lt;/a&gt; and realised that I needed to clean it up. The course is good, but quite difficult. It assumes you have not forgotten everything you learned in the previous course, R Programming.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
Mid way through week 2 (I am playing a bit of catchup) I stumbled across this package&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
http://pxr.r-forge.r-project.org/&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
px is the format that the CSO releases its &#39;raw&#39; data in. This package puts that into a data frame which is more amenable to analysis. I reckon there has to be something lurking within the CSO dataset which is one of my main motivations for getting up to speed on R.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #222222; font-family: arial; font-size: small;&quot;&gt;
Nothing to declare yet, but hopefully I will find something interesting soon :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/6627765664369573385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2014/08/using-r-to-analyse-data-from-central.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/6627765664369573385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/6627765664369573385'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2014/08/using-r-to-analyse-data-from-central.html' title='Using R to analyse data from the Central Statistics Office in Ireland'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-1157325207566467083</id><published>2013-09-16T09:08:00.003-07:00</published><updated>2013-09-16T09:08:20.183-07:00</updated><title type='text'>Get a list of your functions in mysql</title><content type='html'>If you want a list of functions (as opposed to procedures) use this:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;select *&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from information_schema.routines&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;where routine_schema = &#39;your_schema_name&#39;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;and routine_type != &#39;PROCEDURE&#39;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/1157325207566467083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/09/get-list-of-your-functions-in-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1157325207566467083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1157325207566467083'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/09/get-list-of-your-functions-in-mysql.html' title='Get a list of your functions in mysql'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-1744413067523330036</id><published>2013-08-09T00:42:00.001-07:00</published><updated>2013-08-09T00:42:28.215-07:00</updated><title type='text'>Douglas Crockford Video 5 - &#39;The end of all things&#39;</title><content type='html'>No let up in quality in this video. Here are my notes for the final video in the original series:&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Cross site scripting (XSS) is a big problem. Huge privs accorded to a successful attacker. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Caja and adsafe - make js safer. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;&quot;&gt;Don&#39;t confuse a variable and a value.&lt;/span&gt;&lt;/div&gt;
&lt;b id=&quot;docs-internal-guid-7b7442b0-5d7d-346b-c695-186719fbb96b&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;How does an object get a reference:&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;By Creation&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;By Construction&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;By Reference&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;David Parnas:&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;a href=&quot;http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Lazy programmers guide&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;a href=&quot;http://www.youtube.com/watch?v=eL5o4PFuxTY&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;http://www.youtube.com/watch?v=eL5o4PFuxTY&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Keep performance delays below 100ms - provide some sort of immediate feedback.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Don’t fiddle with code. Measure first. Use PageSpeed&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Arrays can be slow in older versions of ie. No hashmaps.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Don’t add unnecessary chrome. Takes time. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Don’t tune for quirks. Keep code clean and readable. Future versions of JS engines will be much faster. Your quirk optimisations may cause trouble.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;jslint.com&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;

&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Avoid global variables.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Avoid ++ - too easy to mess up&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Use jslint&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/1744413067523330036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/08/douglas-crockford-video-5-end-of-all.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1744413067523330036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1744413067523330036'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/08/douglas-crockford-video-5-end-of-all.html' title='Douglas Crockford Video 5 - &#39;The end of all things&#39;'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-7336972875386106008</id><published>2013-08-07T01:58:00.003-07:00</published><updated>2013-08-07T01:58:30.922-07:00</updated><title type='text'>Douglas Crockford&#39;s JavaScript Video 4 - AJAX</title><content type='html'>&lt;a href=&quot;http://www.yuiblog.com/crockford/&quot;&gt;These &lt;/a&gt;videos are remarkable in the packed world of IT training videos in that they are clear and enjoyable to watch. The fourth instalment is about Ajax, but goes into plenty of detail that I didn&#39;t know about where the DOM came from and some info about the famous browser wars. Here are my notes so that you can see what is in there before you invest 90 minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Markup languages&lt;/h4&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/RUNOFF&quot;&gt;RUNOFF&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Generalized_Markup_Language&quot;&gt;GML &lt;/a&gt;- generalized markup language&lt;br /&gt;
SGML&lt;br /&gt;
HTML - simplified SGML&lt;br /&gt;
Latex&lt;br /&gt;
&lt;br /&gt;
Angle brackets came from &lt;a href=&quot;http://en.wikipedia.org/wiki/Scribe_(markup_language)&quot;&gt;Scribe&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
HTML&lt;/h4&gt;
Does not fail on errors - allowed innovation. Otherwise the web would have frozen.&lt;br /&gt;
2 types of outlines - H1 - not nested and p type which are. Yuk.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
CSS&lt;/h4&gt;
Not modular - clashes can wreck your page.&lt;br /&gt;
difficult to manage selectors - classitis and iditis.&lt;br /&gt;
None of the browser vendors ever got it implemented!&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
The DOM&lt;/h4&gt;
Brendan Eich - Netscape&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Browser workflow&lt;/h4&gt;
url -&amp;gt; Fetch&amp;nbsp;-&amp;gt;&amp;nbsp;cache &amp;nbsp;-&amp;gt;&amp;nbsp;Parse&amp;nbsp;-&amp;gt; Tree&amp;nbsp;-&amp;gt;&amp;nbsp;&amp;nbsp;Flow&amp;nbsp;-&amp;gt; display list&amp;nbsp;-&amp;gt;&amp;nbsp;&amp;nbsp;Paint&amp;nbsp;-&amp;gt;&amp;nbsp;pixels&lt;br /&gt;
&lt;br /&gt;
Comments around script tags just protects users of ancient browsers from seeing the script. Don&#39;t bother with this.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
document.write&lt;/h4&gt;
Very bad. Don&#39;t do it.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
For performance improvement of scripts&lt;/h4&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;minify&lt;/li&gt;
&lt;li&gt;gzip&lt;/li&gt;
&lt;li&gt;Reduce number of script files (concat at deploy)&lt;/li&gt;
&lt;li&gt;Use something like Chrome PageSpeed to test&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Javascript uses &lt;b&gt;camel case&lt;/b&gt; for style properties. CSS uses hyphens - incompatible with JS - in fact incompatible with most languages. Done on purpose. Source of annoying bugs.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
InnerHTML&amp;nbsp;&lt;/h4&gt;
Nice and fast, but dangerous. Developed by ms - all browsers support it.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Always err on the side of understanding and clean code over performance unless performance is a serious problem.&lt;/h4&gt;
&lt;br /&gt;
&lt;h4&gt;
Events&lt;/h4&gt;
Bubble up through the DOM - use stopPropagation to deal with this.&lt;br /&gt;
Allows attaching of a single event handler to a container. The container then dispatches the event to the appropriate element. Faster to set up.&lt;br /&gt;
&lt;br /&gt;
Use good speed testing tools - Chrome best.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Server vs browser&lt;/h4&gt;
Neither side should dominate. A balance is the best. The server is not a filesystem and the browser is not a dope that just displays returned content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/7336972875386106008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/08/douglas-crockfords-javascript-video-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/7336972875386106008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/7336972875386106008'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/08/douglas-crockfords-javascript-video-4.html' title='Douglas Crockford&#39;s JavaScript Video 4 - AJAX'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-1357862832936618225</id><published>2013-08-01T09:05:00.001-07:00</published><updated>2013-08-01T09:05:48.812-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>Douglas Crockford&#39;s JavaScript Videos from his time at Yahoo</title><content type='html'>He has now moved on to other things, but &lt;a href=&quot;http://www.yuiblog.com/crockford/&quot;&gt;these videos&lt;/a&gt; are still around. They are like reading a novel - long form is still best. No sound bites here. Each video is over an hour long and there are 8 of them. I am only on the third at the moment, but am getting a huge amount out of them. If you are like most js developers and me you will be bludgeoning your way through whatever tasks you need to complete without knowing the details. JQuery et al insulate us from having to know this stuff right? Afraid not. There is no substitute for knowing the javascript in detail. These videos manage to do that.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/1357862832936618225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/08/douglas-crockfords-javascript-videos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1357862832936618225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1357862832936618225'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/08/douglas-crockfords-javascript-videos.html' title='Douglas Crockford&#39;s JavaScript Videos from his time at Yahoo'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-2604643697754562781</id><published>2013-07-30T01:00:00.000-07:00</published><updated>2013-07-30T01:00:28.216-07:00</updated><title type='text'>Useful CSS Wisdom</title><content type='html'>I came across &lt;a href=&quot;https://github.com/csswizardry/CSS-Guidelines&quot;&gt;this&lt;/a&gt; in the most recent Web Design Weekly. I have called it wisdom as it is full of the type of advice that people only have the balls to give you when they really know what they are talking about. Why IDs in CSS should be avoided is detailed. A lot of people rant about this, but there is something about this document that got me sifting through my CSS to find all the # marks.&lt;br /&gt;
The document is short and I am going to look back at it a few times over the coming months to make sure I have squeezed the benefit out of it.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/2604643697754562781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/useful-css-wisdom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2604643697754562781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2604643697754562781'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/useful-css-wisdom.html' title='Useful CSS Wisdom'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-692093673394234854</id><published>2013-07-29T01:09:00.000-07:00</published><updated>2013-07-29T01:09:10.067-07:00</updated><title type='text'>Web Design Weekly</title><content type='html'>&lt;a href=&quot;http://web-design-weekly.com/&quot;&gt;Web Design Weekly&lt;/a&gt; is a great resource for front end developers and wannabes. Once you subscribe it arrives in your inbox once a week with a selection of articles, news, tools etc. that you can use in your work. It is just like subscribing to RSS but I find that getting news on a specific area like this once a week means that I set aside some time to at least browse it and find out what is interesting. The material is often of a high quality and where I don&#39;t manage to get stuff working it&#39;s probably down to me not persisting with it long enough.&lt;br /&gt;
If this is the type of work that you do I recommend signing up for this. The link is at the start of this post.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/692093673394234854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/web-design-weekly.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/692093673394234854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/692093673394234854'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/web-design-weekly.html' title='Web Design Weekly'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-8674650260144395241</id><published>2013-07-26T02:01:00.000-07:00</published><updated>2013-07-26T02:01:16.622-07:00</updated><title type='text'>Mozilla Developer Network JavaScript Resources</title><content type='html'>When I am looking for anything to do with js, html or css on the web I tend to put the letters mdn into the search line along with whatever else I am looking for. This usually pushes me to the pages on the Mozilla Developer Network. They are consistently of high quality - unlike for example &lt;a href=&quot;http://www.w3fools.com/&quot;&gt;W3Schools&lt;/a&gt;&amp;nbsp;and are clearly written by the type of people who possess the knowledge that I want.&lt;br /&gt;
Mostly it is just a dip in to find our a syntax here and there, but they do offer comprehensive book style start to finish information. The JavaScript Guide for example is &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
I have been programming in JavaScript for quite a while now, so I am not reading this line for line, but a scan through it is clearing up some long held confusions for me.&lt;br /&gt;
I reckon getting proper skills into your head and hands is a slow process and the way there is to persist and add new pieces every day. Going through the MDN docs is an example of this.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/8674650260144395241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/mozilla-developer-network-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8674650260144395241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8674650260144395241'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/mozilla-developer-network-javascript.html' title='Mozilla Developer Network JavaScript Resources'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-1173398153905449636</id><published>2013-07-25T04:49:00.001-07:00</published><updated>2013-07-25T04:49:30.021-07:00</updated><title type='text'>Book about Design Patterns in JavaScript</title><content type='html'>&lt;a href=&quot;http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/&quot;&gt;This &lt;/a&gt;book by Addy Osmani goes into depth about the various design patterns that you can use in your JavaScript. The main advantage that I am getting out of it is going through the examples and reading the references to see how to do &#39;complex&#39; JavaScript. Singletons always come in handy in Java, now I can do them in JS. A host of other patterns are covered. I will be taking the time to go through this book in more detail over the coming weeks.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/1173398153905449636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/book-about-design-patterns-in-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1173398153905449636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/1173398153905449636'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/book-about-design-patterns-in-javascript.html' title='Book about Design Patterns in JavaScript'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-8565370660792759353</id><published>2013-07-24T03:15:00.004-07:00</published><updated>2013-07-24T03:16:11.928-07:00</updated><title type='text'>Some Resources to Help You Get Started With Grunt.js</title><content type='html'>I have been a bit worried about deploying cleartext javascript to my production environment for a while now. The hassle of obfuscating always put me off:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Use something like Google&#39;s closure service&lt;/li&gt;
&lt;li&gt;Change all of the references in my html to point to the generated files&lt;/li&gt;
&lt;li&gt;Make sure the clear text dev versions of the js are not deployed and finally&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Do the deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt.js&lt;/a&gt; looks like it might be my saviour here. Having come from (and still being in) the Java world I think of this as being Ant for javascript. Just what I was after.&lt;br /&gt;
I am just doing a bit each day so as not to interfere too much with the day job, but so far I have added these tasks (in development at least, I am not doing anything with grunt on live code yet):&lt;br /&gt;
Remove white space from js files with uglify&lt;br /&gt;
Compress javascript to gzip&lt;br /&gt;
Run my existing QUnit tests&lt;br /&gt;
Lint my javascript&lt;br /&gt;
&lt;br /&gt;
Although it is early days this looks like having the scope to make everything a bit easier.&lt;br /&gt;
Here are some resources I have used or am in the process of working through:&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-6048956f-102c-9851-f352-c0712c01615f&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;http://blog.mattbailey.co/post/45519082789/a-beginners-guide-to-grunt&quot; style=&quot;text-decoration: none;&quot;&gt;http://blog.mattbailey.co/post/45519082789/a-beginners-guide-to-grunt&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-6048956f-102c-ccd0-84e7-4c4f0e5ec4bf&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;http://flippinawesome.org/2013/07/01/building-a-javascript-library-with-grunt-js/&quot; style=&quot;text-decoration: none;&quot;&gt;http://flippinawesome.org/2013/07/01/building-a-javascript-library-with-grunt-js/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
As usual in things front endy &lt;a href=&quot;http://addyosmani.com/blog/&quot;&gt;Addy Osmani&#39;s website&lt;/a&gt; is a useful resource.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/8565370660792759353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/some-resources-to-help-you-get-started.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8565370660792759353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8565370660792759353'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/some-resources-to-help-you-get-started.html' title='Some Resources to Help You Get Started With Grunt.js'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-6965464146035822357</id><published>2013-07-22T01:00:00.000-07:00</published><updated>2013-07-22T11:36:26.083-07:00</updated><title type='text'>Feature removal from mysql following Oracle takeover?</title><content type='html'>I am using MySql 5.5.20 (select&amp;nbsp;@@version). There does not appear to be any difference between explain and explain extended in this version. See &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/explain-extended.html&quot;&gt;here&lt;/a&gt; for the expected output from extended. I don&#39;t know if this is a feature removal that happened after Oracle took over. They seem to be pushing people to buy the enterprise tools. Not an option for some (me included) as I am using Google&#39;s Cloud SQL service. I don&#39;t think it allows this type of monitoring and even if it did it is unlikely that I have access to the knobs to turn to make good on its recommendations.&lt;br /&gt;
My experience of enterprise monitoring is limited as I mainly do dev, not admin. I am usually not around when the dust settles and people start to worry about stuff like monitoring.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I was at a mysql talk given my Oracle last year in Dublin. It was an impressive morning spent explaining the things they had improved in mysql since the purchase. They did not mention removing any handy admin features which might push someone to buy Enterprise Manager, but it would not surprise me.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/6965464146035822357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/feature-removal-from-mysql-following.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/6965464146035822357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/6965464146035822357'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/feature-removal-from-mysql-following.html' title='Feature removal from mysql following Oracle takeover?'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-8858367311698366936</id><published>2013-07-19T09:05:00.001-07:00</published><updated>2013-07-19T09:05:15.998-07:00</updated><title type='text'>Falling off a performance cliff with group_concat in Google Cloud SQL</title><content type='html'>I started to write this article as the performance of some of my mysql queries had gone off a cliff. This was related to my use of the GROUP_CONCAT function. This rolls up a set result set and shows the passed in row values concatenated. Handy for reporting, but not much else. In the highly memory constrained world of Google Cloud SQL using this on a well indexed set of tables (albeit it with multiple left outer joins in place) pushed a regularly executed query for a few hundred milliseconds to 6 to 9 seconds. Disaster.&lt;br /&gt;
I pulled the db over to my dev machine (copy of prod) and ran the query there. No problem. I am concluding that the GROUP_CONCAT was the bad guy here. I found another way to achieve my goal, but this cost me an afternoon and a lot of fretting before I got out of the woods.&lt;br /&gt;
&lt;br /&gt;
MySql is not bad, but occasionally it bites. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/8858367311698366936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/falling-off-performance-cliff-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8858367311698366936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/8858367311698366936'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/falling-off-performance-cliff-with.html' title='Falling off a performance cliff with group_concat in Google Cloud SQL'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-6811749439217699173</id><published>2013-07-18T00:35:00.001-07:00</published><updated>2013-07-18T00:35:11.469-07:00</updated><title type='text'>Good Video on Creating Large JavaScript applications</title><content type='html'>My JavaScript application started out small, but is now getting very big. The main js file is about 3k lines long. Performance is still very good, but I am getting concerned about maintainability. I had been stumbling around in the alphabet soup of javascript tools and libraries for a while and was looking for somethign which would make sense of this.&lt;br /&gt;
I found Addy Osmani&#39;s video on structuring large JavaScript applications very good. I have just watched the first part (23 mins) so far, but it is pitched at my level, so looking forward to the next ones.&lt;br /&gt;
The video is here:&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-6048956f-f0af-c301-345e-bddf3523921c&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;http://addyosmani.com/scalable-javascript-videos/&quot; style=&quot;text-decoration: none;&quot;&gt;http://addyosmani.com/scalable-javascript-videos/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;Addy&#39;s slides are here:&lt;/span&gt;&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-6048956f-f0af-7a5e-b333-7156c6527d5e&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;https://speakerdeck.com/addyosmani/large-scale-javascript-application-architecture&quot; style=&quot;text-decoration: none;&quot;&gt;https://speakerdeck.com/addyosmani/large-scale-javascript-application-architecture&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span&gt;He mentions at one point that he is writing a book on backbone.js development. Here is a link to the book&lt;/span&gt;&lt;br /&gt;
&lt;span id=&quot;docs-internal-guid-6048956f-f0af-52b4-649a-9f3937a223fa&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;https://github.com/addyosmani/backbone-fundamentals&quot; style=&quot;text-decoration: none;&quot;&gt;https://github.com/addyosmani/backbone-fundamentals&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Its free at this link, but you have to build. I will give this a go at some point. You can &lt;a href=&quot;http://shop.oreilly.com/product/0636920025344.do&quot;&gt;buy &lt;/a&gt;the book from O&#39;Reilly too.&lt;br /&gt;
&lt;br /&gt;
He mentions Angular.js a couple of times. I am going to take at look at this next. There is a video on Angular at this year&#39;s IO:&lt;br /&gt;
&lt;span style=&quot;color: #1155cc; font-family: Arial; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=HCR7i5F5L8c&quot; style=&quot;text-decoration: none;&quot;&gt;http://www.youtube.com/watch?v=HCR7i5F5L8c&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;Addy goes through the different types of architectural models MV* an all that. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;This is definitely giving me a steer on putting some structure around some rambling javascript code.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;I don&#39;t want this post to be just a rehash of what Addy said, but I hope the links I have included will add something. The main thing though is to watch the &lt;a href=&quot;http://addyosmani.com/scalable-javascript-videos/&quot;&gt;video&lt;/a&gt;!&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/6811749439217699173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/good-video-on-creating-large-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/6811749439217699173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/6811749439217699173'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/good-video-on-creating-large-javascript.html' title='Good Video on Creating Large JavaScript applications'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3876018023351766162.post-2795624229037046213</id><published>2013-07-16T07:32:00.001-07:00</published><updated>2013-07-16T07:32:39.921-07:00</updated><title type='text'>Good Design Learning Resource</title><content type='html'>I signed up for &lt;a href=&quot;http://hackdesign.org/&quot;&gt;HackDesign&lt;/a&gt; about a week ago and they sent me an email with some links in.&lt;br /&gt;
It took a bit of time to get through it all, but it was worth it. I am always learning new bits of stuff - CSS, Java, SQL you name it, but am rarely satisfied that I am following the right &#39;path&#39;. Not being thorough enough. Resources like HackDesign are the solution to this I reckon. Nice and deep view of a subject - design in this case. There is enough scope for you to click plenty of links and generally learn by doing something other than just reading.&lt;br /&gt;
&lt;a href=&quot;http://developer.yahoo.com/ypatterns/everything.html&quot;&gt;These&lt;/a&gt; Yahoo design patterns for the web were a useful find. I found them through one of the links in one of the articles. And this is only week one.&lt;br /&gt;
&lt;br /&gt;
Now to find similarly deep resources on the other things that I am learning.</content><link rel='replies' type='application/atom+xml' href='http://irishandroid.blogspot.com/feeds/2795624229037046213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://irishandroid.blogspot.com/2013/07/good-design-learning-resource.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2795624229037046213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3876018023351766162/posts/default/2795624229037046213'/><link rel='alternate' type='text/html' href='http://irishandroid.blogspot.com/2013/07/good-design-learning-resource.html' title='Good Design Learning Resource'/><author><name>Anthony Nolan&#39;s blog</name><uri>http://www.blogger.com/profile/14980304412747791362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6IkwWIjyiPU7PB99wHxV_hL-2sgoAs7hreV2CzbwPbt_dMeq8z0t0lPdlRz5t3-jNRV4cB5htrzVdeqgMGZIsSoX_bmTB_rvYQWD6MtxrJn7lbIUoqTEpWzSt8Kwjeg/s220/anthony.jpeg'/></author><thr:total>0</thr:total></entry></feed>