├── .gitignore ├── spec ├── spec_helper.rb ├── rss_spec.rb └── sample_feed.xml ├── features ├── rss_parsing.feature └── steps │ └── rss_steps.rb ├── Rakefile ├── README.rdoc ├── rss_parser.gemspec └── lib └── rss_parser.rb /.gitignore: -------------------------------------------------------------------------------- 1 | pkg 2 | doc 3 | Manifest -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'spec' 3 | Spec::Runner.configure do |config| 4 | config.mock_with :mocha 5 | end 6 | 7 | $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) 8 | require 'rss_parser' 9 | -------------------------------------------------------------------------------- /features/rss_parsing.feature: -------------------------------------------------------------------------------- 1 | Feature: RSS feeds parsing 2 | In order to display my blog posts on another web page 3 | I want to be able to parse RSS feeds 4 | 5 | Scenario: Parse an RSS feed that does not require authentication 6 | Given the RSS feed on address "http://jan.flempo.com/feed" 7 | When the feed is retrieved and parsed 8 | Then the title of the first item should be the same as when parsed with the Simple RSS library 9 | And the link of the second item should be the same as when parsed with the Simple RSS library -------------------------------------------------------------------------------- /features/steps/rss_steps.rb: -------------------------------------------------------------------------------- 1 | require "#{File.dirname(__FILE__)}/../../lib/rss_parser" 2 | require 'spec' 3 | require 'simple-rss' 4 | require 'open-uri' 5 | 6 | Given /^the RSS feed on address "(.*)"$/ do |url| 7 | @url = url 8 | end 9 | 10 | When /the feed is retrieved and parsed/ do 11 | @feed = RssParser.parse(@url) 12 | end 13 | 14 | Then /^the title of the first item should be the same as when parsed with the Simple RSS library$/ do 15 | SimpleRSS.parse(open(@url)).entries.first.title.should == @feed.items.first.title 16 | end 17 | 18 | Then /^the link of the second item should be the same as when parsed with the Simple RSS library$/ do 19 | SimpleRSS.parse(open(@url)).entries[1].title == @feed.items[1].link 20 | end 21 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | $:.unshift(File.join(File.dirname(__FILE__), 'lib')) 2 | 3 | require 'rubygems' 4 | require 'rake' 5 | require 'echoe' 6 | 7 | Echoe.new('rss_parser', '0.1.0') do |p| 8 | p.description = "Simple RSS parser that supports feeds with HTTP Basic Authentication" 9 | p.url = "http://github.com/honza/rss_parser" 10 | p.author = "Jan Kubr" 11 | p.email = "jan.kubr@gmail.com" 12 | p.ignore_pattern = ["tmp/*", "script/*"] 13 | p.runtime_dependencies = ['nokogiri'] 14 | p.development_dependencies = ['cucumber', 'rspec', 'mocha', 'simple-rss'] 15 | end 16 | 17 | Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext } 18 | 19 | 20 | require 'cucumber/rake/task' 21 | Cucumber::Rake::Task.new do |t| 22 | t.cucumber_opts = "--format pretty" 23 | end 24 | 25 | -------------------------------------------------------------------------------- /README.rdoc: -------------------------------------------------------------------------------- 1 | = About 2 | This is a very simple RSS parser that supports feeds protected by HTTP Basic Authentication. 3 | 4 | = Installation 5 | sudo gem install jankubr-rss_parser 6 | 7 | = Usage 8 | require 'rss_parser' 9 | 10 | @entries = RssParser.parse('http://twitter.com/statuses/friends_timeline/16901911.rss', 'jankubr', 'fake').items 11 | 12 | <% @entries.each do |entry| %> 13 | <%= link_to entry.title, entry.link %>: 14 | <%= entry.description %> 15 | <% end %> 16 | 17 | = License 18 | Copyright © 2008 Jan Kubr 19 | 20 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 21 | 22 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 23 | 24 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /rss_parser.gemspec: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | 3 | Gem::Specification.new do |s| 4 | s.name = %q{rss_parser} 5 | s.version = "0.1.0" 6 | 7 | s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version= 8 | s.authors = ["Jan Kubr"] 9 | s.date = %q{2009-01-23} 10 | s.description = %q{Simple RSS parser that supports feeds with HTTP Basic Authentication} 11 | s.email = %q{jan.kubr@gmail.com} 12 | s.extra_rdoc_files = ["lib/rss_parser.rb", "README.rdoc"] 13 | s.files = ["features/rss_parsing.feature", "features/steps/rss_steps.rb", "lib/rss_parser.rb", "Rakefile", "README.rdoc", "spec/rss_spec.rb", "spec/sample_feed.xml", "spec/spec_helper.rb", "Manifest", "rss_parser.gemspec"] 14 | s.has_rdoc = true 15 | s.homepage = %q{http://github.com/honza/rss_parser} 16 | s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rss_parser", "--main", "README.rdoc"] 17 | s.require_paths = ["lib"] 18 | s.rubyforge_project = %q{rss_parser} 19 | s.rubygems_version = %q{1.3.1} 20 | s.summary = %q{Simple RSS parser that supports feeds with HTTP Basic Authentication} 21 | 22 | if s.respond_to? :specification_version then 23 | current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION 24 | s.specification_version = 2 25 | 26 | if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then 27 | s.add_runtime_dependency(%q, [">= 0"]) 28 | s.add_development_dependency(%q, [">= 0"]) 29 | s.add_development_dependency(%q, [">= 0"]) 30 | s.add_development_dependency(%q, [">= 0"]) 31 | s.add_development_dependency(%q, [">= 0"]) 32 | else 33 | s.add_dependency(%q, [">= 0"]) 34 | s.add_dependency(%q, [">= 0"]) 35 | s.add_dependency(%q, [">= 0"]) 36 | s.add_dependency(%q, [">= 0"]) 37 | s.add_dependency(%q, [">= 0"]) 38 | end 39 | else 40 | s.add_dependency(%q, [">= 0"]) 41 | s.add_dependency(%q, [">= 0"]) 42 | s.add_dependency(%q, [">= 0"]) 43 | s.add_dependency(%q, [">= 0"]) 44 | s.add_dependency(%q, [">= 0"]) 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /spec/rss_spec.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), 'spec_helper') 2 | 3 | describe RssParser do 4 | it "should parse feeds that require authentication" do 5 | #should start request 6 | http = stub 7 | Net::HTTP.expects(:start).yields(http) 8 | #response should be success and return sample XML with feed 9 | response = Net::HTTPSuccess.new('', '', '') 10 | response.expects(:body).returns(sample_feed_content) 11 | http.expects(:request).returns(response) 12 | #should do basic HTTP authorization 13 | request = stub 14 | Net::HTTP::Get.expects(:new).returns(request) 15 | request.expects(:basic_auth).with('user', 'password') 16 | 17 | feed = RssParser.parse('url', 'user', 'password') 18 | 19 | feed.items.first.title.should == 'A book read: My Startup Life by Ben Casnocha' 20 | feed.items[1].link.should == 'http://jan.flempo.com/2008/12/17/focus-on-incremental-improvements/' 21 | end 22 | 23 | it "should parse feeds that redirect" do 24 | #should start request 25 | http = stub 26 | Net::HTTP.expects(:start).yields(http) 27 | #first response should be redirect 28 | response = Net::HTTPRedirection.new('', '', '') 29 | #second response should be success and return sample XML with feed 30 | second_response = Net::HTTPSuccess.new('', '', '') 31 | second_response.expects(:body).returns(sample_feed_content) 32 | response.expects(:[]).with('location').returns('url2') 33 | http.expects(:request).times(2).returns(response).then.returns(second_response) 34 | 35 | feed = RssParser.parse('url') 36 | 37 | feed.items.first.title.should == 'A book read: My Startup Life by Ben Casnocha' 38 | feed.items[1].link.should == 'http://jan.flempo.com/2008/12/17/focus-on-incremental-improvements/' 39 | end 40 | 41 | it "should use url with queries" do 42 | #should start request 43 | http = stub 44 | Net::HTTP.expects(:start).yields(http) 45 | #response should be success and return sample XML with feed 46 | response = Net::HTTPSuccess.new('', '', '') 47 | response.expects(:body).returns(sample_feed_content) 48 | http.expects(:request).returns(response) 49 | 50 | RssParser.any_instance.expects(:prepare_request).with('/?feed=rss2') 51 | RssParser.parse('http://www.wordpress/?feed=rss2') 52 | end 53 | 54 | def sample_feed_content 55 | return @xml if @xml 56 | File.open(File.join(File.dirname(__FILE__), 'sample_feed.xml')) {|f| @xml = f.read} 57 | @xml 58 | end 59 | end -------------------------------------------------------------------------------- /lib/rss_parser.rb: -------------------------------------------------------------------------------- 1 | require 'net/http' 2 | require 'uri' 3 | require 'ostruct' 4 | require 'time' 5 | 6 | require 'nokogiri' 7 | 8 | class Feed 9 | attr_accessor :items 10 | attr_accessor :title, :link, :description, :generator, :language 11 | 12 | def initialize(title, link, description) 13 | @title = title 14 | @link = link 15 | @description = description 16 | @items = [] 17 | end 18 | 19 | def item(params) 20 | @items << OpenStruct.new(params) 21 | end 22 | end 23 | 24 | class RssParser 25 | attr_accessor :feed 26 | 27 | def self.parse(url, user = nil, password = nil) 28 | rss = new(url, user, password) 29 | rss.process 30 | rss.feed 31 | end 32 | 33 | def initialize(url, user, password) 34 | @url = URI.parse(url) 35 | @user = user 36 | @password = password 37 | end 38 | 39 | def process 40 | Net::HTTP.start(@url.host, @url.port) do |http| 41 | # FIXME (Did): handle url like "http://www.example.com/?feed=rss2" used by Wordpress for instance 42 | path = @url.path 43 | path << "?#{@url.query}" if @url.query 44 | 45 | data = get_data(http, prepare_request(path)) 46 | @feed = parse(data) 47 | end 48 | end 49 | 50 | private 51 | 52 | def get_data(http, request, limit = 10) 53 | raise "Too many redirects" if limit == 0 54 | response = http.request(request) 55 | case response 56 | when Net::HTTPSuccess 57 | response.body 58 | when Net::HTTPRedirection 59 | get_data(http, prepare_request(response['location']), limit - 1) 60 | else 61 | response.error! 62 | end 63 | end 64 | 65 | def prepare_request(path) 66 | request = Net::HTTP::Get.new(path) 67 | request.basic_auth(@user, @password) if @user 68 | request 69 | end 70 | 71 | def parse(xml) 72 | # puts xml.inspect 73 | 74 | doc = Nokogiri::XML(xml) 75 | 76 | # puts doc.inspect 77 | 78 | title = sub_element(doc, 'rss/channel/title') 79 | link = sub_element(doc, 'rss/channel/link') 80 | description = sub_element(doc, 'rss/channel/description') 81 | feed = Feed.new(title, link, description) 82 | doc.xpath('//rss/channel[1]//item').each do |item| 83 | title = sub_element(item, 'title') 84 | link = sub_element(item, 'link') 85 | description = sub_element(item, 'description') 86 | pub_date = Time.parse(sub_element(item, 'pubDate')) 87 | feed.item(:title => title, :description => description, 88 | :link => link, :pub_date => pub_date) 89 | end 90 | feed 91 | end 92 | 93 | def sub_element(element, name) 94 | element.xpath("#{name}[1]").first.content 95 | end 96 | end 97 | 98 | -------------------------------------------------------------------------------- /spec/sample_feed.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | on freedom 13 | 14 | http://jan.flempo.com 15 | 16 | Wed, 24 Dec 2008 10:19:14 +0000 17 | 18 | http://wordpress.org/?v=MU 19 | en 20 | hourly 21 | 1 22 | 23 | http://www.gravatar.com/blavatar/e6844f03975112fad4fc43bbe0dd041e?s=96&d=http://s.wordpress.com/i/buttonw-com.png 24 | 25 | on freedom 26 | http://jan.flempo.com 27 | 28 | 29 | A book read: My Startup Life by Ben Casnocha 30 | http://jan.flempo.com/2008/12/18/a-book-read-my-startup-life-by-ben-casnocha/ 31 | http://jan.flempo.com/2008/12/18/a-book-read-my-startup-life-by-ben-casnocha/#comments 32 | 33 | Thu, 18 Dec 2008 09:19:50 +0000 34 | Jan Kubr 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | http://jan.flempo.com/?p=182 55 | 56 | 57 |

This book is a story about Ben Casnocha’s experiences with starting a software startup. He was very young when he started it (13), but that is not at all why you should read this book. It is full of valuable advice on how to get a company off the ground and is especially valuable for someone who is more on the technical side of things - like me.

58 |

What to build

59 |

How do you choose what to build? Ben has an interesting observation:

60 |

“Some problems require ‘vitamins’ - that is, a product that’s ‘nice to have.’ Some issues require ‘antibiotics’ which means they’re mission-critical problems. Most profitable businesses solve mission-critical problems, or the ‘must-haves’.”

61 |

Sell, sell, sell

62 |

Ben focused on selling their product from almost the day one, although it was only a “beta” written by a cheap programmer. He didn’t want to wait until the product was “perfect.” If it provides good value to its customers, try to sell it to as many people as possible. Generate revenue that you can then invest back to the product to make it better.

63 |

Sounds cheesy. But many people are ashamed of early versions of their product and don’t want to offer it to customers (or to charge them for it) until they finish this feature. When that’s done, there is another crucial piece of functionality that needs to be added. And that goes on until the company disappears because there is no money to keep it alive. Sell what is good enough and make it better over time. In Ben’s words:

64 |

“Isn’t developing software the core competency of the business? It’s actually not that simple. In the early goings, it can be better to ship less-than-perfect software and focus on selling, selling, selling, rather than making perfect software.”

65 |

“Good enough is a key principle in entrepreneurship. If your aim is ‘perfect,’ the future is so far away it may be hard to get going.”

66 |

However, you can’t be only “good enough” in everything, then you end up being mediocre. The trick is to choose in what you need to be great and where “good enough” is - well - good enough! Making these decisions will also help you decide when to save money and buy something cheap (maybe a desk) and when demand fine quality (business cards, chairs for programmers).

67 |

Good programmers are hard to find

68 |

Creating a software product is everything but easy. As Ben noticed, “Do you want it cheap, fast, or good? Choose two, says the old engineering adage.” And a related observation: “Technology start-ups take note: when a programmer isn’t on the founding team, it is difficult to find engineers who are both high quality and affordable.”

69 |

What to charge?

70 |

How much to charge your customers? Think about how much the customer’s problems you are solving are costing. If you replace one person’s week of work, then her salary for that week is about what you should charge.

71 |

B-plan or not?

72 |

Should you write a business plan even you don’t need it for any investors? Interesting observation by Ben: “The best business plans do more for you than for others by clarifying your own thinking.”

73 |

Get out of your office!

74 |

Ben says it is critical to get face time with (potential) customers, especially in the beginning. You need to learn as much as you can about your customers’ problems and generally about the market you are in. Also they will trust you more if they see you in person. He encourages you to get out of your office and talk to people! (And by the way: “The two best moments to receive high-quality feedback from people are when they are hired and fired.”) But beware: “True innovation rarely sprouts from customer feedback, but good products must be informed by it.”

75 |

How to become better

76 |

And what Ben thinks you can do as a person to become (more) successful with your company?

77 |

“People who get stuff done think about the short-term feature. (…) People who get stuff done ‘dream’ and ‘talk’ as much as the next guy, but they share these dreams and ideas with others. (…) People who get stuff done begin. Taking that first step can be the hardest. Act now! (…) Do you want to be known as a doer or a talker? Do you want to start businesses or just talk about starting businesses?”

78 |

Don’t let failures stop you:

79 |

“Ups and downs are the definitive indication that you are doing something entrepreneurial. If your records is spotless, then you haven’t been an entrepreneur. If the only mistakes you’ve made are on school papers or in mishandling a report in a big corporation, those aren’t spots. It’s the spots from the school of hard knocks that matter. (…) With practice you’ll learn to see failure as just feedback for improvement.”

80 |

Maximize luck by exposing yourself to randomness:

81 |

“Attend conferences no one else is attending. Read books no one else is reading. Talk to people no one else is talking to.”

82 |

Trick yourself:

83 |

“Self-deception is essential for high self-esteem. It’s OK to take more credit than you deserve, in you own mind, for successes. It’s OK to think that you can outwork and outpassion anyone who competes with you. It’s OK to attribute soaring victories to a tireless work ethic. It’s OK if these are slight exaggerations. After all, how many people attribute ‘good luck’ to their wins? Far fewer than those who attribute ‘bad luck’ to their losses! Stay humble, especially on the outside, but consider yourself (privately) as unstoppable.”

84 |        ]]>
85 | http://jan.flempo.com/2008/12/18/a-book-read-my-startup-life-by-ben-casnocha/feed/ 86 | 87 | 88 | Jan Kubr 89 | 90 |
91 | 92 | 93 | Focus on incremental improvements 94 | http://jan.flempo.com/2008/12/17/focus-on-incremental-improvements/ 95 | http://jan.flempo.com/2008/12/17/focus-on-incremental-improvements/#comments 96 | Wed, 17 Dec 2008 10:30:17 +0000 97 | Jan Kubr 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | http://jan.flempo.com/?p=180 106 | 108 |

There will be no breakthrough that will suddenly fulfil your goal for you. There are only many small steps that take you closer to completion. And no one will walk that path for you. Focus on incremental improvements; don’t forget about your end goal, but learn to improve the status quo gradually. Don’t skip steps.

109 |        ]]>
110 | http://jan.flempo.com/2008/12/17/focus-on-incremental-improvements/feed/ 111 | 112 | 113 | 114 | Jan Kubr 115 | 116 |
117 | 118 | My last week’s best and worst pieces of entertainment 119 | http://jan.flempo.com/2008/11/24/my-last-weeks-best-and-worst-pieces-of-entertainment/ 120 | 121 | http://jan.flempo.com/2008/11/24/my-last-weeks-best-and-worst-pieces-of-entertainment/#comments 122 | Mon, 24 Nov 2008 08:19:43 +0000 123 | Jan Kubr 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | http://flempo.wordpress.com/?p=177 138 | 139 |

You already know from me that Venture Voice is the best podcast on Earth (on entrepreneurship, at least), but you don’t know yet that its latest episode with Jeff Stewart is the best episode so far (quote: “The way you create wealth is by creating wealth for everybody.”). This might be the first and last episode of any podcast I’ll ever listen to more than once.

140 |

I’ve written about Michel Houellebecq’s book The Possibility of an Island before and although I wasn’t too excited about it, I think it’s worth spending the time to read it. But if you ever ever come across the movie that is based on this book, don’t even think about wasting your time watching it. It is by far the worst movie I’ve ever seen. Although I read the book, I have no idea what the movie is supposed to be about; it has no plot and no ending. Even though this is a 2008 movie, it’s full of boring long shots as if you were watching a movie from the seventies. Eh, to make it short, watch something else or read the book.

141 |        ]]>
142 | 143 | http://jan.flempo.com/2008/11/24/my-last-weeks-best-and-worst-pieces-of-entertainment/feed/ 144 | 145 | 146 | Jan Kubr 147 | 148 |
149 | 150 | Learning is annoying 151 | 152 | http://jan.flempo.com/2008/11/12/learning-is-annoying/ 153 | http://jan.flempo.com/2008/11/12/learning-is-annoying/#comments 154 | Wed, 12 Nov 2008 08:13:39 +0000 155 | Jan Kubr 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | http://flempo.wordpress.com/?p=174 164 | 166 |

It is so uncomfortable not knowing something and not pretending you don’t need or want to know it. You are like a kid again, you are not this i-know-everything adult. You’re not an expert anymore, you are one of the newbies you sometimes laugh about.

167 |

You need to start over. With the technology you’ve worked with for the past three years, you need to read very little to get on top of the new stuff. You don’t need to read a whole book about it because most of its content is already something you know. With the new technology though, you need to read not only books, but also every shitty blog post that comes along. Just to cover the field. You need to try and fail and try again. Everything takes longer than you were used to.

168 |

It can be annoying and painful, but certainly not boring. And it is the single most important thing in your professional life. Without learning you can just die now.

169 |        ]]>
170 | http://jan.flempo.com/2008/11/12/learning-is-annoying/feed/ 171 | 172 | 173 | Jan Kubr 174 | 175 | 176 |
177 | 178 | Simple tip on how to be awesome in anything 179 | http://jan.flempo.com/2008/11/11/simple-tip-on-how-to-be-awesome-in-anything/ 180 | http://jan.flempo.com/2008/11/11/simple-tip-on-how-to-be-awesome-in-anything/#comments 181 | Tue, 11 Nov 2008 10:19:27 +0000 182 | 183 | Jan Kubr 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | http://flempo.wordpress.com/?p=170 192 | 194 | 195 |

10,000 hours of practice will get you anywhere.

196 |        ]]>
197 | http://jan.flempo.com/2008/11/11/simple-tip-on-how-to-be-awesome-in-anything/feed/ 198 | 199 | 200 | Jan Kubr 201 | 202 |
203 | 204 | What building web apps is all about 205 | 206 | http://jan.flempo.com/2008/11/07/what-is-building-web-apps-all-about/ 207 | http://jan.flempo.com/2008/11/07/what-is-building-web-apps-all-about/#comments 208 | Fri, 07 Nov 2008 13:43:32 +0000 209 | Jan Kubr 210 | 211 | 212 | 213 | 214 | 215 | http://flempo.wordpress.com/?p=168 216 | 225 |

Building web applications is all about these five things:

226 |
    227 |
  1. Usefulness
  2. 228 |
  3. Usability
  4. 229 |
  5. Efficiency
  6. 230 |
  7. Security
  8. 231 |
  9. Balance
  10. 232 |
233 |        ]]>
234 | http://jan.flempo.com/2008/11/07/what-is-building-web-apps-all-about/feed/ 235 | 236 | 237 | Jan Kubr 238 | 239 | 240 |
241 | 242 | SEO is bullshit 243 | http://jan.flempo.com/2008/11/01/seo-is-bullshit/ 244 | http://jan.flempo.com/2008/11/01/seo-is-bullshit/#comments 245 | Sat, 01 Nov 2008 21:45:50 +0000 246 | Jan Kubr 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | http://flempo.wordpress.com/?p=166 256 | 258 |

SEO is using deodorant instead of washing.

259 |        ]]>
260 | http://jan.flempo.com/2008/11/01/seo-is-bullshit/feed/ 261 | 262 | 263 | 264 | Jan Kubr 265 | 266 |
267 | 268 | A book read: A Whole New Mind by Daniel H. Pink 269 | http://jan.flempo.com/2008/10/27/a-book-read-a-whole-new-mind-by-daniel-h-pink/ 270 | 271 | http://jan.flempo.com/2008/10/27/a-book-read-a-whole-new-mind-by-daniel-h-pink/#comments 272 | Mon, 27 Oct 2008 21:16:01 +0000 273 | Jan Kubr 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | http://flempo.wordpress.com/?p=160 284 | 287 |

I usually don’t skip pages. Usually.

288 |

In the beginning of this book Daniel explains the difference about the two hemispheres of our brains as scientists see them today. I know you know it, but you still can watch this video about Jill Bolte Taylor’s stroke; it will fill the gaps.

289 |

Then he explains how skills driven by the right hemisphere (design, story-telling, synthesis, empathy, play, and [deeper] meaning) will be more appreciated that those controlled by the left one since they can be easily automated or cheaply outsourced.

290 |

Is there anything surprising in this book? No. Is there any reason you should pick this book over Friedman’s The World Is Flat? No. Do I have the slightest idea why Seth Godin recommended this book? Hell no.

291 |

Fortunately I am reading a very interesting book now; stay tuned for the next review.

292 |        ]]>
293 | http://jan.flempo.com/2008/10/27/a-book-read-a-whole-new-mind-by-daniel-h-pink/feed/ 294 | 295 | 296 | Jan Kubr 297 | 298 | 299 |
300 | 301 | Personal development education 2.0 302 | http://jan.flempo.com/2008/10/16/personal-development-education-20/ 303 | http://jan.flempo.com/2008/10/16/personal-development-education-20/#comments 304 | Thu, 16 Oct 2008 13:52:29 +0000 305 | 306 | Jan Kubr 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | http://flempo.wordpress.com/?p=162 315 | 317 | 318 |

I sort of stopped reading books about personal development. Now Coach TV is my self development education. Try to watch a few videos, you might like it.

319 |        ]]>
320 | http://jan.flempo.com/2008/10/16/personal-development-education-20/feed/ 321 | 322 | 323 | Jan Kubr 324 | 325 |
326 | 327 | Telfa in the final of the Startup Show contest! 328 | 329 | http://jan.flempo.com/2008/10/12/telfa-in-the-final-of-the-startup-show-contest/ 330 | http://jan.flempo.com/2008/10/12/telfa-in-the-final-of-the-startup-show-contest/#comments 331 | Sun, 12 Oct 2008 11:59:51 +0000 332 | Jan Kubr 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | http://flempo.wordpress.com/?p=156 343 | 345 |

Telfa (our telephone exchange / call center solution) is in the final of Startup Show! Startup Show is a contest being held as part of WebExpo, a Prague’s conference about web technologies.

346 |

I’m far from overestimating this thing, but being able to present the product to a room (hopefully not too empty one..) of web enthusiasts is better than.. well, not to do it.. Feedback is important and this is a way how to get it for free. Not to mention it is free advertising as well. Now imagine we even meet some new customers..

347 |

I just can’t find any cons here apart from the fact that we’ll need to work even harder on this the next week.. Pretty amazing stuff.

348 |        ]]>
349 | http://jan.flempo.com/2008/10/12/telfa-in-the-final-of-the-startup-show-contest/feed/ 350 | 351 | 352 | 353 | Jan Kubr 354 | 355 |
356 |
357 |
--------------------------------------------------------------------------------