Tag Blogging

Posts: 14

Rebuilding a Blog - Part 1

My whole "buy a roll of film using Google Adsense" experiment is turning out to be an eye opening one. It's eye opening in the sense of scary.

I took a look at my Google Analytics data from the start of this year through June 30th. It's easy to see that my engagement is dwindling away.

When I actually add a trend line, I can confirm that the trend is down.

Further, If I look at the most popular blog posts it's easy to see that it's my RapidMiner Tutorials (milkshake) that brings all the readers to the yard.

Since I'm now spending my time on the RapidMiner Community and won't be posting Tutorials here anymore, I expect this blog to die a very slow and painful death.

Unless I step in and stop it.

How? By rebuilding this blog and remaining relevant.

I'm starting a multi part series on how to rebuild a blog, gather metrics, and measure success. I'll use the revenues I generate from Google Adsense and various conversion rates to gauge how well I'm doing. Of course, I'll add a dash of Data Science in there as well using my favorite tool: RapidMiner.

comments

Your Digital Profile

I think it was back in 2010 when I met up with an old high school classmate. Let's call her "T," and she was in between marketing jobs. I reached out to her because we had an opening for a CMO at my old engineering firm and thought she would be great for it. She had recently worked on some really cool NGO campaigns and I liked her forward thinking. I eventually convinced her to throw her hat in the ring for the CMO gig but that's not the most important thing I learned from our get together.

We met up for drinks at Mustang Harry's on 7th Ave and 33rd Street in NYC and after we caught up on where all our old classmates were and what they were doing, we got to the subject of Marketing and the Internet. She said one thing that is seared into my consciousness to this day, she said "Tom, you have to manage your digital profile before someone does it for you."

Bang. Right in my head.

Manage your Career

I've always told my direct reports (when I had them) that they need to "manage their careers." I always wanted to them to be aware of what they were doing and if it fit into their bigger picture of what they want to be when they "grew up." Why do I bring this up? I was working in engineering at the time and getting your professional engineering (PE) license was always a big deal, but what it really was was a great leveler. Everyone began at the same starting line.

Everyone was at the same point in their career if they got their PE license, it was up to them go as far and as they want to go after that. Some went into very specialized technical areas, others went into management, and even some in academia, but it was ultimately up to them.

Managing your career always felt so mechanical to me. Every silly employee evaluation was always "if X then Y" flow chart and it often meant that you could easily be lost in the crowd. I often saw engineers on the technical path become one of those ubiquitous engineers squirreled in a cubicle somewhere. I often saw an engineer get into project management only to become another ubiquitous project manager that was getting hammered for not making his or her budget. Sometimes, someone rose to Vice President or even the "C suite." Those "lucky" few were the ones that stood out from the rest of the 1000's toiling away. All those 1000's have great ideas and a lot to contribute to the company but NO ONE NOTICES THEM! No one realizes they're even alive. They are just an interchangeable "labor unit." What a shame.

I quickly put 2 and 2 together from T said and realized that I needed to stand out from the crowd. So, I got to work.

Leveraging Social Media

In 2010 LinkedIn was just becoming the behemoth it is today and T told me to build out my profile, start a group, get recommendations, do everything I could to show people that I have something valuable to contribute to what I like to do and want to do. In essence, become a thought leader.

Not only did I take her advice and pimped out my LinkedIn profile, but I attacked writing this blog with new content. I didn't create a LinkedIn group but last year I created Meetup group for Big Data. I actively managed my career from engineering into the startup world, a place I feel at home and super happy. You have to pinch me sometimes because it still feels like a dream to me!

Without sounding like a "self-help" commercial, I believe you too can stand out from the crowd but it will require effort. Tom Wentworth really hammers on these points here in his latest post. Most notably:

Ditch the excuses and start writing. I’ve heard them all: But there’s no time. No one is going to read it. I’ve got nothing important to say. Wrong. The truth is that no matter where you are in your career, someone will benefit from the lessons you have to share.

Check.

Leverage tech vendors and industry conferences to expand your reach. Tech companies are always looking for customers to speak at their customer conferences, roadshows, and webinars. Nearly all of the “top marketers” you see on those lists use their vendor to increase visibility. They will be thrilled to hear from you. Connect with the account management team at your favorite tech vendor to get started.

Check.

Host or attend a local networking event. Peer groups and networking events are a great way to gain reputation and share knowledge. I’m a member of a small peer group of marketing leaders in Boston, and even though we only meet for a few hours or so a quarter, I’ve found the time incredibly valuable. I always walk away with actionable learning, and it’s helped me build a positive reputation among my Boston marketing peers.

Check.

I would suggest to Tom that your digital profile is a big part of this as well but I'm sure he already realizes that, it's baked into a lot of what he blogs about.

How To Get Started

So how can you get started?

  1. Start a blog. Tom and I agree here, you have to write about something you're passionate about and genuinely interested in.
  2. Pimp out your LinkedIn profile. If you don't have one, make one and spend the time to fill it out. This is your online resume and presence.
  3. Update your LinkedIn profile annually. Enough said.
  4. Create a group or join a group. Start or join a group on the topic you're really passionate about and then share your expertise. Provide value and people will refer to you as an expert before you know it.
  5. Always accept an invitation to speak. Remember my post about Toastmasters and writing? Learn to speak in public and you'll go a long way in your life.
  6. Don't be scared to stand out. Standing out from the crowd was exciting, dangerous, and scary all at the same time. We are so conditioned to go with the status quo and not try anything different.
  7. Ignore the haters but accept constructive criticism. Once you do something different or start standing out, you will get push back, and that's to be expected. You will be in the firing line of the critics, the nay sayers, anyone that feels safe in their status quo.
  8. Always invest in yourself. Spend quiet time thinking and trying new things. A successful person thinks different than all the rest.

Now go forth and mange your profile, manage your message, be passionate, and stand out.

comments

Auto Generating Blog Posts with RapidMiner

Lately I've been fooling around with the new Blot.Im blogging engine and decided to see if I could use RapidMiner and some Javascript to auto generate a blog post with a stock chart. Since blot can parse txt, markdown, and HTML files, I decided to see if I can get this to work with an HTML. [~~While Markdown has the ability to parse HTML tags, it can't parse Javascript correctly~~]1. After some pain, I got it to work with Blot, but you can extend this to any type of blogging system that parses HTML.

I designed a RapidMiner process that downloads the historical stock data using three macros: symbol, start_date, and end_date. These macros are help set the parameters in the Yahoo Stock Data operator but were also used to pass thru to the actual Javascript code.

For the stock chart I used the plot.ly library and passed the %{symbol} macro and %{end_date} to the script. For the sake of syncing up the saved CSV file, I had to careful that it was appended with those macros.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process version="7.0.001">
  <context>
    <input/>
    <output/>
    <macros>
      <macro>
        <key>symbol</key>
        <value>VSLR</value>
      </macro>
      <macro>
        <key>end_date</key>
        <value>2016-04-14</value>
      </macro>
      <macro>
        <key>start_date</key>
        <value>2015-10-14</value>
      </macro>
    </macros>
  </context>
  <operator activated="true" class="process" compatibility="7.0.001" expanded="true" name="Process">
    <process expanded="true">
      <operator activated="true" class="quantx1:yahoo_historical_data_extractor" compatibility="1.0.006" expanded="true" height="82" name="Yahoo Historical Stock Data" width="90" x="45" y="34">
        <parameter key="I agree to abide by Yahoo's Terms &amp; Conditions on financial data usage" value="true"/>
        <parameter key="Quick Stock Ticker Data" value="true"/>
        <parameter key="Stock Ticker" value="%{symbol}"/>
        <parameter key="select_fields" value="CLOSE|OPEN|DAY_LOW|DAY_HIGH"/>
        <parameter key="date_format" value="yyyy-MM-dd"/>
        <parameter key="date_start" value="%{start_date}"/>
        <parameter key="date_end" value="%{end_date}"/>
      </operator>
      <operator activated="true" class="sort" compatibility="7.0.001" expanded="true" height="82" name="Sort" width="90" x="179" y="34">
        <parameter key="attribute_name" value="Date"/>
      </operator>
      <operator activated="true" class="rename" compatibility="7.0.001" expanded="true" height="82" name="Rename" width="90" x="313" y="34">
        <parameter key="old_name" value="%{symbol}_OPEN"/>
        <parameter key="new_name" value="open"/>
        <list key="rename_additional_attributes">
          <parameter key="%{symbol}_DAY_HIGH" value="high"/>
          <parameter key="%{symbol}_DAY_LOW" value="low"/>
          <parameter key="%{symbol}_CLOSE" value="close"/>
          <parameter key="Date" value="dates"/>
        </list>
      </operator>
      <operator activated="true" class="select_attributes" compatibility="7.0.001" expanded="true" height="82" name="Select Attributes" width="90" x="447" y="34">
        <parameter key="attribute_filter_type" value="single"/>
        <parameter key="attribute" value="dates"/>
        <parameter key="invert_selection" value="true"/>
      </operator>
      <operator activated="true" class="write_csv" compatibility="7.0.001" expanded="true" height="82" name="Write CSV" width="90" x="581" y="34">
        <parameter key="csv_file" value="C:\Users\tott_000\Dropbox\Apps\Blot\neuralmarket\public\autocharts\%{symbol}_%{end_date}_data.csv"/>
        <parameter key="column_separator" value=","/>
      </operator>
      <operator activated="true" class="text:create_document" compatibility="7.0.000" expanded="true" height="68" name="Plot.ly" width="90" x="45" y="187">
        <parameter key="text" value="&lt;head&gt;&#10;  &lt;!-- Plotly.js --&gt;&#10;  &lt;script src=&quot;https://cdn.plot.ly/plotly-latest.min.js&quot;&gt;&lt;/script&gt;&#10;  &lt;!-- PlotlyFinance.js --&gt;&#10;  &lt;script src=&quot;https://cdn.rawgit.com/etpinard/plotlyjs-finance/master/plotlyjs-finance.js&quot;&gt;&lt;/script&gt;&#10;&#10;&lt;body&gt;&#10;&lt;H1&gt;Today's Chart: %{symbol}&lt;/h1&gt;&#10;&#10;&lt;p&gt;The chart below is created using the Plot.ly JS library. This a daily chart starting from %{start_date} to %{end_date}.&lt;/p&gt;&#10;  &#10;&lt;div id=&quot;myDiv&quot; style=&quot;width: 100%; height: 380px;&quot;&gt;&lt;!-- Plotly chart will be drawn inside this DIV --&gt;&lt;/div&gt;&#10;&lt;script&gt;&#10;   &#9;function makeplot() {&#10;  &#9;Plotly.d3.csv(&quot;http://www.neuralmarkettrends.com/public/autocharts/%{symbol}_%{end_date}_data.csv&quot;, function(data){ processData(data) } );&#10;&#9;};&#10;&#10;&#9;function processData(allRows) {&#10;&#10;  &#9;console.log(allRows);&#10;  &#9;var data_open = [], data_close = [], data_high = [], data_low = [], dates = [];&#10;  &#9;for (var i=0; i&lt;allRows.length; i++) {&#10;   &#9; row = allRows[i];&#10;     data_close.push(parseFloat(row['close']));&#10;     data_high.push(parseFloat(row['high']));&#10;     data_low.push(parseFloat(row['low']));  &#10;     data_open.push(parseFloat(row['open']));&#10; &#9; }&#10;&#9;  makePlotly( data_open, data_close, data_high, data_low ); &#10;&#9;}&#10;&#10;&#10;&#9;function makePlotly( data_open, data_close, data_high, data_low ){&#10;&#9;    var data_dates = getAllDays('%{start_date}', '%{end_date}');&#10;    &#10;&#9;    var fig = PlotlyFinance.createCandlestick({&#10;&#9;    open: data_open,&#10;&#9;    high: data_high,&#10; &#9;    low: data_low,&#10;&#9;    close: data_close,&#10;&#9;    dates: data_dates&#10;&#9;   });&#10;&#10;&#9;fig.layout.title = 'Daily Stock Chart';&#10;&#10;&#9;    fig.layout.annotations = [&#10;&#9;                 {&#10;&#9;                     text: &quot;%{symbol} Stock&quot;,&#10;&#9;                     x: '-0.05',&#10;&#9;                     y: 0.5,&#10;&#9;                     xref: 'paper',&#10;&#9;                     yref: 'paper',&#10;     &#9;                font:{&#10;          &#9;                 size: 18&#10;               &#9;           },&#10;                    &#9; showarrow: false,&#10;&#9;                     xanchor: 'right',&#10;&#9;                     textangle: 270&#10;     &#9;            }&#10;          &#9;      ];&#10;&#10;&#9;Plotly.newPlot('myDiv', fig.data, fig.layout);&#10;&#9;};&#10;&#10;// Utility Function to generate all days&#10;function getAllDays(start, end) {&#10;    var s = new Date(start);&#10;    var e = new Date(end);&#10;    var a = [];&#10;    &#10;    while(s &lt; e) {&#10;        a.push(s);&#10;        s = new Date(s.setDate(&#10;            s.getDate() + 1&#10;        ))&#10;    }&#10;&#10;    return a;&#10;};&#10;&#10;makeplot();&#10;&lt;/script&gt;&#10;&lt;/body&gt;&#10;"/>
      </operator>
      <operator activated="true" class="text:write_document" compatibility="7.0.000" expanded="true" height="82" name="Convert format" width="90" x="179" y="187"/>
      <operator activated="true" class="write_file" compatibility="7.0.001" expanded="true" height="68" name="Write to HTML format (3)" width="90" x="313" y="187">
        <parameter key="filename" value="C:\Users\tott_000\Dropbox\Apps\Blot\neuralmarket\2016\%{end_date}-%{symbol}-chart.html"/>
      </operator>
      <connect from_op="Yahoo Historical Stock Data" from_port="example set" to_op="Sort" to_port="example set input"/>
      <connect from_op="Sort" from_port="example set output" to_op="Rename" to_port="example set input"/>
      <connect from_op="Rename" from_port="example set output" to_op="Select Attributes" to_port="example set input"/>
      <connect from_op="Select Attributes" from_port="example set output" to_op="Write CSV" to_port="input"/>
      <connect from_op="Plot.ly" from_port="output" to_op="Convert format" to_port="document"/>
      <connect from_op="Convert format" from_port="file" to_op="Write to HTML format (3)" to_port="file"/>
      <portSpacing port="source_input 1" spacing="0"/>
      <portSpacing port="sink_result 1" spacing="0"/>
    </process>
  </operator>
</process>

While this works really great, it does have one snag. If you want to display multiple stockcharts, you'd have to figure out a way to update the location of the chart relative to where your blog post is.

This is important if you show more than one post per page. When I generated two posts with two different stockcharts, the HTML made them relative to the top of the page. In other words, the one chart was on top of the other one. I'm sure this is an easy fix but something I'm not going to bother with for this tutorial!


  1. Nope, got it to work in Markdown with the help of https://twitter.com/lllIIlIlIl 

comments

RSS vs Sharing

Trends come and go in the blink of an eye these days. Usually some market disrupter comes along and changes the game with a shiny new thing. Sometimes it's a service or product that gets shutdown. That's exactly what happened here.

This is the story of Google Reader and the rise of Social Sharing.

Before Social Sharing was the "thing", RSS was the life blood of blogging. Many bloggers (myself included) reached thousands of RSS feed readers daily. I had over 1,000 RSS readers during my heyday but over the past few years I watched that number dwindle to maybe 12 people now. What happened? Some of that is because my posting frequency went from a regular daily/weekly cadence to not posting anything for months, and some of it was that I didn't catch the Social Sharing wave.

Blogging was in its heyday sometime between 2011-2012 and new platforms like Tumblr and Posterous appeared. Facebook and Twitter were establishing new territory in the social space and gobbling up users like no tomorrow. I experimented with with them all but there was no real focus with each one of them at that time. The fight for "mindshare" was heated in this space and blogging began to ebb in favor of 140 character tweets and reposting on Tumblr. Existing blogging platforms like Wordpress and Drupal did grow, but morphed themselves into strong content management systems.

The tipping point came in 2013 when Google killed off Google Reader. RSS was still around as a technology but blogging began to fragment. Some bloggers established Twitter accounts, other's went to Tumblr, and some just went to Facebook. Many blogs shutdown or were abandoned. It was just horrible.

Some blogs did survive and some actually embraced these new distribution channels. Suddenly, "Share This" buttons began to appear at the end or at the top of every blog post. You could tweet out a link of an article that you liked and it could be retweeted amongst your followers. You could share another post with your Facebook friends or group members. You could even email the post to co-workers if you chose too. You had complete control over how you wanted to share content. You could consume content and didn't need an RSS feed reader to do it in.

The void that Google Reader left behind quickly filled up with Social Sharing Buttons.

The best part? New conversations emerged! New ideas were shared and blog posts changed from a static entries into living and breathing content. No longer did you have to go to the comment section on a post to interact with the blogger, now you could tweet a link, post to FB, get a social conversation going. Blogging had emerged into a brave new world. It grew up!

Now go share this post. :)

comments

Using Google Analytics

Yesterday I came across a decent high level overview on how to use Google Analytics. I find digital marketing to be an interesting endeavor and you can really extract value out of it if you use advanced analytics. This, of course, means you need to measure how many hits, referrals, and other metrics are coming to your website. This is where Google Analytics is extremely helpful.

While you may not gain more time to take a detailed look at your website’s analytics, the below reports should help you to have a quick way of seeing some new, more useful trends around how users interact with your site. Here are five reports you should start using more. via MediaShift

The article talks about how to use goals and funnels, segments, user flow, events, and the navigation summary. You can also take a moment to read my 2007 articles on building your blog traffic through data mining and excel and how to do SEO. They may be a bit outdated but useful nonetheless.

comments