Friday, April 22, 2016

ImageMagick Help

Version: ImageMagick 6.9.1-0 Q16 x86_64 2015-03-22 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: DPC OpenCL
Delegates (built-in): bzlib fftw jng jpeg lcms lzma png tiff webp xml zlib

Usage: convert [options ...] file [ [options ...] file ...] [options ...] file

Image Settings:
  -adjoin              join images into a single multi-image file
  -affine matrix       affine transform matrix
  -alpha option        activate, deactivate, reset, or set the alpha channel
  -antialias           remove pixel-aliasing
  -authenticate password
                       decipher image with this password
  -attenuate value     lessen (or intensify) when adding noise to an image
  -background color    background color
  -bias value          add bias when convolving an image
  -black-point-compensation
                       use black point compensation
  -blue-primary point  chromaticity blue primary point
  -bordercolor color   border color
  -caption string      assign a caption to an image
  -channel type        apply option to select image channels
  -clip-mask filename  associate a clip mask with the image
  -colors value        preferred number of colors in the image
  -colorspace type     alternate image colorspace
  -comment string      annotate image with comment
  -compose operator    set image composite operator
  -compress type       type of pixel compression when writing the image
  -define format:option
                       define one or more image format options
  -delay value         display the next image after pausing
  -density geometry    horizontal and vertical density of the image
  -depth value         image depth
  -direction type      render text right-to-left or left-to-right
  -display server      get image or font from this X server
  -dispose method      layer disposal method
  -dither method       apply error diffusion to image
  -encoding type       text encoding type
  -endian type         endianness (MSB or LSB) of the image
  -family name         render text with this font family
  -fill color          color to use when filling a graphic primitive
  -filter type         use this filter when resizing an image
  -font name           render text with this font
  -format "string"     output formatted image characteristics
  -fuzz distance       colors within this distance are considered equal
  -gravity type        horizontal and vertical text placement
  -green-primary point chromaticity green primary point
  -intensity method    method to generate intensity value from pixel
  -intent type         type of rendering intent when managing the image color
  -interlace type      type of image interlacing scheme
  -interline-spacing value
                       set the space between two text lines
  -interpolate method  pixel color interpolation method
  -interword-spacing value
                       set the space between two words
  -kerning value       set the space between two letters
  -label string        assign a label to an image
  -limit type value    pixel cache resource limit
  -loop iterations     add Netscape loop extension to your GIF animation
  -mask filename       associate a mask with the image
  -matte               store matte channel if the image has one
  -mattecolor color    frame color
  -moments             report image moments
  -monitor             monitor progress
  -orient type         image orientation
  -page geometry       size and location of an image canvas (setting)
  -ping                efficiently determine image attributes
  -pointsize value     font point size
  -precision value     maximum number of significant digits to print
  -preview type        image preview type
  -quality value       JPEG/MIFF/PNG compression level
  -quiet               suppress all warning messages
  -red-primary point   chromaticity red primary point
  -regard-warnings     pay attention to warning messages
  -remap filename      transform image colors to match this set of colors
  -respect-parentheses settings remain in effect until parenthesis boundary
  -sampling-factor geometry
                       horizontal and vertical sampling factor
  -scene value         image scene number
  -seed value          seed a new sequence of pseudo-random numbers
  -size geometry       width and height of image
  -stretch type        render text with this font stretch
  -stroke color        graphic primitive stroke color
  -strokewidth value   graphic primitive stroke width
  -style type          render text with this font style
  -support factor      resize support: > 1.0 is blurry, < 1.0 is sharp
  -synchronize         synchronize image to storage device
  -taint               declare the image as modified
  -texture filename    name of texture to tile onto the image background
  -tile-offset geometry
                       tile offset
  -treedepth value     color tree depth
  -transparent-color color
                       transparent color
  -undercolor color    annotation bounding box color
  -units type          the units of image resolution
  -verbose             print detailed information about the image
  -view                FlashPix viewing transforms
  -virtual-pixel method
                       virtual pixel access method
  -weight type         render text with this font weight
  -white-point point   chromaticity white point

Image Operators:
  -adaptive-blur geometry
                       adaptively blur pixels; decrease effect near edges
  -adaptive-resize geometry
                       adaptively resize image using 'mesh' interpolation
  -adaptive-sharpen geometry
                       adaptively sharpen pixels; increase effect near edges
  -alpha option        on, activate, off, deactivate, set, opaque, copy
                       transparent, extract, background, or shape
  -annotate geometry text
                       annotate the image with text
  -auto-gamma          automagically adjust gamma level of image
  -auto-level          automagically adjust color levels of image
  -auto-orient         automagically orient (rotate) image
  -bench iterations    measure performance
  -black-threshold value
                       force all pixels below the threshold into black
  -blue-shift factor   simulate a scene at nighttime in the moonlight
  -blur geometry       reduce image noise and reduce detail levels
  -border geometry     surround image with a border of color
  -bordercolor color   border color
  -brightness-contrast geometry
                       improve brightness / contrast of the image
  -canny geometry      detect edges in the image
  -cdl filename        color correct with a color decision list
  -charcoal radius     simulate a charcoal drawing
  -chop geometry       remove pixels from the image interior
  -clamp               keep pixel values in range (0-QuantumRange)
  -clip                clip along the first path from the 8BIM profile
  -clip-path id        clip along a named path from the 8BIM profile
  -colorize value      colorize the image with the fill color
  -color-matrix matrix apply color correction to the image
  -connected-components connectivity
                       connected-components uniquely labeled
  -contrast            enhance or reduce the image contrast
  -contrast-stretch geometry
                       improve contrast by `stretching' the intensity range
  -convolve coefficients
                       apply a convolution kernel to the image
  -cycle amount        cycle the image colormap
  -decipher filename   convert cipher pixels to plain pixels
  -deskew threshold    straighten an image
  -despeckle           reduce the speckles within an image
  -distort method args
                       distort images according to given method ad args
  -draw string         annotate the image with a graphic primitive
  -edge radius         apply a filter to detect edges in the image
  -encipher filename   convert plain pixels to cipher pixels
  -emboss radius       emboss an image
  -enhance             apply a digital filter to enhance a noisy image
  -equalize            perform histogram equalization to an image
  -evaluate operator value
                       evaluate an arithmetic, relational, or logical expression
  -extent geometry     set the image size
  -extract geometry    extract area from image
  -features distance   analyze image features (e.g. contrast, correlation)
  -fft                 implements the discrete Fourier transform (DFT)
  -flip                flip image vertically
  -floodfill geometry color
                       floodfill the image with color
  -flop                flop image horizontally
  -frame geometry      surround image with an ornamental border
  -function name parameters
                       apply function over image values
  -gamma value         level of gamma correction
  -gaussian-blur geometry
                       reduce image noise and reduce detail levels
  -geometry geometry   preferred size or location of the image
  -grayscale method    convert image to grayscale
  -hough-lines geometry
                       identify lines in the image
  -identify            identify the format and characteristics of the image
  -ift                 implements the inverse discrete Fourier transform (DFT)
  -implode amount      implode image pixels about the center
  -interpolative-resize geometry
                       resize image using 'point sampled' interpolation
  -kuwahara geometry   edge preserving noise reduction filter
  -lat geometry        local adaptive thresholding
  -level value         adjust the level of image contrast
  -level-colors color,color
                       level image with the given colors
  -linear-stretch geometry
                       improve contrast by `stretching with saturation'
  -liquid-rescale geometry
                       rescale image with seam-carving
  -magnify             double the size of the image with pixel art scaling
  -mean-shift geometry delineate arbitrarily shaped clusters in the image
  -median geometry     apply a median filter to the image
  -mode geometry       make each pixel the 'predominant color' of the
                       neighborhood
  -modulate value      vary the brightness, saturation, and hue
  -monochrome          transform image to black and white
  -morphology method kernel
                       apply a morphology method to the image
  -motion-blur geometry
                       simulate motion blur
  -negate              replace every pixel with its complementary color
  -noise geometry      add or reduce noise in an image
  -normalize           transform image to span the full range of colors
  -opaque color        change this color to the fill color
  -ordered-dither NxN
                       add a noise pattern to the image with specific
                       amplitudes
  -paint radius        simulate an oil painting
  -perceptible epsilon
                       pixel value less than |epsilon| become epsilon or
                       -epsilon
  -polaroid angle      simulate a Polaroid picture
  -posterize levels    reduce the image to a limited number of color levels
  -profile filename    add, delete, or apply an image profile
  -quantize colorspace reduce colors in this colorspace
  -radial-blur angle   radial blur the image (deprecated use -rotational-blur
  -raise value         lighten/darken image edges to create a 3-D effect
  -random-threshold low,high
                       random threshold the image
  -region geometry     apply options to a portion of the image
  -render              render vector graphics
  -repage geometry     size and location of an image canvas
  -resample geometry   change the resolution of an image
  -resize geometry     resize the image
  -roll geometry       roll an image vertically or horizontally
  -rotate degrees      apply Paeth rotation to the image
  -rotational-blur angle
                       rotational blur the image
  -sample geometry     scale image with pixel sampling
  -scale geometry      scale the image
  -segment values      segment an image
  -selective-blur geometry
                       selectively blur pixels within a contrast threshold
  -sepia-tone threshold
                       simulate a sepia-toned photo
  -set property value  set an image property
  -shade degrees       shade the image using a distant light source
  -shadow geometry     simulate an image shadow
  -sharpen geometry    sharpen the image
  -shave geometry      shave pixels from the image edges
  -shear geometry      slide one edge of the image along the X or Y axis
  -sigmoidal-contrast geometry
                       increase the contrast without saturating highlights or
                       shadows
  -sketch geometry     simulate a pencil sketch
  -solarize threshold  negate all pixels above the threshold level
  -sparse-color method args
                       fill in a image based on a few color points
  -splice geometry     splice the background color into the image
  -spread radius       displace image pixels by a random amount
  -statistic type geometry
                       replace each pixel with corresponding statistic from the
                       neighborhood
  -strip               strip image of all profiles and comments
  -swirl degrees       swirl image pixels about the center
  -threshold value     threshold the image
  -thumbnail geometry  create a thumbnail of the image
  -tile filename       tile image when filling a graphic primitive
  -tint value          tint the image with the fill color
  -transform           affine transform image
  -transparent color   make this color transparent within the image
  -transpose           flip image vertically and rotate 90 degrees
  -transverse          flop image horizontally and rotate 270 degrees
  -trim                trim image edges
  -type type           image type
  -unique-colors       discard all but one of any pixel color
  -unsharp geometry    sharpen the image
  -vignette geometry   soften the edges of the image in vignette style
  -wave geometry       alter an image along a sine wave
  -white-threshold value
                       force all pixels above the threshold into white

Image Sequence Operators:
  -append              append an image sequence
  -clut                apply a color lookup table to the image
  -coalesce            merge a sequence of images
  -combine             combine a sequence of images
  -compare             mathematically and visually annotate the difference between an image and its reconstruction
  -complex operator    perform complex mathematics on an image sequence
  -composite           composite image
  -crop geometry       cut out a rectangular region of the image
  -deconstruct         break down an image sequence into constituent parts
  -evaluate-sequence operator
                       evaluate an arithmetic, relational, or logical expression
  -flatten             flatten a sequence of images
  -fx expression       apply mathematical expression to an image channel(s)
  -hald-clut           apply a Hald color lookup table to the image
  -layers method       optimize, merge, or compare image layers
  -morph value         morph an image sequence
  -mosaic              create a mosaic from an image sequence
  -poly terms          build a polynomial from the image sequence and the corresponding
                       terms (coefficients and degree pairs).
  -print string        interpret string and print to console
  -process arguments   process the image with a custom image filter
  -separate            separate an image channel into a grayscale image
  -smush geometry      smush an image sequence together
  -write filename      write images to this file

Image Stack Operators:
  -clone indexes       clone an image
  -delete indexes      delete the image from the image sequence
  -duplicate count,indexes
                       duplicate an image one or more times
  -insert index        insert last image into the image sequence
  -reverse             reverse image sequence
  -swap indexes        swap two images in the image sequence

Miscellaneous Options:
  -debug events        display copious debugging information
  -distribute-cache port
                       distributed pixel cache spanning one or more servers
  -help                print program options
  -list type           print a list of supported option arguments
  -log format          format of debugging information
  -version             print version information

By default, the image format of `file' is determined by its magic
number.  To specify a particular image format, precede the filename
with an image format name and a colon (i.e. ps:image) or specify the
image type as the filename suffix (i.e. image.ps).  Specify 'file' as
'-' for standard input or output.

Wednesday, April 20, 2016

RubyPlus Podcast 3

Top Links for April 27

1. [Go faster - Benchmarks for your whole Rails app](https://github.com/schneems/derailed_benchmarks 'Go faster - Benchmarks for your whole Rails app')

Tools to benchmark a Rails app. It consists of:

    Static Benchmarking
    Memory used at require time
    Objects created at require time
    Dynamic app benchmarking
    Detecting memory leaks
    Dissecting a memory leak
    Get a heap dump
    My app is slow
    Memory is large at boot
    Is this perf change faster?

2. [Ability to add database comments](https://github.com/rails/rails/pull/22911 'Ability to add database comments')

It is possible to specify comments for tables, columns, and indexes in the database itself now with this addition. It currently works for MySQL and PostgreSQL adapters.

3. [`create_join_table` works with non-integer column types](https://github.com/rails/rails/pull/24221 'create_join_table works with non-integer column types')

Creating a join table with create_join_table helper used to always create the columns with integer type. But now if you want to have uuid columns or any other type, it's possible!

4. [15 Fundamental Laws of Software Development]( http://www.exceptionnotfound.net/fundamental-laws-of-software-development/ '15 Fundamental Laws of Software Development') by Matthew Jones

Linus's Law : "Given enough eyeballs, all bugs are shallow."

Occam's Razor : "Among competing hypotheses, the one with the fewest assumptions should be selected."

Hanlon's Razor : Don't assume people are malicious; assume they are ignorant, and then help them overcome that ignorance. Most people want to learn, not be mean for the fun of it.

The Pareto Principle : Have you even been in a situation where your app currently has hundreds of errors, but when you track down one of the problems, a disproportionate amount of said errors just up and vanish? If you have (and you probably have), then you've experienced the Pareto Principle in action. Many of the problems we see, whether coding, dealing with customers, or just living our lives, share a small set of common root issues that, if solved or alleviated, can cause most or all of the problems we see to disappear.

In short, the fastest way to solve many problems at once is the find and fix their common root cause.

Postel's Law : "Be conservative in what you do, be liberal in what you accept from others."

Hofstadter's Law : Nothing ever goes as planned, so you're better off putting extra time in your estimates to cover some thing that will go wrong, because it unfailingly does.

The 90-90 Rule : "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."

Parkinson's Law : "Work expands so as to fill the time available for its completion."

Dunning-Kruger Effect : "Unskilled persons tend to mistakenly assess their own abilities as being much more competent than they actually are."

5. Ruby 2.3.1 Released: A Bugfix Release. Minor bugfixes, no security fixes.

6. [How to Specify Local Ruby Gems in Your Gemfile](https://rossta.net/blog/how-to-specify-local-ruby-gems-in-your-gemfile.html 'Specify Local Ruby Gems') by Ross Kaffenberger

A look at using the bundle config command to develop against local gems instead of specifying a :path option in your Gemfile.

7. [A Guide to Ruby Gem Post-Install Messages](http://brandonhilkert.com/blog/ruby-gem-post-install-message/ 'Gem Post-Install Messages') by Brandon Hilkert

As gem authors, one of the ways we can provide important information to users of our gems is through post-install messages. This article explores what they are, how to set them up, what to include and when to use them.

8. [Unobtrusive JavaScript via AJAX in Rails](https://blog.codeship.com/unobtrusive-javascript-via-ajax-rails/ 'Unobtrusive JavaScript via AJAX') by Daniel P. Clark

9. [Ruby for Good](http://rubyforgood.org 'Ruby Event'): A Practical Ruby Event in Washington DC, June 16-19
The goal is to build projects that help local communities.

10. [Goruco 2016](http://goruco.com/ 'Ruby Conference')
A One Day Ruby Conference in NYC, June 25th.

11. [Rails 5: What's in It for Me?](https://www.youtube.com/watch?v=ECDX1NH7yWE 'Rails 5') video
An hour long presentation on Rails 5. Check out the podcasts section of rubyplus.com for the link.

12. [Rails 5 officially supports MariaDB](http://blog.bigbinary.com/2016/04/21/rails-5-official-supports-mariadb.html 'Rails 5 officially supports MariaDB') by Vipul

MariaDB is an open source fork of the MySQL database and it acts as a drop-in replacement for MySQL. After the Oracle’s take over of MySQL there was some confusion about the future of MySQL. To remove any ambiguity about whether in future MySQL will remain free or not MariaDB was started. To learn about the advantages MariaDB offers over MySQL checkout the podcasts section for the link to an article which lists 10 reasons to migrate to MariaDB from MySQL.

[Top 10 Reasons to Migrate to MariaDB](https://seravo.fi/2015/10-reasons-to-migrate-to-mariadb-if-still-using-mysql 'Top 10 Reasons to Migrate to MariaDB')



Tuesday, April 12, 2016

Sunday, April 10, 2016

Timeline of Products

2002 Passed UML Certification in May
2003 OOAD Certification Book and Videos $40. Clickbank
2004 a1-truckparts.net                       Adsense
     Started Programming Blog
2005 Static sites like problemsolvingskills.net hosted on hostmysite.com.
2006 Started to work with Rails
2007 12-12 rubyplus.org registered
     12-02 rubyplus.com registered
     Take over Silicon Valley Ruby Meetup
2008 rubyplus.org Jan  29 episodes
     May 2008 Over 75 Rails screencasts According to http://readwrite.com/2008/05/28/15_places_to_find_great_screencasts/
2009 First iPhone App Goes Live
2010 British Accent iPhone App, 3/10 iPad App approved
2011 Finance Site : $10k on content creation goes waste without any adsense revenue. $10k spent in demolition recycling research.
2012 TDD Workshops, In dec, registered clickplan.net
2013 rubyplus.com goes live
     clickplan.net goes live
     Jan clickplan.info blog goes live
2014 Upgrading Rails version and TB3 takes fucking too long and clickplan.net goes offline.
2015 TDD Course and Email Blast for rubyplus.com launch (Replusion vs Attraction), 3/15 TDD Course free coupon Tweets. Jan TDD in Ruby Kindle book published.

2007 July : Outdoor Adventure Club Event Management
2008  or 2009 Abandoned adventurelogic.net ?

Started selling ebooks and videos before the term screencast was coined in 2004. UML certification study guide sold from 2003 to 2006 for $49.99 ooad package and $17 test package.

Dot 1 : 2003

Selling ebook and videos using eBookPro and ClickBank. Learned about order processing and the end to end usage of digital products.

Dot 2 : 2005

Buying AssocTrac to manage affiliates. Learned about how the affiliate management software works and how to track the effectiveness of marketing campaigns. problemsolvingskills.net. Mistake: Developing the product before building the audience. Promotional posts on forums sounded spammy.

Dot 3 : 2007

Launched rubyplus.org. Screencasting with no time limitation and no continuous improvement. No lesson learned.

Dot 4 : 2010

First Mobile app hit. Learned about the power of the Internet in driving sales and the lifetime value of a customer.

Dot 5 : 2011

Read Millionaire in the Fast Lane. Learned how to apply filters to all the business ideas and narrow down to the most promising ideas to execute. 

Fastlane education is about learning specific skills to grow your business skill. Slowlane education is about increasing the intrinsic value of the person being educated.


It opened up the possibility. What if, I could increase my intrinsic skills and use that as the core of my business plan? I can teach other developers how to increase their intrinsic value. If I can help other developers make a six figure income, I can make million a year.

Dot 6 : 2013

First version of ClickPlan goes live. Infopreneur business success template. Learned that SaaS is very similar to selling infoproducts. It differs only in one aspect, the backend sales is not infoproduct but is a software that solves problems.

Dot 7 : 2016

Learned that consistently publishing video podcast that applies time limitation can be very effective in building an audience. Observing other players on how they apply Robert Cialdini's Principles of Persuasion.

It is too much effort to market 1-1. Focus on 1-N. Tweeting to each individual takes more time and money than targeting a few who can share the content with their followers.

Making the Connections

Dot 1 and 2 were the big picture view of the infopreneur business. Dot 4 is the technical 'How to' aspect of creating the product for that market. Dot 5 is the big picture of building a successful SaaS business.

Connect Dot 1-2-4 : 2013
Connect Dot 3-6 : 2016

Missing Pieces / Obstacles

Demo video. Marketing
Dot 4 - Implementation ...
2011
Distracted by Learn Startup crap.


Creating a Rails Engine for jQuery Plugin

Notes from sitepoint.com:


bundle gem pnotifier
Outside the gem directory, create a sample app.

rails new pnotifier

rails g controller site index

gem 'image_zoomer', '0.0.1', path: '/Users/bparanj/work/projects/pnotifier/'

Edit the app/views/site/index.html.erb, replace the content with

<%= Pnotifier::VERSION %>

Start the server and visit http://localhost:3000/site/index. You will see 0.0.1

Create app/assets/javascripts in the gem's root directory. Go to the pnotify plugin Github page https://github.com/sciactive/pnotify/tree/master/dist and grab pnotify.js and place it in the app/assets/javascripts directory.

Create a engine.rb file in lib/pnotifier directory and paste the following code:

module Pnotifer
 class Engine < Rails::Engine
 end
end

In the dummy Rails application open app/assets/javascripts/application.js and append:

//= require pnotifier

Restart the server. Refresh the page.
Open lib/notifier.rb in the gem and paste:

require 'pnotifier/engine'

Restart the server and refresh the browser.
View page source. You will see script tag referencing pnotifier.js.

Create pnotifier_main.js in app/assets/javascripts directory in the gem and paste:

//= require_tree .

Open app/assets/javascripts/application.js in Rails app and replace //= require pnotifier with:

//= require pnotifier_main

Restart the web server, refresh the browser and view page source. Both javascript files from the gem will be there.

Create a file pnotifier_initializer.js in app/assets/javascripts with:


$(function(){
    new PNotify({
        title: 'Regular Notice',
        text: 'Check me out! I\'m a notice.'
    });
});

Refresh the browser. You will the see notifier appear and disappear after some time.

Friday, April 08, 2016

Merge and Reverse Merge

Merge in Ruby works like this:
> options = { buy: true }
 => {:buy=>true}
> options.merge! when: :tomorrow
 => {:buy=>true, :when=>:tomorrow}
> options
 => {:buy=>true, :when=>:tomorrow}
> options.merge! buy: false
 => {:buy=>false, :when=>:tomorrow}
> options
 => {:buy=>false, :when=>:tomorrow}
> options.merge! :when => :today
 => {:buy=>false, :when=>:today}
Reverse Merge in Rails works like this:
 rails c
Loading development environment (Rails 5.0.0.beta3)
 > options = { buy: true }
 => {:buy=>true} 
 > options.reverse_merge! when: :tomorrow
 => {:buy=>true, :when=>:tomorrow} 
 > options
 => {:buy=>true, :when=>:tomorrow} 
 > options.reverse_merge! buy: false
 => {:buy=>true, :when=>:tomorrow} 
 > options
 => {:buy=>true, :when=>:tomorrow} 
 > options.reverse_merge! :when => :today
 => {:buy=>true, :when=>:tomorrow} 

Customize IRB Console

Create ~/.irbrc with:
 IRB.conf[:PROMPT][:MY_PROMPT] = { 
   :AUTO_INDENT => true,
   :PROMPT_I => '> ',               
   :PROMPT_S => nil,              
   :PROMPT_C => nil,             
   :RETURN => " => %s\n"     
 }
 IRB.conf[:PROMPT_MODE] = :MY_PROMPT
This prompt is cleaner. It does not display the ruby version and the line number on each line. Read the Ruby IRB docs.

Thursday, April 07, 2016

Analyzing the Production Log file in Rails 5

Create reports based on your log files. Supports Rails, Apache, MySQL, Delayed::Job, and other formats. 1. gem install request-log-analyzer 2. request-log-analyzer log/production.log Reference Request Log Analyzer

Top Links for Apr 14, 2016

1. Get Your Conference Proposal Accepted by Richard Schneeman.
2. Whitelisting with the lesser-known #presence_in method by Damir Svrtan
3. 9th Rubyconf BrasilRubyconf Brasil has established itself as the largest Ruby conference in Latin America. In 2015 they had more than 1,100 attendees. Well known speakers such as Chad Fowler, David Black, Scott Chacon, Chris Wanstrath, Josh Kalderimis, Koichi Sasada, Charles Nutter, and dozens of others have spoken at our conference. This is your chance to showcase your expertise. Rubyconf Brasil will be at São Paulo, Brazil. The dates are confirmed for September, 23th and 24th so book your flight and hotel right away!
4. Face Recognition using Google Cloud Vision API
5. Ruby Frozen String Literals Do Not Result in Any Performance Improvement by Alexander Dymo  
Reference Prototypical Conference Talks
https://infinum.co/the-capsized-eight/articles/best-ruby-on-rails-refactoring-talks
https://infinum.co/the-capsized-eight/articles/top-8-tools-for-ruby-on-rails-code-optimization-and-cleanup
https://infinum.co/the-capsized-eight/articles/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project
https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

Mountain West  Ruby 2016 videos
Writing a Test Framework From Scratch by Ryan Davis
Drifting Ruby Screencasts

Short URLs Considered Harmful for Cloud Services

Use techniques such as CAPTCHAs to separate human users from automated scanners. I cover how to use Google reCATCHA with Rails 5.

https://www.bitesizebschool.com/ruby-developer-sells-courses-site/

Saturday, April 02, 2016

Specifying Image Dimensions in Markdown

You can use the image tag with custom CSS to specify the width and max-height like this:

<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvgpngQmOv-WoV_xp18ikS-tCHpL5kOdtkoWJ7mqIdvZ0DIUcFZ_bczOCn62H7fqhZCIG1uWliBl-M5OMzNpqYjHpC0j_gNqUOyukJByBUnro59b2gyjeG9bAm-pjI3zg6I7wT/s1600/color-blind5.png" alt="Ruby Plus" style="border: 1px solid #000; max-width:700px; max-height:600px;"/>
This will work if you are using Markdown to render page in a Rails app.

Throttling Network using Chrome


Thursday, March 31, 2016

Installing libv8 on Mac OS

Problem:

xcode-select: Error: No Xcode folder is set. Run xcode-select -switch to set the path to the Xcode folder.

Resolution:

xcode-select --print-path
sudo xcode-select -switch /Developer-3.2.6/Applications/Xcode.app/Contents/MacOS/
gem install therubyracer -v 0.12.2


Rails 5 Generator Help

$rails g helper --help

Usage:
  rails generate generator NAME [options]

Options:
      [--skip-namespace], [--no-skip-namespace]  # Skip namespace (affects only isolated applications)
      [--namespace], [--no-namespace]            # Namespace generator under lib/generators/name
                                                 # Default: true
  -t, [--test-framework=NAME]                    # Test framework to be invoked
                                                 # Default: test_unit

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

Description:
    Stubs out a new generator at lib/generators. Pass the generator name as an argument,
    either CamelCased or snake_cased.

Example:
    `rails generate generator Awesome`

    creates a standard awesome generator:
        lib/generators/awesome/
        lib/generators/awesome/awesome_generator.rb
        lib/generators/awesome/USAGE
        lib/generators/awesome/templates/
        test/lib/generators/awesome_generator_test.rb

Rails 5 Available Generators

Usage: rails generate GENERATOR [args] [options]

General options:
  -h, [--help]     # Print generator's options and usage
  -p, [--pretend]  # Run but do not make any changes
  -f, [--force]    # Overwrite files that already exist
  -s, [--skip]     # Skip files that already exist
  -q, [--quiet]    # Suppress status output

Please choose a generator below.

Rails:
  assets
  channel
  controller
  generator
  helper
  integration_test
  jbuilder
  job
  mailer
  migration
  model
  resource
  scaffold
  scaffold_controller
  task

Coffee:
  coffee:assets

Js:
  js:assets

Kaminari:
  kaminari:config
  kaminari:views

RailsFootnotes:
  rails_footnotes:install

TestUnit:
  test_unit:generator
  test_unit:plugin

ValidatesTimeliness:
  validates_timeliness:install

Tuesday, March 29, 2016

Generating a URL from non sanitized request parameters is insecure!

Kaminari with Rails 5 use:

gem 'kaminari', :git => "git://github.com/amatsuda/kaminari.git", :branch => 'master'

ive_support/i18n_railtie.rb:45:in `map':

will_paginate 3.0.7 is not compatible with Rails 5. Upgrade to will_paginate 3.1.

Friday, March 25, 2016

How to pass custom variables to a partial in Rails 5

Let's say that you want to render the same form partial for creating and editing a project. You can pass a custom value for the button in the form partial like this:

<%= render 'form', project: @project, button_name: 'Create'  %>



You can use the passed in variable in the form partial like this:



<%= form_for(project) do |f| %>
  <% if project.errors.any? %>
   

     

<%= pluralize(project.errors.count, "error") %> prohibited this project from being saved:



     

          <% project.errors.full_messages.each do |message| %>
           
  • <%= message %>

  •       <% end %>
         

   

  <% end %>

    <% if params[:preview_button] %>
      <%= project.description %>
    <% end %>

 

    <%= f.label :name %>
    <%= f.text_field :name %>
 


 

    <%= f.label :description %>
    <%= f.text_area :description %>
 


 

    <%= f.submit button_name %>
    <%= f.submit 'Preview', name:  'preview_button'  %>
   
 

<% end %>

Wednesday, March 23, 2016

Problem Installing libv8 and therubyracer on El Capitan

Error:

.rvm/gems/ruby-2.3.0@blog/gems/libv8-3.16.14.7/ext/libv8/location.rb:36:in `block in verify_installation!': libv8 did not install properly, expected binary v8 archive '/.rvm/gems/ruby-2.3.0@blog/gems/libv8-3.16.14.7/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a'to exist, but it was not found (Libv8::Location::Vendor::ArchiveNotFound)

Resolution:

brew install v8
gem install libv8 -v '3.16.14.7' -- --with-system-v8
bundle update therubyracer


Tuesday, March 22, 2016

How to create a new Rails 5 app

1. gem install rails --pre --no-ri --no-rdoc

2. rails new app-name

How to handle routing errors in Rails 4.2.6

    Step 1
   
    In routes.rb:
   
    match '*unmatched_route', :to => 'application#handle_routing_error', :via => :all
   
    Step 2
   
In application_controller.rb:

    rescue_from ActionController::RoutingError, :with => :handle_routing_error

    def handle_routing_error
      logger.info "No route matches #{params[:unmatched_route]}"
      render nothing: true
    end

Turn on logging to see remote calls made in ActiveResource

ActiveResource::Base.logger = ActiveRecord::Base.logger

Sunday, March 20, 2016

Find the most popular end points in your Rails apps


grep "Parameters:" log/production.log | grep -o '".*"' | sed --r 's/[[:digit:]]*/:id/' | sort | uniq -c

to exclude certain things, pipe to grep -v 'string to exclude'

Saturday, March 19, 2016

Rails Footnotes Gem





Cloudfront favicon error in Rails 4.2.6

[Chrome] [2016-03-18 04:19:04.221] [56b01676-4491-4c4e-9458-666168fb7267] [info] [d1b5oz78c0udqh.cloudfront.net] [182.96.98.1] [session_id : None] [PID-12309] 
ActionController::RoutingError (No route matches [GET] "/favicon.ico"):
  actionpack (4.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.2.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.6) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.6) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.6) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.6) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.2.6) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
  rack (1.6.4) lib/rack/runtime.rb:18:in `call'
  activesupport (4.2.6) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
  actionpack (4.2.6) lib/action_dispatch/middleware/ssl.rb:24:in `call'
  railties (4.2.6) lib/rails/engine.rb:518:in `call'
  railties (4.2.6) lib/rails/application.rb:165:in `call'
  passenger (5.0.25) src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb:97:in `process_request'
  passenger (5.0.25) src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:152:in `accept_and_process_next_request'
  passenger (5.0.25) src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:113:in `main_loop'
  passenger (5.0.25) src/ruby_supportlib/phusion_passenger/request_handler.rb:416:in `block (3 levels) in start_threads'
  passenger (5.0.25) src/ruby_supportlib/phusion_passenger/utils.rb:113:in `block in create_thread_and_abort_on_exception'

Resolution:

In layout file use this:

  <%= favicon_link_tag 'favicon.ico' %>

instead of:

  <%= favicon_link_tag  %>

Thursday, March 17, 2016

SQLite3::ReadOnlyException: attempt to write a readonly database

This happened when the rake tasks were run in one command:

rake db:drop db:migrate db:seed

Solution: Run the commands individually.

List the files that were changed between two branches in Git

 git diff --name-status master..branch-name

Pimp My RailsCasts Series

1. Caching with Instance Variables
2. Dynamic find_by Methods
3. Find Through Association
4. Move Find into Model
5. Using with_scope
6. Shortcut Blocks with Symbol to_proc
7. All About Layouts
8. Layouts and content_for
9. Filtering Sensitive Logs
10. Refactoring User Name Part 1
11. Refactoring User Name Part 2
12. Refactoring User Name Part 3
13. Dangers of Model in Session
14. Performing Calculations on Models
15. Fun with Find Conditions
16. Virtual Attributes
17. HABTM Checkboxes
18. Looping Through Flash
19. Where Administration Goes - Not revised
20. Restricting Access - Not revised
21. Super Simple Authentication - Not revised
22. Eager Loading - Coming soon
23. Counter Cache Column
24. The Stack Trace
25. SQL Injection
26. Hackers Love Mass Assignment
27. Cross Site Scripting
28. in_groups_of
29. group_by Month
30. Pretty Page Title
31. Formatting Time
32. Time in Text Field
33. Making a Plugin
34. Named Routes

Tuesday, March 15, 2016

Rails 5 New Project Options

$ rails new --help
Usage:
  rails new APP_PATH [options]

Options:
  -r, [--ruby=PATH]                                      # Path to the Ruby binary of your choice
                                                         # Default: /Users/bparanj/.rvm/rubies/ruby-2.3.0/bin/ruby
  -m, [--template=TEMPLATE]                              # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                              # Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                         # Default: sqlite3
  -j, [--javascript=JAVASCRIPT]                          # Preconfigure for selected JavaScript library
                                                         # Default: jquery
      [--skip-gemfile], [--no-skip-gemfile]              # Don't create a Gemfile
  -B, [--skip-bundle], [--no-skip-bundle]                # Don't run bundle install
  -G, [--skip-git], [--no-skip-git]                      # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                  # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]  # Skip Action Mailer files
  -O, [--skip-active-record], [--no-skip-active-record]  # Skip Active Record files
  -P, [--skip-puma], [--no-skip-puma]                    # Skip Puma related files
  -C, [--skip-action-cable], [--no-skip-action-cable]    # Skip Action Cable files
  -S, [--skip-sprockets], [--no-skip-sprockets]          # Skip Sprockets files
      [--skip-spring], [--no-skip-spring]                # Don't install Spring application preloader
      [--skip-listen], [--no-skip-listen]                # Don't generate configuration that depends on the listen gem
  -J, [--skip-javascript], [--no-skip-javascript]        # Skip JavaScript files
      [--skip-turbolinks], [--no-skip-turbolinks]        # Skip turbolinks gem
  -T, [--skip-test], [--no-skip-test]                    # Skip test files
      [--dev], [--no-dev]                                # Setup the application with Gemfile pointing to your Rails checkout
      [--edge], [--no-edge]                              # Setup the application with Gemfile pointing to Rails repository
      [--rc=RC]                                          # Path to file containing extra configuration options for rails command
      [--no-rc], [--no-no-rc]                            # Skip loading of extra configuration options from .railsrc file
      [--api], [--no-api]                                # Preconfigure smaller stack for API only apps

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

Rails options:
  -h, [--help], [--no-help]        # Show this help message and quit
  -v, [--version], [--no-version]  # Show Rails version number and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

    You can specify extra command-line arguments to be used every time
    'rails new' runs in the .railsrc configuration file in your home directory.

    Note that the arguments specified in the .railsrc file don't affect the
    defaults values shown above in this help message.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.

Wednesday, March 09, 2016

Symbol to_proc Hack

Usually, when we create a proc, the proc object captures the variables that is in the creation context. However, in Symbol#to_proc,  the object obj that is in:

Proc.new {|obj| obj.send(self) }

is not in the surrounding context of the proc object. At this point there is no 'obj' object. So, within the Symbol class to_proc method, there is no obj. When the & ampersand trigger is executed, the map method yields a block variable, this block variable gets associated to the obj object. This is a subtle concept. We can bind values to the block variable in the proc object at run-time. This is a very powerful concept we can use when we develop libraries.


Tuesday, March 08, 2016

Trace Route on Mac OS

$ traceroute www.rubyplus.com

traceroute to www.rubyplus.com (198.58.102.13), 64 hops max, 52 byte packets
 1  10.33.0.1 (10.33.0.1)  0.760 ms  0.245 ms  0.252 ms
 2  209.133.4.85 (209.133.4.85)  0.456 ms  0.522 ms  0.516 ms
 3  ae5.cr2.sjc2.us.zip.zayo.com (64.125.26.21)  2.386 ms  4.013 ms  3.053 ms
 4  ae16.mpr4.sjc7.us.zip.zayo.com (64.125.31.15)  1.757 ms  1.909 ms  1.868 ms
 5  209.133.4.46 (209.133.4.46)  1.914 ms  1.945 ms  1.971 ms
 6  ae0.bbr02.cs01.lax01.networklayer.com (173.192.18.151)  10.292 ms  10.630 ms  10.217 ms
 7  ae7.bbr01.cs01.lax01.networklayer.com (173.192.18.166)  10.367 ms  10.220 ms  10.698 ms
 8  ae19.bbr01.eq01.dal03.networklayer.com (173.192.18.140)  40.263 ms  37.674 ms  40.394 ms
 9  po31.dsr02.dllstx3.networklayer.com (173.192.18.227)  38.005 ms  37.520 ms  40.913 ms
10  po32.dsr02.dllstx2.networklayer.com (70.87.255.70)  41.327 ms  37.968 ms
    po31.dsr01.dllstx2.networklayer.com (70.87.255.66)  40.557 ms
11  po1.car02.dllstx2.networklayer.com (70.87.254.82)  37.646 ms
    po2.car01.dllstx2.networklayer.com (70.87.254.78)  37.714 ms
    po2.car02.dllstx2.networklayer.com (70.87.254.86)  41.112 ms
12  router2-dal.linode.com (67.18.7.94)  37.950 ms  40.729 ms
    router1-dal.linode.com (67.18.7.90)  41.317 ms
13  www.rubyplus.com (198.58.102.13)  41.468 ms  41.386 ms  37.602 ms

Dependency Inversion Principle Example from The RSpec Book

The code example for Codebreaker game from The Rspec Book. The solution in the book that does not apply the DIP

Before

module Codebreaker
  class Game
    def initialize(output)
      @output = output
    end

    def start(secret)
      @secret = secret
      @output.puts 'Welcome to Codebreaker!'
      @output.puts 'Enter guess:'
    end
  end
end

g = Codebreaker::Game.new($stdout)
g.start('sekret')

The solution after applying the DIP.

After

module Codebreaker
  class Game
    def initialize(writer)
      @writer = writer
    end

    def start(secret)
      @secret = secret
      @writer.write 'Welcome to Codebreaker!'
      @writer.write 'Enter guess:'
    end
  end
end

class StandardConsole
  def write(message)
    $stdout.puts(message)
  end 
end

writer = StandardConsole.new
g = Codebreaker::Game.new(writer)
g.start('sekret')

List Untracked Files in Git

git ls-files --others --exclude-standard

You can chain this to xargs:

git ls-files --others --exclude-standard | xargs git rm

to remove those files.

Monday, March 07, 2016

Dependency Inversion Principle

The article

The Three Basic Rules for a Good Design

illustrates the Dependency Inversion Principle in action by using a simple example. It applies three simple rules:

  1. Separate things that change from things that stays the same. Encapsulate what varies behind a well-defined interface.
  2. Program to interfaces, not implementations. This exploits polymorphism.
  3. Depend on abstractions. Do not depend on concrete classes.
to satisfy Dependency Inversion Principle. 

Storage mechanisms such as PersonMemoryStore and PersonFileStore have a well defined interface called records. The mechanisms to send the message such as GreetingConsole and GreetingPony have a well defined interface call send. Classes that implement a specific storage or sending email now conform to a uniform interface. This gives us the ability to switch implementation in different combinations. The classes that implement specific way of doing things depend on stable abstractions, records and send that we came up with in the final design.

Saturday, March 05, 2016

Compress Custom Web Fonts in Rails 4.2.5 Apps

 The easiest way to compress custom web fonts in a Rails 4.2.5 app is to use Amazon Cloudfront. In your Cloudfront configuration, select Yes for Compress Objects Automatically.


Here you can see the result of Web Page Performance Test for RubyPlus after the Custom Web fonts has been compressed. It takes 30 minutes or so for the cloudfront configuration changes to take effect.

Amazon Docs

Friday, March 04, 2016

Caching Database Results in Rails 4.2.5

If you make the same database calls  within any one request, Rails will cache the database result. You don't need to use use ||= to cache the value.
  def show
    Article.find(params[:id])
    Article.find(params[:id])
  end

You can see that the cache is hit in the log file:

Started GET "/articles/1" for ::1 at 2016-03-03 16:42:13 -0800
Processing by ArticlesController#show as */*
  Parameters: {"id"=>"1"}
  Article Load (0.1ms)  SELECT  "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT  "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT 1  [["id", "1"]]
  Rendered articles/show.html.erb within layouts/application (0.3ms)
Completed 200 OK in 25ms (Views: 24.0ms | ActiveRecord: 0.1ms)

From  the Caching with Rails guide.

SQL Caching

Query caching is a Rails feature that caches the result set returned by each query so that if Rails encounters the same query again for that request, it will use the cached result set as opposed to running the query against the database again.

Thursday, March 03, 2016

Compress all Assets using GZip

In production.rb:

use Rack::Deflater

https://remino.net/rails-html-css-js-gzip-compression/

Wednesday, March 02, 2016

Compress Html to Improve Rails 4.2.5 App Performance

1. Add htmlcompressor gem to Gemfile.

group :production do
  gem 'htmlcompressor'
end

Run bundle install.

2. In production.rb:

  config.middleware.use HtmlCompressor::Rack

3. Deploy and enjoy the speed.


GTmetrix.com test score for html compression went up. But the performance went down. The page load time went up to 2.1 seconds from 1.7 seconds.

Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.

This error happens if any of the directory in which you are running rails new has some rails directory structure. Resolution: Go to a directory that does not have any rails directory structure.

Can the genius Rails committers provide the resolution as part of the error message please?

Tuesday, March 01, 2016

Using Asset Pipeline for Favicons in Rails 4.2.5

1. Copy icon images to app/assets/images folder.

2. Use favicon_link_tag helper. Default image name : favicon.ico.
   
      <%= favicon_link_tag %>
  <%= favicon_link_tag 'apple-touch-icon-57x57.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "57x57" %>
  <%= favicon_link_tag 'apple-touch-icon-60x60.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "60x60" %>
  <%= favicon_link_tag 'apple-touch-icon-72x72.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "72x72" %>
  <%= favicon_link_tag 'apple-touch-icon-76x76.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "76x76" %>
  <%= favicon_link_tag 'apple-touch-icon-114x114.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "114x114" %>    
  <%= favicon_link_tag 'apple-touch-icon-120x120.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "120x120" %>
  <%= favicon_link_tag 'apple-touch-icon-144x144.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "144x144" %>
  <%= favicon_link_tag 'apple-touch-icon-152x152.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "152x152" %>
  <%= favicon_link_tag 'apple-touch-icon-180x180.png', rel: 'apple-touch-icon', type: 'image/png', sizes: "180x180" %>
  <%= favicon_link_tag 'favicon-32x32.png', rel: 'icon', type: 'image/png', sizes: "32x32" %>          
  <%= favicon_link_tag 'android-chrome-192x192.png', rel: 'icon', type: 'image/png', sizes: "192x192" %>          
  <%= favicon_link_tag 'favicon-96x96.png', rel: 'icon', type: 'image/png', sizes: "96x96" %>          
  <%= favicon_link_tag 'favicon-16x16.png', rel: 'icon', type: 'image/png', sizes: "16x16" %>            


3. Verify by viewing the page source.

  <link rel="shortcut icon" type="image/x-icon" href="https://d1b5oz78c0udqh.cloudfront.net/assets/favicon-0784d42434f39fe96f3736f3e47d1e9f.ico" />
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-57x57-1f87fa73399b81c63cf77fee620b3f25.png" sizes="57x57" />
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-60x60-421e797d9dc30906f3876c0bf72c8e98.png" sizes="60x60" />
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-72x72-53f33feccdeb7a9428d3bfd3f9fdcb5c.png" sizes="72x72" />  
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-76x76-8d6db4af70c6c952ffbc34e742035187.png" sizes="76x76" />  
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-114x114-308d3819dfb621285ab6368f672a72fb.png" sizes="114x114" />      
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-120x120-15eedd3461f483a5b27828fa9ed789de.png" sizes="120x120" />  
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-144x144-5759a401867e2dfe239149695d7cd081.png" sizes="144x144" />  
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-152x152-9f15e1c9218a79ee781a128e8bfba79a.png" sizes="152x152" />  
  <link rel="apple-touch-icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/apple-touch-icon-180x180-2fc81325eec91ad63efb7d10ae0e1089.png" sizes="180x180" />  
  <link rel="icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/favicon-32x32-e6eebf5633792e63508f58260cfc98c6.png" sizes="32x32" />            
  <link rel="icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/android-chrome-192x192-b03a39be430b547b8448857ef3ed1960.png" sizes="192x192" />            
  <link rel="icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/favicon-96x96-93f5bc8d5e587ff2a07f4f6ea8349b09.png" sizes="96x96" />            
  <link rel="icon" type="image/png" href="https://d1b5oz78c0udqh.cloudfront.net/assets/favicon-16x16-ecb043d6bec4bf88aa1435bfa04000c2.png" sizes="16x16" />              

This should take the CDN for all static assets score from 90/100 to 100/100 on WebPageTest.