How do you launch a startup when you don’t have any technical experience?

Honee wrote this on 26 May 2015

There are a lot of success stories we can read online about non-technical founders that started out with a great idea and have successfully grown their startup into a profitable company even if they don’t have a technical background. A few list of non-technical founders are marketers, real estate brokers, teachers, public relations officers, financial analysts and more. Then we ask how did they do it? How did they manage to build their idea into a working product without any technical expertise?

I listed below some options that non-technical founders look for or avail that might be relevant to you too.

1. Find a technical co-founder

It is very common to hear that it is often best to have a technical partner and co-founder to work with you in your startup. So you try to recruit someone you think you know might be capable. This person might be someone you meet in a tech conference, tech meetups, tech events or other networking events.

However, trying to start a business venture with someone you don’t fully know might be a pain in the head in the long run. You have already given the person an equity, or have planned long-term (hoping the startup works out), but in tough times, you’ll never know if you’ll encounter issues. There are a lot of stories about co-founder falling-out. So be aware of this scenario before you look for your technical co-founder.

2. Buy ready-made software or template

There are a lot of sites that you can find a ready-made software or template in Themeforest or other providers. This is a good start considering it is cheaper. However, when you want to customize the pages, you still have to look for a developer to help you make the changes. The tricky part here is where to find a good developers to help you set-up. The worst case here is if you found the wrong developer, the budget you have allocated to release version 1 may not be enough.

3. Outsource the work online by getting freelancers or remote developers

Websites like Upwork (formerly known as Odesk), Elance, Freelancer has a pool of remote developers that can help you build your MVP (Minimum Viable Product). However, choose your freelancers wisely. Make sure you find people who are proven to provide quality work. You can ask for some references or look at their recent works to help you assess.

4. Hire a team as a technical partner

Another way for a non-technical founder to launch his/her product idea is to hire a team as a technical partner. The cost depends on your project scope however, you basically have the control on the scope of what you will build. This could be a good option to consider especially when you already have a solid business model for your startup idea.

One of the benefits of having a technical partner to work with you is they can help put structure to your idea starting from the planning phase to deployment phase of your product since they have already built their development processes. You don’t have to worry looking for skills and expertise on specific things like server set-up, payment integration etc. anymore.

These are just some ideas for you to consider as a non-technical founder and it truly depends on the kind of idea you have or the stage of the your startup idea. If you have some questions, clarifications or other insights, please feel free to comment below or send us an email directly. I’d be happy to hear some of your thoughts on this.


Angular JS Redirecting to another page

Ademar wrote this on 14 Oct 2014

I needed a way to redirect to another page inside an AngularJS controller, specifically after successfully submitting a form to the server.

There are lots of ways to do this, one way is to call window.location, however I wanted a more “angular” way of doing it.

Good thing I found out about $location.

What does $location do?

The $location service parses the URL in the browser address bar (based on the window.location) and makes the URL available to your application. Changes to the URL in the address bar are reflected into $location service and changes to $location are reflected into the browser address bar.

Source: https://docs.angularjs.org/guide/$location

How to implement an AngularJS redirect with $location?

Call $location.path('url/of/target') to any part your angular controller.

Here’s an example which redirects to another page after successfully submitting a form:

this.submitPropertyInfo = function() {
      var newProperty = new Property(this.propertyInfo);
      newProperty.$save(newProperty, function(data) {
        if( data.success == true) {
          $location.path("/property/edit/" + data.property_id + "/housing-visit-schedule");
        } else {
          // Notify user for error
        }
      });
    };

Be sure to load the $location module in your angular application.

P.S. If you are starting out AngularJS and still unfamiliar how to load $location. Here’s how you do it:

angular.module('app', [])
  .controller('createPropertyCtrl', ['$location',
  function($location) {
  	// Insert your code here.
  }
  ]);

Source: http://www.ademartutor.com/angular-js-redirecting-to-another-page/


ng-model not working on radio button in AngularJS

Ademar wrote this on 08 Oct 2014

I needed to create a form that requires a dynamic list of radio buttons. To implement this I used ng-repeat.

The code looked something liked this:

<div class="radio" ng-repeat="d in days">
    <label >
      <input type="radio" name="days" id="" ng-model="daySelected" ng-value="d">
      
    </label>
  </div>

The problem was the model daySelected did not get the correct value of the selected radio option.

This is becase ng-repeat creates its own scope. What we need to do is assign the value to the parent scope from the child scope.

This is how we implement it:

<div class="radio" ng-repeat="d in days">
    <label >
      <input type="radio" name="days" id="" ng-model="$parent.daySelected" ng-value="d">
      
    </label>
  </div>

Source: http://www.ademartutor.com/ng-model-not-working-on-radio-button-in-angularjs/

Source: http://www.ademartutor.com/angular-js-redirecting-to-another-page/


Freelance Blend: Successful Freelancing and Entrepreneurship

Ademar wrote this on 14 Jul 2014

I was invited by Marv De Leon to talk about Freelancing and Entrepreneurship on his podcast FreelanceBLEND.

You can view the full blog here: http://www.freelanceblend.com/fbp-026-successful-freelancing-and-entrepreneurship-with-ademar-tutor-of-codetoki/

I had a really fun time talking with Marv. Hopefully the listeners of FreelanceBLEND would learn something from the things that I’ve shared.

Source: http://www.ademartutor.com/freelance-blend-successful-freelancing-and-entrepreneurship/


Decorators for Views in Rails

Ademar wrote this on 17 Aug 2013

What are Decorators? Decorators help extract view-specific business logic from models into decorator class. Here is an example code that puts view-specific business logic in the model:


app/models/user.rb

class User
  include Mongoid::Document

  def is_top_twenty?
    User.desc(:points).limit(20).include? self
  end
end

app/controllers/profiles_controllers.rb

class ProfilesController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
end

app/views/profiles/show.html.erb

<% if @user.is_top_twenty? %>
  <%= "#{@user.name} is in the top twenty" %>
<% end %>

The problem with this code is that the method ‘is_top_twenty?’, which is only being used in the view is being declared in the User model. The User model is polluted with view-related logic.

One way to refactor this is to use decorators. By using decorators. we can remove the ‘is_top_twenty?’ method out of the model User and create a a UserDecorator class.


app/decorators/user_decorator.rb

class UserDecorator
  attr_reader :user

  def initialize(user)
    @user = user
  end

  def is_top_twenty?
     User.desc(:points).limit(20).include? user
  end
end

Instead creating an instance variable of the User model in the controllers, we create an instance of UserDecorator class.


app/controllers/profiles_controllers.rb

class ProfilesController < ApplicationController
  def show
    user = User.find(params[:id])
    @user_decorator = UserDecorator.new(user)
  end
end

Now let’s see this in action on the view.


app/views/profiles/show.html.erb

<% if @user_decorator.is_top_twenty? %>
  <%= "#{@user_decorator.name} is in the top twenty" %>
<% end %>

The code above will return an error since we don’t have the method for name yet. To fix this, you need to implement ‘method_missing’ function.


app/decorators/user_decorator.rb

class UserDecorator
  attr_reader :user

  def initialize(user)
    @user = user
  end

  def is_top_twenty?
     User.desc(:points).limit(20).include? user
  end

  def method_missing(method_name, *args, &block)
    post.send(method_name, *args, &block)
  end
end

That’s it! Good luck on cleaning up your models.


Thinner Models with PORO

Ademar wrote this on 15 Aug 2013


Single Responsibility Principle



The Rails convention is to put your business logic should be on the models. Here’s a typical example:


app/controllers/users_controller.rb

class UsersController < ApplicationController
  def suspend
    @user = User.where(user_id: params[:id]).first
    @user.suspend!
    redirect_to @users, notice: 'Successfully suspended user!'
  end
end

app/controllers/user.rb

class User
  include Mongoid::Document

  def suspend!
    update_attributes(banned: true)
    solutions.each { |s| s.update_attributes(hide: true) 
    profile.update_attributes(hide: true)
  end
end

The problem with this code is that too much logic is cluttered into a single method on the model. This makes your code harder to read and maintain.

One way to refactor your code is to break suspend! into multiple methods:


app/models/user.rb

class User
  include Mongoid::Document

  def suspend!
    ban_user!
    hide_solutions!
    hide_profile!
  end

  def ban_user!
    update_attributes(banned: true)
  end

  def hide_solutions! 
    solutions.each { |s| s.update_attributes(hide: true) 
  end

  def hide_profile!
    profile.update_attributes(hide: true)
  end

end

The problem with this code is that class does too many things (too much logic inside a single class) which breaks the Single Responsibility Principle.

The best way to do this is to put the unique business logic of suspending a user on a new class ‘UserSuspension’. Take note that the new class doesn’t have to be an ActiveRecord (Mongoid Document). This class can be a PORO (Plain Old Ruby Object).


app/models/user_suspension.rb

class UserSuspension
  def initialize(user)
    @user = user
  end

  def create
    ban_user!
    hide_solutions!
    hide_profile!
  end

  private
    def ban_user!
      update_attributes(banned: true)
    end

    def hide_solutions! 
      solutions.each { |s| s.update_attributes(hide: true) 
    end

    def hide_profile!
      profile.update_attributes(hide: true)
    end
end

The main advantage of putting this unique business logic on a PORO makes this class responsible for only one thing. It makes it easier to read and maintain your code.

Now on our controller, let’s see the PORO in action.


app/controllers/users_controller.rb

class UsersController < ApplicationController
  def suspend
    @user = User.where(user_id: params[:id]).first
    suspension = UserSuspension.new(@user)
    suspension.create!
    redirect_to @users, notice: 'Successfully suspended user!'
  end
end

Using PORO helps your Rails application become more modular and easier to maintain.


Create a Perfect Facebook Post

Donna wrote this on 08 Aug 2013


 Facebook has become one of the most powerful marketing platform for businesses


Today, Facebook has become one of the most powerful marketing platform for businesses. It allows a business to reach a wider audience, about 1.15 billion users around the world.This kind of platform also allow businesses to interact with its existing and potential customers.

That’s why creating the perfect post is important. A Facebook post would help maximize reach and engagement to users. It is very critical to create the right post since most of the time Facebook users spend much time on the newsfeed rather than your Facebook page.

So,here are 4 tips that will help you create the perfect post:


 Facebook has become one of the most powerful marketing platform for businesses


1. The Image
  • An image is vital to a Facebook post.
  • Pick an image that can be intriguing and engaging.
  • Choose an image that will attract users. An attractive image is important so that you can grab the attention of your users in a newsfeed full of clutter.
  • Study suggest that “images are always the top performing post type”


#####2. The Copy

  • A copy shows how a post is important to your audience.
  • This should be short and personal.


#####3. The Link

  • Put the link next to your copy.
  • Once you attract your audience with your image and your copy is well written, the greater chance your audience will click on the link.


#####4. The Engagement

  • Keep track on the number of users that got engaged on your post. (Likes, Comments, Shares)
  • The more people get engaged in your post, this assures you that some people will also see it.


After doing these steps, you can keep track of your post by trying the Facebook analytics. This offers an “Actionable Insights” which allows you to see when your Facebook fans are online and what types of posts do they prefer.


ETags in Rails 4

Ademar wrote this on 15 Jul 2013

What are ETags?

ETag or entity tag is part of HTTP that is assigned by a web server to a specific version of a resource found at URL. In other words, ETAG is a key we use to determine whether a page has changed.

ETags in action

Here’s a diagram on how etags works:


How ETags work in rails


Here’s a breakdown of how ETags works in Rails:

First Request 1. Render the entire response body 2. Create an ETag by doing a MD5 hash on the entire response body:

header[Etag] = Digest::MD5.hexdigest(body)
  1. Send back to the client the response body and ETag included in the response

Second Request on the same page 1. Render the entire response body 2. Create ETag by doing a MD5 has on the entire response body

header[Etag] = Digest::MD5.hexdigest(body)
  1. Compares ETag with what was sent over and what it generated
  2. If ETags match then the response body is not included in the response, only the 304 response code

Custom ETags

Every time the server gets a request from client, it re-renders the page to generate the Etag, which is not that efficient. The solution for this is to create your own custom Etags with fresh_when method.

class ProfilesController < ApplicationController
    def show
      @profile = Profile.find(params[:id])
      fresh_when(@profile) # Sets the etag equal to the cache key
    end
  end

fresh_when method creates a MD5 hash of the model

headers['Etag'] = Digest::MD5.hexdigest(@item.cache_key)

The cache_key is a combination of the model name, id and updated_at attribute.

'<model name>/<id>-<updated_at>'
  'profile/2-201322415000'

Creating Custom ETag

Here’s a breakdown of how our custome ETag works: First Request 1. Create an Etag from the model 2. Renders the entire response body 3. Send back to the client the response body and ETag

Second Request 1. Fetches the model 2. Create an ETag from the model 3. Compare the generated ETag from the one received from client 4. If ETags match then the response body is not included in the response, only the 304 response code

Declarative ETags

Etags can be generated with multiple arguments. Which may something like this:

class ProfilesController < ApplicationController
    def show
      @profile = Profile.find(params[:id])
      fresh_when([@profile, curernt_user.id])
    end
  end


If we have multiple actions in our controller using ETags with multiple arguments, our code may end up looking like this:

class ProfilesController < ApplicationController
    def show
      @profile = Profile.find(params[:id])
      fresh_when([@profile, curernt_user.id])
    end

    def edit
      @profile = Profile.find(params[:id])
      fresh_when([@profile, curernt_user.id])
    end 
  end


To make our code more DRY, we’ll use declarative ETags. Declarative ETags allows us to declare an ETag on top of our controller:

class ProfilesController < ApplicationController
    etag { current_user.id }
    def show
      @profile = Profile.find(params[:id])
      fresh_when(@profile)
    end

    def edit
      @profile = Profile.find(params[:id])
      fresh_when(@profile)
    end 
  end


That’s it! Hopefully you’ve learned how to use ETags on your Rails 4 applications.


Marketing on Facebook

Donna wrote this on 25 Nov 2012

As of March 2013, Facebook has reached 1.11 billion active monthly users in their site. With its large amount of active users, Facebook evolved from a place to meet friends into a venue for marketing different products and services to their possible customers. As a result, Facebook has become a powerful marketing tool to attract and get connected with their customers.

Here are some ways on how to use facebook for marketing

  1. Create a Facebook Page
    • Customize your Facebook Page
      • Add videos and images -- People would appreciate browsing on your product offerings
      • Look for an attractive cover photo -- Visually interesting cover photos can capture people’s attention. This would allow people to take a closer look at your page
      • Use a relevant profile picture -- Be sure to use a profile picture that would reflect your brand. This would help people easily recognize your brand.
    • Put details in the ABOUT section
      • Allows audience to easily understand your page
    • Create contents in your page
      • Put informative contents -- Creates interest to target audiences as they get to read things that they are fascinated about.
      • Put infographics -- Relays complex information quickly to target audience, fun to read and easy to understand
    • Promote Facebook Page
      • Connect your Website and Blog with your Facebook Page. Use Facebook social plugins to let people directly "like" your page from your website or blog.
  2. Have Facebook Ads
    • Having Facebook Ads:
      • increase likes and website clicks
      • allows demographic targeting, ad testing, setting ad budgets and has performance measurement tools
    • How to make it work?
      • Set Goal and Metrics -- Define a measurable goal to ensure that your campaign will lift the right part of your business
      • Define Audience -- Facebook allows targeting based on:
        • Location/Geography
        • Language Spoken
        • Gender
        • Age
        • Relationship Status
        • Education Level
        • Interests
        • Workplace
      • Specify Messaging
        • Ad messages should be clear and direct to the point
        • Include Call to Action
        • Ads should be consistent with the tone and language of the landing page
      • Specify Image
        Images should:
        • be static
        • have dimensions should not be greater than 110 pixels wide x 80 pixels
        • match with the ad message
      • Set Schedule and budget
        • Set date and end date of Ad campaign - can schedule ads during certain times of the day but days of the week can’t be specified
        • Choose from a daily budget option or lifetime campaign budget
      • Test Ads
        • test ads to achieve greatest results
        • What to test?
          • Title
          • Ad Copy
          • Image
          • Landing Page
          • Audience Attributes
          • Ad Schedule
          • CPC vs. CPM
          • Budget and bid price
  3. Get your Facebook Posts Promoted
    • increases specific post reach and impressions
    • Easy to setup and owner pays a flat rate
    • Follow the 20% rule -- promoted pages should include no more 20 % text
      • be sure to pick captivating images
      • message should be chosen wisely (it would only take up 20 % of your post!)
  4. Have Sponsored Stories
    • Goal: Have user to take an action similar to their friends
    • Strategies:
      • Page Post Story -- publishes the latest post as the sponsored story, includes a “share” icon which allow fans to share it with their friends
      • Page “Like” Story -- when a user “Likes” your Facebook Page, you can use this as a sponsored story, includes a “Like” icon for the user’s friends to like
      • Page Post “Like” Story -- one of your page fans “Liked” one of your posts, you can use this to let their friends know about the “Liked” action
      • Check-in Story-- this would include a “Like” icon for friends of the person who checked-in or claimed a deal to like your page
      • Domain Story -- use “Likes” and “Shares” content from your website as sponsored stories
  5. Do Facebook Exchange
    • Allows advertisers to target audience based on web history data or data collected outside from Facebook
    • If a user visits a product page of a certain website, but fails to purchase, the seller can display an ad of the product on Facebook using Facebook Exchange

Y4iT comes to Cebu

Honee wrote this on 25 Nov 2012

Last November 22 - 23, 2012 the biggest IT event in the Philippines comes to Cebu. The Philippine Youth Congress on Information Technology or commonly called as Y4iT (Youth for IT) is an annual event hosted by UP Information Technology Development Center (UPITDC) that provides a venue to experience activities and hear talks about IT and IT-related topics from various speakers in the different fields in IT to hone the global competence of IT practitioners.

Together with CeBuinIT, they organized the very first Y4iT outside Luzon.



Y4IT



Around 3,000 IT students from different schools in Visayas and Mindanao from Leyte, Iloilo, Surigao, Aklan and more came here to Cebu to experience Y4iT. It was great to see the enthusiastic faces and high energy of the participants.



Y4IT



It was also a privilege for us to be invited to speak about our startup experience.



Y4IT



Ademar ended his talk with this line, “Love what you do”.



Y4IT



It was a great experience for everyone. We learned a lot from the speakers and inspired us to work harder. I hope the students also learned something.



Y4IT



As what Mr. Jerry Rapes, President and CEO of Exist, shared to all of us, “You only need 3 things to succeed in IT: a computer, internet connection and the thing between your ears”.


Explore Bootyard Blog by Topic