Posts

Karl Oscar Weber

Capsule

Capsule

In January 2024, I was laid off. It was sudden, and extremely rude. I found out during standoff. Soon after my work accounts stopped working. I had poured so much into that job. The people, and the environment. I worked really hard to make it a great place for the folks on the team, and to support them any way that I could. But all for naught.

That's alright, time to learn and move forward. I spent a couple of weeks trying to figure out what was next for me. What am I really good at and what do I want to do? You know, besides the necessity to pay for rent, utilities, and food. Also I have a wife and 4 kids. Gotta provide for them too. It's kinda important.

After a while I figured out what I wanted to do. Everything.

Everything?

Friends, I'm serious. I really like Art and Design stuff, been doing it on the side for like 20 years. Over the last couple of years I've gone through an existential change in how I see things. "Why the fuck not?!?!" Is often going through my mind. I'm more confident than I've ever been and it fucking shows. I'm just getting better at my job.

So the thing I want to do for the next 40 years is a subscription studio. I call it Capsule.

Capsule is everything

There's been this concept going around of agencies or studios delivering unlimited design services for a flat monthly fee. A retainer basically, but not really. It's a subscription. Usually a subscriber is limited to one "request" or task at a time. So that the provider of services can rotate through their clients, Deliver value, then await for feedback.

I think this model is pretty cool. Paid upfront, the price is low enough that it can be a subscription, and all the work I can handle. It's pretty swell. Actually.

The only way to get better/faster.

Is to do more work. That's it. Quantity == Quality. Rise and Grind my friends. I'm pretty good at my job, but I want to be even better. Fast and Furious. The only path I see to doing that is straight through. Do as much work as I can, as fast as I can. So that's what Imma do.

Capsule has 3 plans, Rocket, Pro, and Bell Grande. The Rocket plan offers Art, Design, and websites. That's front end work writing HTML and CSS. Pro Also offers Ruby and iOS development, and Bell Grande is just 3 times bigger than Pro. It's like having a small startup team working for you furiously. The prices are $999, $1,999, and $5,999. But all the plans are 50% off for the first 10 customers or until the launch month ends, whichever comes first. So it's way cheaper and it's like an 83% discount off my normal rate. It would be crazy not to subscribe, CRAZY! The discount lasts until you cancel. It's that simple.

Anyways friends. That's what I'm doing. Capsule, Get some.


Karl Oscar Weber

I started writing a programming language

Hi friends,

I started writing a programming language in Lua. Lua is fast, small, embeddable, extendable, and has a Garbage Collector. I want to write something that is simple to parse, extensible, and purpose built for writing and working with UI on the web.

Originally I wanted to dig deep into coffeescript to figure this out, I still might do that, but CoffeeScript has a syntax that irks me. I wondered if it would be easy enough to write an interpreter that compiles to another language. Like CoffeeScript to Javascript. I figured that it's gotta be possible, Right? I mean, people have DONE this before. But the issues I have is that CoffeeScript IS Javascript with a mask on and some bits hidden/removed. I want to make something that kinda starts from scratch, Fresh and new with some lessons.

WASM is a thing. So why not write a language that's embedded in your browser? That could be cool right? I'd love to just ship my programming languages files like javascript files, or write it directly on my website, and see it just work. Try to bring some of that magic back. With a stable WASM interpreter I could push that to a CDN and then folks hitting the pages with this language would only need to download the interpreter once.

What's next?

Well, I guess I need to get the basics of the thing working. An interpreter, some Variables, math, and a REPL. Follow along here: https://github.com/karloscarweber/stim


Karl Oscar Weber

So you want Ruby to grow?

A very flat looking pinkish Ruby shape thing, with a few other rubies fanning out beneath.

So you like Ruby, and the Ruby community, and you want it to grow? What should you do?

1. Write stuff for beginners.

Always, and first, and primarily, and when you think you've done enough, write more for beginners. I cannot tell you how important it is to write for beginners. The stagnation of new Ruby developers, junior developers, can be attributed to a lot of factors, but the primary factor is that the moment a beginner makes it out of the getting-started page, everything else is for Computer Science Majors/Ruby lovers/Expert Developers. Basic concepts are ASSUMED, which I guess makes sense, but also mildly complex concepts are also ASSUMED. All of this assumption means that practically any tool that Rubyists write for one another is not user friendly.

"But I understand this KOW! This stuff is easy for me."

Right Right Right, but you're not a beginner. If you've been in the Ruby game for about 2 years things start to make a lot more sense. But if you haven't been doing it for that long it's just still a little magical and hand wavey. A lot of Ruby's utility comes from it's metaprogramming abilities, but those take some time to truly grasp.

So please, write stuff for beginners, write more than just "Documentation". Write Getting-started guides, How-to guides, Common use cases documentation, plus examples in standard ruby and with at least 2 frameworks. Bonus points if neither are Rails.

Also please review some basic Ruby stuff when talking about your framework. Dig in a little. Don't assume that we know how this works. We don't. Make it easy to be successful with your code.

2. Focus on Diversity, Equity, and Inclusion.

I know that some folx don't think it's important. Those folx are wrong. and Stupid. Expanding Ruby means finding people that are overlooked, under-appreciated, and then supporting them. I don't know if ya'll have noticed but almost all tech people are hella white. Just whitey tighties all up in here. Me too. Male, White, Heterosexual, Cis-Gendered, Heck I'm even Christian. I know across the pond and out East it looks a lot different.

Growing Ruby requires building strong community outreach, training, retention, and promotion of folx that don't look like, think like, or talk like the majority of Ruby developers today. I'm serious. If you look around at the current "tech" landscape today. What people are using to make their websites and apps. You won't notice that folx are making these decions based purely on the merits of a technology. It's based on Culture and perception. A whiteness centered culture has driven folx to widely adopt some bad tech. This is a direct result of prioritizing the needs of young, childless, single, white men. People who can work for hours or days on a problem because they hav nothing else to do.

Getting more folx to use Ruby, means going against the grain of tech culture itself.

Give these folx raises, a seat at the table, Hell a piece of the table. Bringing people in to Ruby that aren't already there means accomodating them. Increasing the realm of what's possible. What does that mean? fewer hours? more flexible work schedules? More mentorship? It means doing whatever it takes to bring these folks into the community. Including financial help. Drop a couple of Ks a year, at least, to sponsor, promote, or support under-represented folks coming into the Ruby community.

Forge strong connections with beginners, help them to build their professional networks. We're not getting hired based on our resumes, that almost never really happens. And if that's not the case then we ought to be helping, maybe even focusing on building these relationships with newcomers.

Also NEVER dictate what a donation or support should be used for. People know what to use their money on. Once you give them money, it's theirs.

There is this really silly... assumption? phrase? The best person for the job. The best person for the job doesn't exist, also who cares. We need to find people who are motivated, and kind. Folx that want to grow and improve. The junior developers of today, are the staff engineers of tomorrow. A beginners perspective sheds light on the spaces infrequently seen by an expert. The entrance.

Don't take my word for it. Read Kim Crayton.

3. Promote Framework diversity.

I am biased because I've been performing Necromancy on Camping for over a year. But sincerely, do your best, BEST, to promote framework diversity. A mono culture breeds in weakness. Everyone using Rails when they use Ruby means that only a certain narrow band of problems are easily addressed. It means that different perspectives or priorities are ignored.

Like Motoko Kutsanagi says: "If we all reacted the same way, we'd be predictable, and there's always more than one way to view a situation...It's simple: overspecialize, and you breed in weakness. It's slow death."

So too goes the Ruby way. Overspecialized in a single monolithic framework, All Roads, well rails, lead to… well rails.

Some Great alternative frameworks and tools:

The monoculture is really bad, but there are great signs of this changing. The rise of Hanami and Roda as framework alternatives. The steady march of progress with RACK and it's associated projects. Sinatra just got a brand new release. Phlex, a new templating and component library, seemingly brought to life from nothing in about six months by Joel Drapper, and it's fast as hell. The joy around writing with ruby hasn't abated, and genuinely feels like it's accelerating.

4. Teach more than just Ruby!

This is a big one! Most of what we're doing is making websites. There is no ruby on a webpage. I bet you didn't know that it was just a bunch of HTML,CSS, and Javascript. But it is. Like for reals.

Recently I had the necessity to make a mostly static website, I tried out Bridgetown for the first time, and it was great. Almost no hickups, and I used just regular old HTML, CSS, and JavaScript. Almost no JavaScript also. Kids these days think that you need complicated build processes to get a site online. Every "Hello World" or "Crud App" looks so bad because they are devoid of styles. Exceptions to this are few.

If you want to get folks to adopt Ruby, make it easy for them to understand the problem they have, and to find the solutions to the problem they have. Teach the whole enchilada. Top to bottom. Give examples and use cases. I know ya'll know how to do this stuff.

Teach around the problem. Keep folx in your documentation and solve as much of the problem as you can. Hell it will be reference for yourself in a few weeks when you forget something basic anyways.

5. Excise harmful folx

Kick em out. Are they being Racist DumbHasHasses? Show them the door. Are they taking credit for other folx work? Get outta here. Genius is a myth, aint nobody got it.

Harmful, bigotted, and prejudiced folx drive away the exact people you want to bring into the community. They gatekeep and centralize power and influence. Centralized systems have a single point of failure. When it comes to people, it makes a community brittle, poised to either break and fracture, or pull the whole lot down a darker path. Harmful folx narrow perspective, and thus, awareness of what's possible or important.

This may not be a completely bad thing though. The majority of the reason I'm working on Camping, and focusing on this community, is sheer rage at the idiocy of some folks here. A combination of Rage and Sunk Cost Fallacy.

My dad always said that sometimes anger can be a great motivator. Something won't get fixed until you get angry enough to go fix it yourself. That's why I'm here folks. I'm hella Angry.


Karl Oscar Weber

Isolated

A square canvas featuring the word POP written all over it in a several colors. Looks dope!

I feel socially isolated by the structure of the place I live in. I like Art, Design, and Culture. Outside of the black mirrors I have, I don't see it, hear it, or experience it.

The physical structure of Western America is shit. Everything requires a car. A car to here, a car to there. The cars are expensive, and dirty, and fucking suck. We live in houses, single family homes. With a nice big buffer between each house. I never see my neighbors except when i glimpse them moving to or from their cars and their homes.

Society is designed to keep us poor, tired, stupid, isolated. To wring out the creativity from our souls, to leave us empty and dross. It is designed to be this way.

We can design something better, but it will take intention. We can improve our lives, and the lives of our neighbhors, but it will require a fuck ton of work. I wnat to do that work but I'm not sure how to start. Maybe I'll write my name on every wall I find. See if that helps.


Karl Oscar Weber

Fluid Type Scales with Utopia

Fluid Type Scales with Utopia

Responsive websites are really cool. Most websites are responsive now. It's just how we do things. But how we get to a responsive website isn't always so easy. We end up with results that are... inconsistent to say the least.

A few years ago some interesting fellows proposed a completely fluid type scale to help us adapt our letters to smaller and larger screen sizes. They called it Utopia.

The problem™ is that good typography has a sort of hierarchy, and a relationship to that hierarchy. Headings are LARGE, and subheadings are not so large, text is normal sized. On large screens the gap between these sizes are bigger than they ought to be on smaller webpages. Traditionally these changes are achieved through media queries:

h1 {
    font-size: 1.5rem;
    line-height: 1.1; 
    @media (min-width: 375px)  { font-size: 2rem; }
    @media (min-width: 640px)  { font-size: 2.5rem; }
    @media (min-width: 960px)  { font-size: 3rem; }
}
h2 {
    font-size: 1.25rem;
    line-height: 1.2;
    @media (min-width: 375px)  { font-size: 1.5rem; }
    @media (min-width: 640px)  { font-size: 1.75rem; }
    @media (min-width: 960px)  { font-size: 2rem; }
}
p {
    font-size: 0.875rem;
    line-height: 1.5;
    @media (min-width: 375px)  { font-size: 1rem; }
    @media (min-width: 640px)  { font-size: 1.125rem; }
    @media (min-width: 960px)  { font-size: 1.25rem; }
}

This is a contrived example, but shows that the ideal size for our text is different across screen sizes:

Font Type Scale showing type scaling from small to large.

Clever folks have found out that setting your type at different sizes is more pleasing if there is a consistent ratio between those sizes. Let's say, like a third smaller, or a third larger at each step. It might look something like this:

5 rows, each has a type size, a circle that matches the size, and some sample text that is the text size of that row. The circle size and sample text descend in size by a third in each row. Thsi shows visual hierarchy in type sizes.

We call this phenomenon a Type Scale.

Fluid type scales respond to the viewport size. Smaller screens have less space, the gap between sizes on the scale should be smaller than on our big screens. A smaller, mobile type scale might look like this:

A Mobile type scale consisting of 5 rows. Each row has a pixel size label, a circle that matches the pixel size, and some text that matches the pixel size. The rows are smaller as they descend.

As you can see the type scale looks different. It's smaller, and the change in sizing is smaller too. The type scale begins at 16px and increases by 20% at each scale. A less dramatic change than beginning at 20px and increasing by 33.3% each scale.

Executing A Fluid Type Scale in CSS

Thanks to CSS Variables we can execute fluid type scales:

/* @link https://utopia.fyi/type/calculator?c=320,16,1.2,1280,20,1.333,4,0,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */

:root {
  --fluid-min-width: 320;
  --fluid-max-width: 1280;

  --fluid-screen: 100vw;
  --fluid-bp: calc(
    (var(--fluid-screen) - var(--fluid-min-width) / 16 * 1rem) /
      (var(--fluid-max-width) - var(--fluid-min-width))
  );
}

@media screen and (min-width: 1280px) {
  :root {
    --fluid-screen: calc(var(--fluid-max-width) * 1px);
  }
}

:root {
  --f-0-min: 16.00;
  --f-0-max: 20.00;
  --step-0: calc(
    ((var(--f-0-min) / 16) * 1rem) + (var(--f-0-max) - var(--f-0-min)) *
      var(--fluid-bp)
  );

  --f-1-min: 19.20;
  --f-1-max: 26.66;
  --step-1: calc(
    ((var(--f-1-min) / 16) * 1rem) + (var(--f-1-max) - var(--f-1-min)) *
      var(--fluid-bp)
  );

  --f-2-min: 23.04;
  --f-2-max: 35.54;
  --step-2: calc(
    ((var(--f-2-min) / 16) * 1rem) + (var(--f-2-max) - var(--f-2-min)) *
      var(--fluid-bp)
  );

  --f-3-min: 27.65;
  --f-3-max: 47.37;
  --step-3: calc(
    ((var(--f-3-min) / 16) * 1rem) + (var(--f-3-max) - var(--f-3-min)) *
      var(--fluid-bp)
  );

  --f-4-min: 33.18;
  --f-4-max: 63.15;
  --step-4: calc(
    ((var(--f-4-min) / 16) * 1rem) + (var(--f-4-max) - var(--f-4-min)) *
      var(--fluid-bp)
  );
}

Notice in the code above that we have the --fluid-min-width and --fluid-max-width set to 320 and 1280 respectively. These are our limits. Our fluid sizes will reach their smallest at the lowest limit, and their largest at the biggest limit. This also prevents our text from shrinking or growing without end. (The math is difficult to parse without a minor lesson in algebra, so let's not do that.)

You can achieve the same effect, although with a bit less precision, and precalculated, with clamp:

/* @link https://utopia.fyi/type/calculator?c=320,16,1.2,1280,20,1.333,4,0,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */

:root {
  --step-0: clamp(1.00rem, calc(0.92rem + 0.42vw), 1.25rem);
  --step-1: clamp(1.20rem, calc(1.04rem + 0.78vw), 1.67rem);
  --step-2: clamp(1.44rem, calc(1.18rem + 1.30vw), 2.22rem);
  --step-3: clamp(1.73rem, calc(1.32rem + 2.05vw), 2.96rem);
  --step-4: clamp(2.07rem, calc(1.45rem + 3.12vw), 3.95rem);
}

The above is much easier to parse, but the calc parts present a mystery. Using these type scales is thankfully easy:

body { font-size: 100%; }
h1 {
    font-size: var(--step-3);
    line-height: 1.1;
}
h2 {
    font-size: var(--step-2);
    line-height: 1.2;
}
p {
    font-size: var(--step-0);
    line-height: 1.5;
}

A Fluid type scale without media queries!

No perfect Sizes.

A key tenet of fluid type is that there are no perfect font sizes. Which is pretty rad when you think about it. What matters is the relationship of the type sizes to one another, and the intended maximum and minimum size. When you don't have to worry about perfect type sizes, you're allowed to think in more abstract, role based ways. Is this a Heading? or a SubHeading? Content text or a blockquote? Should it be large, or small. By excising pixel perfect requirements for our text we instead have text with perfect, or intended relationships. It's these relationships that we care about. Once again to add emphasis and hierarchy to the page. Implicit Harmony.

The best time to adopt a fluid type scale is during a redesign or new site buildout. A refactor is also a good time. Adopting fluid type will make documenting and managing a design system much easier. You can lean on the intended type sizes in your components, and quickly build relationships between your content and compnents.

If you've been hesitant to try fluid type before I encourage you to adopt it. It kicks ass and will make your websites look very Schway.


Karl Oscar Weber

Ruby Camping

Hi Friends,

Camping is a micro web-framework written in Ruby. Originally written by _why the lucky stiff, (Their real name), Camping was a pretty popular framework a few years ago, but over time just slowed down. Now Camping is actively maintained and improving.

One of the best things about Camping is how compact it is, The whole thing is about 4kb:

require"uri";require"rack";E||="Content-Type";Z||="text/html"
class Object;def meta_def m,&b;(class<<self;self
end).send:define_method,m,&b end;end;module Camping;C=self;S=IO.read(__FILE__
)rescue nil;P="<h1>Cam\ping Problem!</h1><h2>%s</h2>";U=Rack::Utils;O={url_prefix:""};Apps=[];
SK=:camping;G=[];class H<Hash;def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.
to_s]:super end;undef id,type if ??==63 end;class Cookies<H;attr_accessor :_p;
def _n;@n||={}end;alias _s []=;def set k,v,o={};_s(j=k.to_s,v);_n[j]=
{:value=>v,:path=>_p}.update o;end;def []=(k,v)set(k,v,v.is_a?(Hash)?v:{})end
end;module Helpers;def R c,*g;p,h=
/\(.+?\)/,g.grep(Hash);g-=h;raise"bad route"if !u=c.urls.find{|x|break x if
x.scan(p).size==g.size&&/^#{x}\/?$/=~(x=g.inject(x){|x,a|x.sub p,U.escape((a.
to_param rescue a))}.gsub(/\\(.)/){$1})};h.any?? u+"?"+U.build_query(h[0]):u
end;def / p;p[0]==?/?@root+p : p end;def URL c='/',*a;c=R(c,*a) if c.respond_to?(
:urls);c=self/c;c=@request.url[/.{8,}?(?=\/|$)/]+c if c[0]==?/;URI c end end
module Base;attr_accessor:env,:request,:root,:input,:cookies,:state,:status,
:headers,:body;T={};L=:layout;def lookup n;T.fetch(n.to_sym){|k|t=Views.
method_defined?(k)||(t=O[:_t].keys.grep(/^#{n}\./)[0]and Template[t].new{
O[:_t][t]})||(f=Dir[[O[:views]||"views","#{n}.*"]*'/'][0])&&Template.
new(f,O[f[/\.(\w+)$/,1].to_sym]||{});O[:dynamic_templates]?t: T[k]=t} end
def render v,*a,&b;if t=lookup(v);r=@_r;@_r=o=Hash===a[-1]?a.pop: {};s=(t==true)?mab{
send v,*a,&b}: t.render(self,o[:locals]||{},&b);s=render(L,o.merge(L=>false)){s
}if o[L]or o[L].nil?&&lookup(L)&&!r&&v.to_s[0]!=?_;s;else;raise"no template: #{v}"
end;end;def mab &b;extend(Mab);mab(&b) end;def r s,b,h={};b,h=
h,b if Hash===b;@status=s;@headers.merge!(h);@body=b end;def redirect *a;r 302,
'','Location'=>URL(*a).to_s end;def r404 p;P%"#{p} not found"end;def r500 k,m,e
raise e end;def r501 m;P%"#{m.upcase} not implemented"end;def serve(p,c)
(t=Rack::Mime.mime_type p[/\..*$/],Z)&&@headers[E]=t;c;end;def to_a;@env[
'rack.session'][SK]=Hash[@state];r=Rack::Response.new(@body,@status,@headers)
@cookies._n.each{|k,v|r.set_cookie k,v};r.to_a end;def initialize env,m
r=@request=Rack:: Request.new(@env=env);@root,@input,@cookies,@state,@headers,
@status,@method=r.script_name.sub(/\/$/,''),n(r.params),Cookies[r.cookies],
H[r.session[SK]||{}],{E=>Z},m=~/r(\d+)/?$1.to_i: 200,m;@cookies._p=self/"/" end
def n h;Hash===h ?h.inject(H[]){|m,(k,v)|m[k]=
n(v);m}: h end;def service *a;r=catch(:halt){send(@method,*a)};@body||=r;self
end end;module Controllers;@r=[];class<<self;def R *u;r=@r;Class.
new{meta_def(:urls){u};meta_def(:inherited){|x|r<<x}}end;
def v;@r.map(&:urls);end;def D p,m,e;p='/'if
!p||!p[0];(a=O[:_t].find{|n,_|n==p}) and return [I,:serve,*a]
@r.map{|k|k.urls.map{|x|return(k.method_defined? m)?[k,m,*$~[1..-1].map{|x|U.unescape x}]:
[I, 'r501',m]if p=~/^#{x}\/?$/}};[I,'r404',p] end;
module F;A= ->(c,u,p){u.prepend("/"+p) unless c.to_s == "I"}end;N=H.new{|_,x|x.downcase}.
merge!("N"=>'(\d+)',"X"=>'([^/]+)',"Index"=>'');def M(pr);def M(pr);end;constants.
map{|c|k=const_get(c);k.send:include,C,X,Base,Helpers,Models
@r=[k]+@r if @r-[k]==@r;k.meta_def(:urls){[F::A.(k,"#{c.to_s.scan(/.[^A-Z]*/)
.map(&N.method(:[]))*'/'}",pr)]}if !k.respond_to?:urls}end end;I=R()end;X=
Controllers;class<<self;def routes;X.M O[:url_prefix];(Apps.map(&:routes)<<X.v).flatten;end;
def call e;X.M O[:url_prefix];k,m,*a=X.D e["PATH_INFO"],e['REQUEST_METHOD'].
downcase,e;k.new(e,m).service(*a).to_a;rescue;r500(:I,k,m,$!,:env=>e).to_a end
def method_missing m,c,*a;X.M O[:url_prefix];h=Hash===a[-1]?a.pop: {};e=H[Rack::MockRequest.
env_for('',h.delete(:env)||{})];k=X.const_get(c).new(e,m.to_s);h.each{|i,v|k.
send"#{i}=",v};k.service(*a) end;def use*a,&b;m=a.shift.new(method(:call),*a,&b)
meta_def(:call){|e|m.call(e)}end;def pack g, *a, &b;G<<g;include g;
extend g::ClassMethods if defined?(g::ClassMethods);g.setup(self)if g.respond_to?(:setup)end;
def gear;G end;def options;O end;def set k,v;O[k]=v end
def goes m,g=TOPLEVEL_BINDING;Apps<<a=eval(S.gsub(/Camping/,m.to_s),g);caller[0]=~/:/
IO.read(a.set:__FILE__,$`)=~/^__END__/&&(b=$'.split /^@@\s*(.+?)\s*\r?\n/m).shift rescue nil
a.set :_t,H[*b||[]];end;end
module Views;include X,Helpers end;module Models;autoload:Base,'camping/ar'
Helpers.send:include,X,self end;autoload:Mab,'camping/mab'
autoload:Template,'camping/template';C end

Because Camping is intended to be as compact as possible, single file apps are encouraged. Which is pretty cool.

Camping.goes :Nuts

module Nuts
  module Controllers
    class Index
      def get
        render :index
      end
    end
  end
  module Views
    def index
      h1 'Hello World'
    end
  end
end

Also because single file apps are a thing, more than one "app" can be mounted together:

Camping.goes :Nuts # Nuts app is mounted.
# ... Nuts module here

Camping.goes :Blog # Blog app is mounted.
# ... Blog module here

A Camping app is just a module mounted within a namespace, either the global namespace, or another app's namespace. This makes distributing an app via RubyGems pretty easy too.

Camping's default view architecture uses MAB which is an HTML generator in Ruby.

module Views
  def index
    if @posts.empty?
      h2 'No posts'
        p do 
          text 'Could not find any posts. Feel free to '
          a 'add one', :href => R(PostNew)
          text ' yourself'
        end
    else
      @posts.each do |post|
        _post(post)
      end
    end
  end
end

I've been updating Camping to have better database support. It comes with built in support for ActiveRecord, but what about other database engines? Through a new plugin system called gear, I'm adding support for different database systems. In the next version the built in ActiveRecord integration is being moved to some Camping Gear named GuideBook:

require 'camping'
require 'guidebook' # Guidebook adds ActiveRecord to Camping.

Camping.goes :Nuts

module Nuts

  # In Camping you Pack Gear.
  pack Camping::GuideBook

  module Models
    class Page < Base; end
  end

  def self.create
    # establishes a database connection when the app is created.
    establish_connection()
  end
  # ... Controllers, Views, Helpers.
end

Camping has some tricks up it's sleeves. Like adding styles and other files to the end of your camping code:

# ... The rest of your camping app up here

__END__

@@ /style.css
* { margin: 0; padding: 0 }

Camping is based on Rack so adding middleware is pretty simple:

require 'camping'
require 'warden'

module Nuts
  
  use Warden::Manager do |manager|
    manager.default_strategies :password, :token
    manager.failure_app = BadAuthenticationEndsUpHere.new
  end
  
end

What's next for Camping?

Camping is mostly just plain old ruby with some funny bits. But it's so interesting how all the pieces fit together. It's so small and compact you can read the whole source code in a few minutes, but it's packed with interesting Ruby tricks that truly stretch what you can do with Ruby.

I began looking for a new web framework in early 2022, I found Camping to be interesting and exactly what I was looking for. Small, Simple, and stuck in a single file. Unmaintained for 6 years it didn't work right away, but after a little bug fixing it was good as new. Working on Camping has taught me so much about Ruby. It's absolutely been worth every moment.

I think that the future of Camping is to keep the core framework as small as possible, but make it easy to extend. Things like new view systems, database ORMs, or even websockets. The next version of Camping will have a decoupled, yet improved database plugin called Guidebook, A Camping NEW command line helper, and documentation improvements. Soon I'll add support for websockets, Phlex Views, the Falcon webserver, Rack3, and the Sequel database toolkit, configurations using a kdl config file, and asynchronous code execution. In particular I'm very interested in making the developer experience as fantastic as possible. To me that means inspection and testing tools. Amazing and detailed Documentation. Plus common helpers to make difficult tasks very simple to understand and perform.

Working on Camping has made me very excited about my career again. I really love it.


Karl Oscar Weber

Start From Scratch Again but Make it Basic.

Hi Friends,

I redesigned and rebuilt my website theme this time it's version 18. Which is nice. A lot has happened since I started this latest version and I learned a lot about why shipping my past themes failed and how to make that work.

Too Much on the Plate.

I first decided to dump what I had in the past and start over from scratch, but super scratch scratch. Why? I had this half-baked idea to build a design system around the site while I was building it, and add a space for tutorials, and courses. It was a lot. Lack of focus and huge scope tanked the project. The onset of the pandemic killed my motivation to continue, and anyways I had to find work suddenly and keep the family all ok. (I'm married with 4 children).

This is a theme I see in any endeavour, lack of focus, and large scopes kill things. That's not cool. I had taken on too much and tried to make all this related, yet different things all at once. Which is silly when you think about it. Tutorials, and Courses? Concurrently? With nary an article before that? Yeah that was silly.

The course correction to that wells up from another reality. The people do what they do, a crafts person makes what they can make becuase that's what they can make. A more talented or experienced person will make better work faster, than a newbie. But it's the act of building and making lots and lots that sharpens these skills. If I did want to make a course, the first step is to make the smallest piece of what a course might be, writing about the topic. So it goes with the redesign that I launched.

Start over, Cut Everything.

I designed a basic blog. No features outside of the essentials, with very little personality. That's what I shipped to kow.fm for version 18. Why? Well I have aspirations to ship more than just one theme, but a lot more, I wanted a base theme that I could work with that had very few assumptions that I needed to overcome.

This blog runs on Ghost, at least for now. Ghost is great. It has started to ship a lot of features that are easy to support, and a few that are slightly more difficult to support for theme developers. Trying to fit all of that into an initial release from the jump was hard for me. I decided to cut support for everything but the most essential things. I can add stuff later. The basic blog theme that I made, Capsule, is meant to just be a baseline for other themes. Which seems silly. But standing up something basic that fulfills all of the main requirements, is pretty important.

So I did that, I cut everything and started over from a baseline. The code is ugly-ish, the design is meh, but it all works and I have my baseline.

Small Iterations Over Time

My next step is to find small parts to improve, improve it, and then ship that. I see this theme as a baseline, but also something that I can improve and make changes to. Art, Design, Code, this stuff is never finished, it never ends, it's just let loose from time to time. Baking a small iterations mindset into every aspect of my creative output is now kinda my JAM. Starting with this theme was the best decision I could make.

What's next? I'm working on a cool blog thing with Collin. I've been refurbishing Camping for about 6 months and it's gettin' pretty good. I've decided to pivot my career to focus on websites with Ruby and I'm loving it. Carving out more time to be with family and friends by cutting everything I don't actually like.

-kow


Karl Oscar Weber

How I spent the last 10 days Fixing an old Ruby Web Framework.

This is not just a technical discussion, but a description of my efforts to find a replacement for rails, and why.

I'm not going to get into details too much, but the popular web framework Ruby on Rails, is open source, really easy to use, and still runs some pretty big startups. The Original creator DHH, which I will refer to in this article as The Dumbass, is still very active with the thing. But he keeps doing Dumbass Shit. Like I'm tired of his shit and I'm not even primarily a rails devloper. I have other things to worry about.

I decided that I didn't want to have any association, not even tangentially, with that dude. So I'm like: "I have to port all this old code I have". I was attached to my code.

I was tired of tangentially associating with the work of a puffy ego shit head that says politics is getting out of hand, and that routinely causes harm.

As Kim Crayton says: Tech is Not Neutral, Nor is it Apolitical. My personal choice in tech and contribution to it won't be either. So I wanted to choose some tech that wasn't associated with a sociopath.

Anyways I set about Porting My code.

I'm not even that good with Ruby. I honestly pretty much suck. That was the problem. I have a mountain of code that I have to improve/maintain plus several personal projects that I'm trying to move forward. I'm committed to Ruby though.

I googled best Ruby Frameworks. I figured that at least some of my code would be portable. I had figured out some difficult record relationships logic in rails for app permissions and I didn't want to abandon that. There are a LOT of Ruby frameworks. like a lot. Some Highlights:

Hanami: A fast and Modern web framework. I really like this one. There are simple patterns and very good documentation to get you started. The organization behind it, dry-rb, is pretty amazing too.

Sinatra: A DSL for quickly creating web applications. This one felt a little too minimal to me. It's also great.

Grape: A framework for creating REST like APIs in Ruby. This one is good too. Most of what I'm making are APIs for iOS and Web apps so this made sense to me.

Camping: A web framework which consistently stays at less than 4kB of code. Written by a mysterious developer that suddenly disappeared in 2009, it's now maintained by the community.

Roda: A routing tree web toolkit, designed for building fast and maintainable web applications in ruby. It's just a bunch of routes. Damn fast.

There were things I liked and didn't like about each one, but in the end I chose to use Camping.

Let's go Camping

The Camping website points to a derelict domain that redirects to a spam site. The Github repo hadn't received an update in 4 years, no real development in 8 years. So this puppy was old. Also it didn't run when I installed it. I was intrigued.

In fact I was unable to compile anything on my computer for like 12 hours because of some Xcode Brew install bug thing. It was tough. After I fixed my computer I tried to fix Camping. I changed a couple of variables, corrected a couple of errors, and then... it worked! This old thing was alive and kicking with it's little 4 kilobytes of Ruby. It felt so good to dive in and learn what was broken and how to fix it.

I was very excited

I mentioned before that I wasn't much good at Ruby. I had never properly learned the language and only used it sometimes to build something small, or to maintain one of the projects that I had inherited. Most of my experience was through Rails. So when everything blew up I decided that I would learn it properly. Fixing Camping was my crash course.

Working through the documentation was a joy. It was very sparse, but clear and simple and to the point. Camping is an MVC micro framework that has everything from routes and middleware, to sessions and databases. ActiveRecord is included. There is literally everything you need in a small package. The best part IS that it's all in a small package.

It's common for a Camping App to fit in a single file without scrolling. It's so concise that you can get a lot done. ActiveRecord gives you instant access to a powerful ORM, migrations included. All this stuff is important for building an app or an API.

How does all this fit into a small package? Well It's because Ruby is amazing. Like I've heard of ruby developers passionate about the language, but HOLY COW it's ridiculous. There's some black magic happening that gives you a lot of power with Ruby.

Strange Magic

Ruby is a purely Object Oriented language. You have classes and objects. But only in Ruby EVERYTHING is an Object, even classes. You can extend or add functionality to ANY Object, even standard library classes. Even classes that you include from the community. And the community of open source code is gigantic, amazing, powerful, useful. You name it. Ruby is STACKED.

I didn't realize that a lot of the magic that I found in rails was simply there because of Ruby. Rails really does put you on Rails, and hides some concepts of Ruby's meta nature that would make understanding what's going on much easier.

Ruby gives you powerful meta programming tools. You're program can modify itself dynamically and write it's own code. This is partly how Camping is so fully featured yet so small. Camping dynamically maps it's routes to your controller methods with a few lines of code that look like a brain teaser. Clever use of regular expressions and code generation make Camping special, and pretty handy. I was immediately productive with it.

Camping is so small you can read the source code in a few minutes and generally understand what it's doing, even for a novice like me. I dived deep into how Ruby Meta Programming works and read the source code like a novel, and consumed the book: The Ruby programming Language. I get it now. Ruby itself is so flexible and dynamic that just about any code can be shared and incorporated into any project. The magic is Ruby itself, and Camping's source code and example is a cheat code to see how to make your own magic.

I was very excited. I feel like I can accomplish just about anything with this little tent.

I'm a Camper now

I reached out to the lead maintainer of Camping and asked if I could contribute. They said YES! So I did! I fixed the tests and now Camping works again. I'm primarily concerned with thoroughly documenting and modernizing the documentation, for my benefit as well as for others, while I build out my own indie projects.

My first project is a User authentication and Oauth Token based middleware system thing. It will be reused for a few projects I'm working on. The best part is that I won't be starting from scratch, I have a lot of old code to work from and port over. Afterwards I think I'll try to move my TOY podcast app a bit farther along. Making a podcast app is a lot harder than it looks.

Try it out!

Download Camping: Add this to your Gemfile to get the latest, actually working version.

gem "camping", git: 'https://github.com/camping/camping' # for installing straight from the repo

Karl Oscar Weber

The Best Productivity Advice

The Best Productivity Advice

I mean, we all want to be more productive, right? I do. The piece of advice that I hear shared the most is to break down what you need to do into small pieces.

Just break it down. Small pieces.

This is mega true. Sometimes I have trouble getting into the mood of working, or focusing on something for too long. What helps me is to think of a large task like a big debt, I want to pay it off, so I make small payments, or deposits, of my time and attention. Eventually I'll pay it off.

I keep a list of the big things I need to do, then add smaller sub tasks to organize my work. Sometimes I'll be working on something, and I'll get carried away by where the work takes me. It's not what's written down, It's not the plan, but it's important, essential. I add these small things to the larger task. Keep track. Sometimes I add something to my list, just to immediately check it off. This helps me to visualize my progress over time. Watching my progress stack up keeps me motivated.

So, take the things you need to do, then break them into tiny chunks.

You can do it!


Karl Oscar Weber

Redoing Everything

Redoing Everything

Hi,

It's been a while, but 2020 has just kept on going... A website redesign is the farthest thing from important at the moment. But I need to work and apay bills so I've got to convince ya'll that I can do my job. So here are all the latest details about the redesign.

Throwing it all out

I became really frustrated with the direction of the redesign sometime in July I think. It wasn't really looking nice to me. My typfaces choices were alright, but everything felt small and unambitious. I needed to go in a new direction.

I first revaluated the homepage design. Before It was much more functional, introductory text with inline links to interesting parts of my website. Now I've taken that idea to the extreme. JUST the text with links.

Bold new design attempt for the homepage.

I wanted to do some experiments with the hover states, so I did:

Really bombastic hover states.

The vision for the site is Bold pieces of color contrasting against pretty plain hues of grey. I didn't want the background to be white, white is the internet's color, the color of websites. Just like white everywhere. Grey feels better.

I also switched a bold, sans-serif typeface for all headlines. I was using Playfair-Display before, and although it was playful, I just never leveraged it in a way that was satisfying. When redoing everything I started with a baseline system instead of designing individual pages. I already had a pretty good type scale that I modified, so It was all about nailing the weights and sizes.

Type sizes and weights tied to css.

I think I did a good job. I outlined how the text should look and feel next to each other, then I put it all into CSS. Having links be bright splotches of color felt like a really great choice to me. I have an idea to use nth-child to alternate colors, but I'll push that in another update.

Moving onwards to design the how each page type would look, I became really restless and simplified a lot. Now there are 4 types of pages: Index, Page, Post, Chapter. Pretty simple. Every post wherever it is, is a post. Book Chapters are, well, chapters. I've decided to put the whole book I'm writing online right on my site, no separate site to messy things up. It would just get stuck in endless redesigns and never launch anyways.

Components

Moving to a more bold design and building from scratch meant that I would need to build some baseline components first, and then fit them together. I started with Type, then continued with colors.

Colors used in kow.fm

I had/have a plan to add lots of content, I thought it would be interesting to give each content type their own accent color. Going to each section would mean the links would be different. And it worked. It looked nice. But seeing as how I don't have a lot of that content even made yet... I axed all of those pages. I axed an Apps Page, Tutorials page, Courses Page. I axed a lot.

I had never done really well in adding illustrations to my posts, but wanted to try to do so easily, with little effort. I found that a square illustration style, with simple background colors would work well.

Illustration style for this website your reading now.

This opened up an opportunity to explore what Titles would look like with an illustration behind them, next to them, around them. I decided on a simple CSS blend effect of a title over the image. Having Really bright, or just plain solid colors in the illustrations gave posts a really great firm foundation, at least at the top of the page.

Title over the image.

I want to illustrate some more possibilities with this approach using the primary colors that we chose earlier.

Afterwards I started to experiment with the menu. I had already made a pretty ostentatious menu, but threw that thing out. It depended on too much javascript, and was a bit slow on my old laptop. I needed something simple, bold, and clear. I iterated on the highlighted link idea and made something that felt really bold.

Iterations and tests of the menu for this website.

I really really really like how it came together. A simple top navigation, that turns into a hamburger when it's on a mobile device. After removing a lot of the derelict pages and focusing on the core content, it looks even better. Now It's very clear to site visitors where I would like them to go, and how to find content on the site. You'll also see a redesigned prologue logo in there. It never felt right to me, reusing the prologue logo on my personal site, hopefully this new mark can connect me to prologue in a small way.

I became frustrated animating the transition of the hamburger symbol, into an X symbol. It's really common and everyone does this, but I was trying to animate the SVG it's self. I haven't done much of that yet. So as a stroke of experimentation I wondered if I could just rotate the X from the backside of the Hamburger. Then I thought why not make it a cube? Like why not? I want to do more 3D stuff on this site in the future anyway, maybe I can signal my intentions. Making a cube in pure CSS was not difficult, then animating that cube also wasn't difficult. The result is a playful, moving element that I didn't plan or expect.

The animated CSS Cube thingy on this website.

Animating the cube is pretty simple. We're transitioning between two states with different rotations. I'll go into that later. The sides of the cube that don't have symbols are filled with our accent colors from earlier. Thankfully investing in some playful colors has given the menu cube an even greater sense of fun.

Future Elements

I'm not yet complete with the site, but it's very close. I think I just need to redo the footer a bit and then focus all of my efforts on the book. In the future I want to bring back unique app elements. Rather than design something completely unique, I thought it wise to reuse as many components as I could. I came up with simple Cards that could have content dropped into them, just like a page.

Design for a future app card.

The old app cards were cute, but most of those apps aren't even close to being complete. I'd rather keep my intentions secret until just before launch.

That's it for now.

I'll hopefully have this thing wrapped up before halloween.

Stay safe. If you're in the USA, vote. Preferrably not for the people sympathetic to neo n*zis and fascists.


Karl Oscar Weber

issue # 0

This is a test of the kow.fm broadcasting service.

You will receive this as an email in a newsletter because I'm a boss like that.


Karl Oscar Weber

Layouts

Hi Friends,

Today I'll be talking about layouts. I've been doing layouts for a loooooong time. Like ten years. fer reals. For most of that time I've used float based layouts. Basically, tricking block level elements into acting like inline elements to run into each other like boba tea. It was rough. I was actually doing some layouts in floats a couple of months ago when I finally had enough.

Float based layout sucks so bad. I don't even want to get into it. So I decided to modernize. I picked up this book on CSS Grid layout and consumed it post haste. I quickly became acquainted with grid layout and it's pretty great. CSS Grid allows you to name sections of a grid, and have content flow over it. It does a lot more but that's the part that I'm excited about right now.

Every webpage can be composed by combining just a few layouts. Let's look at some common layouts that we see on the web.

The Centered Layout

The Centered Layout, is the most common layout on all of the web. Content naturally flows from top to bottom, so let's keep that content in the center.

The Header with Content Layout

The Header with Content Layout, Everybody needs something up top! Headers are the basic UI of the Web. It probably follows this pattern from the menu interfaces we have in all our windows on our computers. The scroll is the most important interaction on the web, and thusly header content disappears as it's scrolled away. Titles, menus, signposts, all can be found up top in the header.

Sometimes headers stick around when you scroll. That's cool.

The Sidebar Layout

The Sidebar Layout, Sites that put content on the side usually have a lot of content. Sidebars are used for quick and immediate navigation, usually in a site that you'll want an index around to help you find your way. Documentation sites use the sidebar pattern for a good reason, You're often jumping around when reading documentation.

The Sandwhich Layout

The Sandwhich Layout, The good ol Sandwhich. Sites that have a header and a footer use this layout. Also Screen takover modals use this pattern. The header is usally a title or a small menu, the footer an action bar. Usually a save or cancel button is down there. Methinks this pattern

So these are the layouts. They are good, everybody loves them. I love them. Honestly that's what matters. But how do we get them into the website? How do we get the content to look like that. Lately I've been using CSS Grid. Which is pretty easy,

CSS Grid

You make a Grid out of CSS. CSS Grids have an area that are divided up by lines to make tracks. Tracks are like the rows or columns of the thing. It looks like this:

An example of a grid, in CSS.

yeah soo..... You can see some lines, you can see some squares. It looks fine and dandy. But what really makes it cool is that you can choose how big or small each area in the grid is. You can make them assymettrical, oblong, or weird. It's all arbitrary. You usually see a grid that looks more like this:

An example of a 12 column grid.

Grids usually have Gutters and stuff. But whatever, these examples don't.

CSS Grid is, well, CSS. Which means you can redefine the grid at different viewport sizes with Media Queries. A small screen needs fewer columns, or maybe the columns that you defined before can be different? you can do just about anything. The most interesting thing to me is that you can set Grid Areas in your grid by naming them. Names like, sidebar, main, header, footer. Giving an element a simple attribute of that grid area magically puts it into that spot. It's wild.

Let's not get too technical, I want to talk about the intention behind the grids I'm using.

Telling stories

I guess that's the point of a blog. Remember when they didn't need to have some marketing purpose behind them? when you could just write about your cats, or lack of cats, or your dog, and people would read that? I want to get back to that. I have lots of cat/dog anxiety to share. I wanna write unimportant things about Animal Crossing. I bought Tania a copy and she's been playing it everyday, like it's a dedicated important thing. My kids stole my switch to play it, now I just longingly look over at what they're decorating my house with. I swear this one little game will force me to buy 5 Nintendos, We have 3 kids and every single one wants to play. It's not a game you can share. We just bought another Switch for my son, who is 7. It's working Nintendo, we get it, ya no mas.

Or maybe stories about what we're doing during the pandemic? That's the hot topic. We're all stuck inside, our joint grief/depression/anxiety is the big common thread in our lives now...... yeah maybe not.

Black lives matter is really important right now. I say that in a slightly sarcastic tone because they have always been important, but the systemic racism, oppression, and brutality has reached a boiling point. These protests are actually great. Keep them up. Tear the whole system down. Send the wire, make the hire. Maybe stories about the role that capitalism has played in using Racism as a tool to divide the working class so that they'll hate each other for no good reason. Keep us distracted from the real bad guys, greedy people. Calling out racism and oppression will become the norm on the blog, rest assured.

Educating

I'm working on one of those fancy course thingys but decided to just included it as a premium section on my website rather than spin up a separate brand/website thingy. Much easier to keep one thing going than two things going, in my experience.

Education requires, like, reference, and signposts, and clarity of concepts. How does the layout influence this? It's not ALL just layout there's other stuff too, but how does layout help to influence it? 🤔.

So What I've decided to do is have 2 main layouts for the website, Story Layout, and Course Layout. Blog Posts, tutorials, stories, These will use the story layout. It look this:

A figure of my story layout. A single column layout, with a footer.

It's got a single column, and a footer, and not much else. I like it! yay!

Next is what I call the course layout:

The course layout, a header, sidebar, main content, and sometimes a video up top.

The minty green is navigation. Courses, books, references, tutorials, how-tos, all of these require quick and comprehensive navigation between disparate sections as part of a collective whole. I'm working on rewriting and publishing my Swift Foundations book on my website. So this would be perfect. I want to offer premium content for making iPhone apps, video courses with accompanying text, so I've got this cute little video box above text. I really like it.

So I've got the layouts, now to implement them in fancy code stuff. This is all of the code for the sidebar sandwhich layout:

.gw_sandwhich_sidebar {
  display: grid;
  max-width: 1600px;
  grid-column: minmax(120px, 240px) auto;
  grid-row:auto auto auto;
  grid-column-gap:1em;
  grid-row-gap: 0.5em;

  grid-template-columns: minmax(180px, auto) auto;

  grid-template-areas:
  "header header header"
  "sidebar content content"
  ". footer footer"
  ;
}
.gw_sandwhich_sidebar__header {
  display: block;
  width: auto;
  grid-area: header;
}
.gw_sandwhich_sidebar__sidebar {
  display: block;
  width: auto;
  grid-area: sidebar;
  box-sizing: border-box;
  padding-left: var(--step-0);
  padding-right: var(--step-0);
}
.gw_sandwhich_sidebar__content_wrapper {
  display: block;
  width: auto;
  grid-area: content;
}

.gw_sandwhich_sidebar__footer {
  display: block;
  width: auto;
  grid-area: footer;
}

@media screen and (max-width: 640px) {
  .gw_sandwhich_sidebar {
    grid-template-areas:
    "header"
    "sidebar"
    "content"
    "footer"
    ;
  }
  .gw_sandwhich_sidebar__sidebar {
    padding-left: var(--size-large);
    padding-right: var(--size-large);
  }
}

As you can tell, it's sufficciently over engineered to use CSS Grid, but it works nice. and as you can see on the website, The layout is just fantastic.

I'm confident that I"m probably over thinking the layout in Grid a little bit and can simplify it even more, but I'll wait to do that until later. Most of these layouts are coded and complete, now time to ship it, tweak it, and move on.


Karl Oscar Weber

You are not Special

This morning Tania and I woke up at the same time. Lying in bed, she turns to me: "I want a divorce.",

"HUH? What? Why?",

"You cheated on me.", I had, in fact, not cheated on her.

"When did this happen?",

"I had a dream", Ah yes. A Dream. It's another one of those dreams.

Days that begin with the cheating dream are, interesting, to navigate. Amicable, yet terse conversation. Quietly executing on routine. "I have never, and will never cheat on you. It was just a dream.", I rose from bed to make her breakfast. Being stuck at home for weeks has instilled new habits. Every morning I make her 3 eggs, not scrambled, not under cooked, in olive oil, with cilantro, pepper, and a pinch of salt.

Yesterday she frowned at the eggs, "They look ugly. How could you bring these to me?", "Well the yokes broke a little when I flipped them.", this was not a satisfying answer. I made her new eggs, and ate the first batch. She didn't complain the second time. I think I made the right decision to make those eggs again.

Today she told me that she doesn't really like egg yolks at all, "but the kids like them.", A detail that I was happy to learn. After 10 years I'm still learning things. "I'll just give you egg whites tomorrow." It's astonishing how simply being kind makes everything better.

I'm certain I'm not the only person to wake up next to their partner, that's angry, because of what they did in their dreams. It's probably common. Thousands must have woken up on that same day and had that same conversation. A thousand ways to say sorry, or to say fine, whatever. Some of these people have recovered, some haven't. Some laughed about it. Others received a firm slap to the face. Maybe even a punch? There is a poor fellow sleeping in their car tonight, with a black eye, somewhere.

In all of this shared experience, that I of course imagine to be true. In all of it I find great comfort. Someone, somewhere, has taken the path that I didn't, experienced the consequences of the dream, differently. That makes me happy.


Karl Oscar Weber

Type Scales

Hi Friends! I'm back! Typography is 95% of web design. The impact and implications of a good type system, the right fonts, and the right colors cannot be overstated. I've never really been all that good at it, but this time I really wanted to do my best and make something that would stand out. Firstly I should share the design that I made for kow.fm v15.

This is the homepage design for kow.fm.

The homepage design doubles as an about page and an index. I realized the primary goal of kow.fm had changed to share educational content, tutorials, books, guides, tips, that sort of thing. It's more than just a journal, but also the nature of my writing has begun to shift too. So this is what I've got. I really like the colors and the simplicity of the typeface.

The post page design with a header image for kow.fm.

This is a post template page with a header image. A big barrier in the past for my writing, was that I had aspirations to include some homemade art with every post. But I never had time to do the Art, or it was just really junky, so the post never made it out. I wanted a design that could work equally well with or without a main post image. So that's what this is.

Post page template with no image for kow.fm.

I also mocked it up without an image and the above image is that. I like it. You can even peek the little aside box that I designed. Kow.fm will also host a course and a book, so the design for those pages needs to just be different. It can't follow the above blog patterns.

The lesson page design for a swift foundations blog lesson.

This is what the lesson pagef looks like, just like the blog design it works equally well with or without a header image. This design is mocked up with a header video. Offering video content. I know that I want to offer premium materials for a subscription to like... pay for things, and stuff. I also want the design to make finding and learning as much about swift as effortless as possible, so I added that endless Menubar on the side.

I haven't mocked up any upgrade or subscription screens yet though. I figured I could start with the free content first and then build the premium gate stuff when I have something to sell.

Dynamic type scales

Yeah so this website has a new dynamic type scale system. It's a really great concept that a couple of fellows at have been working on over at Clearleft; James Gilyead and Trys Mudford. They published this site about their idea and I freaking love it. https://utopia.fyi.

Before this I was highly skeptical of type scales in general. Designers generally just make that shit up anyway, have wild sizes for random ass pieces of a design. Titles are tiny, but only a little tiny, headings are almost the same size, except for h1s, which are huge for some reason. Not even to mention that margins, paddings, and line-heights are all different and special, for whatever reason. So yeah, I'm a bit jaded. The whole design system movement has made in depth, systemized designs much more common and easier to work with, but there is still a lot of confusing bloat to deal with when fitting fonts to different screens. This Utopia thing makes a lot of sense. Dynamically change the type size based on the screen width without media query janky breakpoints.

What is a type scale? It's a relationship between type sizes. When things change in size in a predictable manner, it looks predictable and pleasing to the eye. So a type scale will have those steps change by the same ratio at each step. Let's say your type scale is 1.25 and your initial type size is 16px, each step will be 25% larger or smaller then it's adjacent step. Example:

An example of a 1.25 typescale with type at different sizes.

I used to think this was a bit silly, but now I'm like... DAMN! That looks nice.

Now type scales should be tailored to their context. The mobile web will have a more reserved typescale versus the desktop web. On Desktop you've got a lot of real estate to work with. Big expansive screens, We want to take advantage of that. So the type scale should be bigger on that larger screen. This is what the large typescale looks like next to the smaller one.

Comparison of two different type scales.

As you can see, if you can see, we have two, proportional type scales side by side. They look pretty nice. I like them. You may notice that they don't use perfect pixel sizes, that's fine. Nothing is pixel perfect. Who cares. For kow.fm v15 I wanted to take the concept of a dynamic typescale and expand it to also use dynamic sizes for margins and padding. So I did. The Margins and padding are all dynamic based on screen width.

The type scale is dynamic. That means that the CSS is interpolating between two different sizes based on screen size. You can use a handy tool to calculate your own type scale. It works super well, only uses CSS Variables, and is super well supported.

Using the type scale in CSS is super easy. This is what the styles look like for the h2 and p tags in content areas:

.content {

  & > h2 {
    font-family: 'GreycliffCF', Arial;
    font-weight: 700;
    font-size: var(--step-2);
    line-height: 1.25em;
    margin-bottom: 0.5em;
    margin-top: 2em;
  }
  
  & > p {
    font-family: 'GreycliffCF', Arial;
    font-weight: 500;
    font-size: var(--step-0);
    line-height: 1.5em;
    margin-bottom: 1.5em;
  }
  
}

I've also added some nice typefaces and a simple layout so that text and content isn't as wide as can be.

I'm very satisfied with using the dynamic type scaling for kow.fm. So satisfied that I'm porting the whole thing to another project and doing even more crazy ambitious cool stuff.

What's next?

I'll be refining the typography, and some more type details and colors on the site next. Later I'll tacker header and footer stuff.


Karl Oscar Weber

What's in my head while I redesign

I thought it would be helpful to talk to ya'll about what's in my head and going on in my life during this redesign, and tell you about the goals of the redesign.

So. I've been freelancing for almost 4 years, almost got the hang of it, but DAMN! The last 16 months have been soooo. Up until about 6 months ago we were oscillating between broke, evicted, unemployed, and homeless. (homeless with a small h, we thankfully, never had to sleep on the streets). Anyways. It was tough. It's tough being married, with 3 small kids and not having a secure home. As a provider you want your children to feel safe, and to have continuity. I wasn't providing that. I had to make big changes to get through this really unlucky slump.

To get out of that we needed help. We lived at our friend Teodora's house for about 3 or 4 few months. All 5 of us in one little room. While living there I worked real hard to get a job, or a contract. I would apply all day, and work on anything I could to try to get people interested in me.

It was during that time that I landed a job at a startup in Utah. I was super grateful. I drove 1 hour there, and then 1 hour back every day to work. but it only lasted 3 weeks. They soon fired me because I called out blatent racism and colonialism in the office. I wasn't a good culture fit, they said.

To make ends meet we started doordashing, which takes up loads of time, destroys the value of the car, and doesn't really net much money. We did that for months. All while living in that little bedroom. Eventually I was lucky again to get a short contract from my friend. Contract gigs pay well, so it was enough money to pay some bills, fix some things, and enough savings to get a small 2 bedroom apartment. That contract luckily turned into a full time gig, YES! Now we're moving to Montana to work for this company.

So, during the last 16 months I've been greatly humbled, and I'm very grateful for what we have.

Anyways, this context is important. My experience has directly formed the goals and direction of my career moving forward. What does that mean for this redesign?

Well I started the redesign as a response this long period of uncertainty. I want to build something that can't be taken away. Something that can provide, even a little security. Then somethin happened.

I started working on a Swift Course.

Yep. I can write iOS apps too. Last year I was approached, (through email), to write a swift UI course by a publisher named... stuffd.. I think. After I prepped and wrote a huge outline they pulled out and I decided to finish it on my own. LO and BEHOLD as soon as that decision was made the folks at Ghost released their latest version making it really easy to sell access to premium content in your blog. Suddenly I can sell a course without having to write billing or login code. I just have to record the thing.

I decided to do just that, but then I had to ask myself how much to charge and how I would market it. Changing it into a blog sounded like a good idea. But, I just finished a whole year of total poverty and I got thinking.

Is it ethical to make educational resources that most can't afford?

Yeah so that's the question I asked myself. Because these courses go for $250 and up. $99 when they are discounted. Most don't finish the course and perhaps learn to make some apps, perhaps not. I'm not a greedy fellow, This course is meant to be a small supplement, not a main gig. I started to worry that my motivation for doing it was all wrong. I should be motivated to just teach as many people as possible. So I decided, it would be mostly free.

Yep. Rather than making a whole other big ass website that I have to manage, and another "brand" or "persona" or whatever I'm just going to host the dang thing on my main blog. I'll charge $9 buckos a month for some premium content. But almost all of it will be Free and open source. Why not?

Alright so this is a blog and a premium book course thing?

Yes. It's still my personal website and my blog. I'm just going to add a ton of educational resources to it.

What about, like..., the redesign?

Oh yeah! Some more context. So at my main full time job I'm an Open Source Developer. I work on their Design system and web front end. We have some ambitious goals to design a component library built on top of a flexible design system. I've also decided to modernize my skills by adopting CSS Grid & Flexbox for repeatable elements, and other crazy stuff. The goals are automatically responsive pages, accessible by default,  easy to compose User interfaces, and layouts without custom styles.

To achieve that goal I've been doing some experiments, I want to put these experiments to practice here before I try to integrate them into the design system. As a result, I'll be building a system here first, for the blog. I'll document each technical and design decision as I work through them. It will be fun.

In my next journal entry you'll get a peek at the design I have planned out.


Karl Oscar Weber

Website Redesign

UPDATE:

Hey Friends this is out of date, but I've gone in a new direction and started over again with new ideas and stuff and It's gone great, read more about that here: Start from sratch but make it basic.

A lot of people are suddenly Redesigning their website out in the open. I was in the midst of doing a redesign and thought, hell! why don't I redesign my website in the open too! So I am.

This website uses ghost, So it has a theme. You can see that here: https://github.com/karloscarweber/v15.

What prompted this? Frank Chimero started changing his website up, so I thought that was cool. Then this fellow tweeted that he'd do the same. He mentioned that Tatiana Mac said that it is pointless to rewrite your website in private, and you know what? she's right!

I'm trying a lot of new things with this redesign. I've recently been hired as an open source developer at a financial company. I work on their Front Ends and I iterate on a design system. I'm pretty ambitious as to what I want it to be. I want to share these experiments in levaraging new ideas in that project, but I should probably test these ideas first. So I'll test them here and tell you about it.

This Page will serve as an index, so that I can easily document the redesign. I started on Feb 21st 2020.

Posts


Karl Oscar Weber

Playbook: Marketing your freelance business

Playbook: Marketing your freelance business

Right so this is mostly a guide for me, to tell me what to do when it comes to marketing my business, which is just me. I'm my business right now. So when you don't have work do these things:

  1. Tell everyone that you're looking for work.
  2. Reach out to people that need help.
  3. Cold email people that you think need some badass work done.

Of course this is only secondary stuff when you're immediately looking for work. Levers you can pull, if you will. The most important parts of find work are these steps:

  1. Do your damn best for every project.
  2. People will talk.

It's pretty simple when you think about it. If people aren't talking about your work, then you have got to talk about it. If you don't have any work to talk about, then you gotta make some. Seems simple enough.


Karl Oscar Weber

Why everything I started in the last 8 years has failed

Why everything I started in the last 8 years has failed

This is gonna be a good one.

I try to do too much too quickly.

I overestimate how much I can get done in a slotted amount of time. I move on to new projects before the old projects are finished. I don't make enough money freelancing to support a side project, but then I start one anyway, lose my contract, and have to work double hard to get another contract and just pay rent.

You can see clearly that I've got some serious problems that I've been working through here. In the last year I've finally been able to come to grips with the primary cause of all my frustrations: Having too much to do and not enough time to do it. Well I can't make more time, so the solution is to have less to do.

And voila! That has literally solved most of my problems. Especially with freelancing.

The problem with Freelancing

you either work hourly or work for a fixed bid contract. I've had a LOT of projects over the last 3.5 years. A lot a lot! about 2/3rds were successful projects, but 1/3rd failed. That's a really really high failure rate. I needed to fix this. 1 out of 3 failing is so so bad. It's not like I wanted to fail at these projects, but I believe I started the Freelancing section of my career with the wrong assumptions.

It's common to read interviews with business people about taking on a big project they didn't think they were ready for, succeeding, and saying that it all worked out. everytime I've done this i've failed. Missing a deadline by a day or a week or a month is still missing a deadline.

Every project that I took on that was a bit of a stretch ended up in flames. As a freelancer you need to earn enough from each contract to last until your next project. If you don't charge enough, and you fail, you've lost a paycheck. If you lose a paycheck without savings then everything in your life goes into freefall. I can't tell you the number of times I've pawned everything we owned just to make rent or buy food. Hell I've bought and returned so much ikea furniture like you wouldn't believe. (Ikea has a 1 year return policy. An Ikea receipt is like cash! It's ridiculous)

So how do you fix this?

It's all about margin

It's necessary to have enough space for the unexpected. The unexpected bill, the unexpected delay, the unexpected disruption. As a freelancer, I had become reliant on a rigid sytem of estimation, for time and money. When a problem arose I couldn't properly deal with it, because there was no room to deal with it.

I've mitigated this problem by adding more margin to every pain point in my process. I've added more time to every estimate, much more than I need. I've lowered estimate prices for projects. I've lowered personal expenses, so we can get by on less.

Margin could be represented by operating capacity. Take a truck for example. If it's rated to carry a maximum of 4,000 pounds, then it can probably carry 6,000 pounds. Placing a maximum limit at 4,000 pounds provides a safety margin for the operation of the vehicle. That's not to say the the margin is never used. In adverse conditions, such as when your carrying 4,000 pounds of blankets outside in the rain, with all of that extra water weight added you'll need that safety margin.

Having financial margin, also known as savings, is super important. Something like 43% of americans can't cover an unexpected $400 expense. They don't have savings. Which sucks because they aint stupid, Wage growth has just stagnated for almost 40 years. I have to remind myself that I can make apps and websites and get paid a ton for it. So I should probably save as much as I can and be greatful.

That extra financial margin is basically assumed by everybody, but building up a savings margin is difficult as a freelancer. It's just hard.

In conclusion

Everything I ever started in the last 8 years failed because I didn't have enough extra space in my life to handle minor problems, which then turned these problems into disasters.

Please add margin to your life and be happier.


Karl Oscar Weber

Grab Bag, Week 1

Grab Bag, Week 1

HELLO FRIENDS!!!! It's time to give an update on the development of all the stuff in Grab Bag. I've made great progress across prizmo and KOWFM v12.

Prizmo

I built out more of the API this last week. I'm working on an involved component that handles API keys and sessions. It's difficult because the system is a bit co-dependent. You need to make session keys in order to make api tokens, but you can't do one without the other. It's been a real stretch to test the design process behind an API, and try to simplify it architecturally before calling it complete.

I feel like Prizmo will get done this week. I've been futzing with it for a while and I'm at a point where the architecture is very clear in my mind.

Prizmo is an API that i'm building completely OAuth2 compliant. That means that you'll need to get a token in order to execute any request. I'll map out the architecture and show you how it will work next week.

KOWFM v12

SinkingArticleIdea

I started working on the KOWFM v12 template. KOWFM runs on Ghost, so this usually starts by bring Tachhyons into the project and then replacing Ghost's built in styles bit by bit. I just straight up stripped everything instead and then began working on the GRID and layout. I always work on layout styles first.

I was also able to add the typeface to the project, and for a while I wanted to use CartographCF, but I switched to ManifoldCF and I couldn't be happier.

KOWFM v12 is an experiment, like all versions of KOWFM are an experiment. It's split, visual content is on the left, and text content is on the right. There is this uncrossable gutter that seperates the design. I'm not very good at making visuals and I wanted to stretch myself and give a dedicated canvas for practicing my art without disrupting the flow of the text.

CheddarKit

I didn't work on CheddarKit at all this last week, but only because I feel like some focused effort on Prizmo would push it over the edge. I'll pick CheddarKit back up in Week 3.

I'm actually really excited to focus a couple of weeks solely on CheddarKit. I want to try to add a small feature to Cheddar for Web in that time. I'll share more about it soon.

Up Next

I'll be sharing details about the design and implementation of #prizmo, and the design and art direction of v12. Please subscribe for email updates below if you'd like to follow along, or you can follow me on Twitter @karloscarweber.

See you soon friends.


Karl Oscar Weber

Independence: My Plan for 2018

Independence: My Plan for 2018

My plan for 2018 is to become independent from Freelancing by designing, building, and selling my own software.

I have a lot of projects, A LOT! I've cut and canceled many, but it doesn't change the number of things I want to do. Lots of people say that lack of focus is a recipe for failure. But my momma always said that: "if you fail to plan, you plan to fail". So in order to really gain my independence through selling software AND to do all of the things I wanna do, it requires re framing my goals and focusing on that.

So what prompted this? A lot of things all at once actually. I set some goals in the new year, I came across this presentation from Pieter Levels, I learned that another freelancer was doing a web app challenge, and then another started the challenge too and wanted to share their progress and thought of this: personal project challenge. I just joined wip.chat, which rewards you with a streak if you ship every day.

Lot's of stuff.

The goal?

AbstractGoal

Financial independence. As in all of my family's basic monthly expenses are covered with monthly recurring revenue. For us that's $3,000.00. I'll need 300-600 monthly customers to achieve that goal.

Because I still need to Freelance full-time, I can only dedicate a couple of hours a day.

I have a few other goals:

  • Offer design as a service.
  • Learn to play the piano and make music.
  • Make Art every day.

So a goal is what you want, a plan is how you get there.

The Plan

I'm setting aside 2 hours a day, and that's it. No more time. The time constraint is very important. Limitations improve creativity, and foster focus. Plus I have full-time freelancing and a family with 3 kids.

I'll only focus on 1 project at a time, and I'll only have 3 months to complete and launch each one.

I'll write about my progress each weekend and release a post about it on Monday. I'll also be able to work on my other goal of making art every day because I want to make art for every Post.

I'll start an email list and send an update every week on Monday.

The Projects

I have a big advantage because none of the projects that I'm working on are new, and I'm not starting from scratch. Many of them have partners. But each one is stagnant for one reason or another. Most of what I'll do is Development and Marketing, which is just fine I'm good at development but not marketing. I'll be able to learn as I go.

First: Grab Bag

AbstractGrabBag

I'm spending a month finishing a grab bag of small things that are all at various stages of completion; KOWFM version 12: The 12th version of my blog fully designed and ready to build, CheddarKit: An iOS SDK for Cheddar that's about halfway done, and PRIZMO: the API backend for Adventure Times that's almost ready. The great thing is that the Grab bag will make each project much easier to complete.

Second: Adventure Times

AdventureTimeAbstract

Adventure Times is a great app designed by my friend Andrea Montoya. The idea is that it gets you outside of your house and into the outdoors, it helps you discover things to do outside, like camping, or hiking, or snowboarding. Specifically it will find those activities nearby and show it to you on a cool interactive map. There are some other features that make it pretty cool and build community. So it's an exciting project.

Third: Cheddar 2.0

CheddarAbstract

Cheddar is a to do list that's just text. It was built by the solo designer and developer Sam Soffes back in 2012 and then later sold. I've been a fan of it ever since and was happy to buy it for myself in 2016. I've been keeping it alive for the last 2 years, throwing design ideas around, and testing out code. Recently Plans for version 2.0 solidified and Cheddar became the first official app of Prologue Productions.

Everything I make for Cheddar will be Open Source. That's a pillar of Cheddar's values and I want to continue with that.

Fourth: Milkjar

MilkjarAbstract

Milkjar is a simple budgeting app that you can share with 1 other person. It makes planning, controlling, and understanding your finances possible. Milkjar is an app that I've been thinking about for a long time. I actually have 4 designed versions of this app, and started it a couple of years ago with my friend Devin Osorio on the bus back from Rails Camp West. With an API, feature Set, and visual identitiy defined and developed, I'm excited to focus on the execution of this project more than anything.

Accountability & Motivation

I hope that by documenting and sharing my progress I will personally improve and grow, and that anyone who follows along and reads through the process will also learn some of the lessons that I will learn along the way.

To stay motivated I've joined wip.chat, Which is a... Chat. You can use it to track your progress, like a public to do list, but it displays that progress in streaks. As long as you complete something everyday, you won't break your streak. Publicly sharing my progress has really helped me to stay motivated and I'm excited about it. If you're doing something similar then I suggest you sign up too.

I'm also joining whatever this turns into.

I'd love to hear about your own personal project goals. Send me an email at me@kow.fm

And follow along by subscribing down below.


Karl Oscar Weber

The Pulse

The Pulse

I've been freelancing for about 9 months now, and I've actually been paid, which is good. I think that means that I'm making it. But I've screwed up and almost lost everything more than once in the last 9 months. I have opinions, and I'd like to share them.

The Pulse is a short weekly podcast about my Freelance business, how I'm doing. I'm trying to keep my business running while not running it into the ground. Small, short lessons about freelancing from somebody who has screwed up enough in the last 9 months to know what you probably should not do. The Pulse is as much to help me, as it is to help you. I'm going to learn a lot about keeping this thing going without running out of money every few weeks.

You'll learn things like, How to avoid eviction, How to Sell and Pawn your stuff, How to charge enough to pay the bills, what to never say to a client, how to get fired, and more important lessons that every Freelancer should know.

I'm using Bumpers.fm to record and launch the whole thing. Which means that you Can't subscribe in your favorite podcasting app. Subscribe directly in Bumpers.

The first episode lands on Tuesday.

Things Are Changing Around Here

KOWFM has always been my blog and personal website, but It's about to be something different. I'll be broadcasting and publishing more than ever, and inviting others to publish here too.

I have a new twitter account to keep up with everything that's happening on the Blog: @kowfm. There is also a new monthly newsletter which you can subscribe to in the footer.

Finish Everything

There are Eleven Weeks left in 2016. I'll finish or cancel every project I have by the end of the year. It's time to get things out the door, whatever that means and move forward. Won't you tune in?

P.S.

I'm selling a single Ad spot for The Pulse. [Contact me](mailto:me@kow.fm?subject=I'd like to Sponsor The Pulse) to get a spot.


Karl Oscar Weber

Protocol Definitions in Swift

Today I ran into a difficult to identify bug while implementing a Swift Protocol.

Swift Protocols and the Protocol pattern has been around in Cocoa for a while and usually takes the form of Delegates. Swift Protocols are much easier for us to write, understand, and use. Protocol oriented development makes the whole shebang easier to understand.

Protocols are defined like this:

protocol MyProtocol {
  var myName: String { get set }
  func myFunction(doIt: Bool) -> Bool
}

Variables can also hold blocks as types, and you can require a block in a protocol:

protocol MyProtocol {
  var myBlock: (String) -> Bool { get set }
}

This is where I ran into a stumbling block. I had incorrectly added parameter names to the blocks parameters list:

protocol MyProtocol {
  var myBlock: (myName: String) -> Bool { get set }
}

This may seem innocuous, and the compiler didn't flag an error here either, but when trying to conform to the protocol You'll get a: Does not conform to protocol error:

class MyClass: MyProtocol {
    var myBlock = {(myName: String) in }
}

This confused me to no end! the method signatures are identical! Why is there a problem! The compiler's error details also didn't explain how to fix the problem. I finally figured out that in the protocol definition my block should have no parameters listed:

protocol MyProtocol {
  var myBlock: (String) -> Bool { get set }
}

Block method signatures should be written without parameter names. Perhaps writing block types with parameter names should throw an error? There's an idea for a Swift Evolution proposal.

Update:

Caleb Davenport has pointed out that The code does compile as long as the block signatures match. Argument names are part of block signatures just like functions.

Swift's Type inference is powerful, but I suspect that It can't infer named parameters within a block.

protocol MyProtocol {
  var myBlock: (myName: String) -> Bool { get set }
class MyClass: MyProtocol {
  var myBlock = {(myName: String) -> Bool in 
  return false}
}

Explicitly writing the block type as part of the protocol conformance is necessary:

protocol MyProtocol {
  var myBlock: (myName: String) -> Bool { get set }
class MyClass: MyProtocol {
  var myBlock: (myName: String) -> Bool = {(myName: String) -> Bool in 
  return false}
}

Thanks Caleb for that clarification.


Karl Oscar Weber

Serving Independent Artists & Designers

Serving Independent Artists & Designers

I want to spend my time making things I'm proud of.

I'm not proud of 90% of the work I've done. I'm changing that. I've worked on implementing features and designs that clients thought were a good idea and just, weren't. Most startups are making complete crap. Useless stuff like delivering the ingredients for a home cooked meal to your door, or virtual personal assistants. What's worse are the horribly ugly design directions some clients want to go. It's just, ugh.

Why can't we make really beautiful experiences that may or may not change the world?

I'm just coming off of this creative High from ValioCon, which was an amazing Conference. I wrote a flippin book full of notes and I'll share soon. The biggest thing I learned is to stop making crap that you don't enjoy. Just because You're not good at what you like to do doesn't mean you shouldn't do it! Sucking at something is the first step to being kinda good at something. So I'm going to do the creative things that interest me. As part of that I want to collaborate with Independent Artists & Designers.

I'm a freelance working remotely and I want to keep it that way. I'm working with the Talented Ash Huang, who spoke at ValioCon and she is writing another book. Really amazing stuff is coming out of Ash right now, Creativity wise. We're building Amulet. I'm very fortunate to work with such a talented Artist/Designer/Writer. And I don't want this to stop.

I want to collaborate

I want to collaborate with the best independent artists and designers on their crazy amazing projects. If you don't think your the best then I definitely want to collaborate with you because You're probably the best anyways. Working with Ash and meeting so many ridiculously creative people at Valio Con has convinced me to keep doing this. It's a great experience building something that I believe in, that's beautiful, and actual makes lives better.

Making stupid stuff is fun too. Really, it's fine with me. If something is silly but beautiful and interactive I'm on board. Our work shouldn't require some economic incentive for it to be built, really it shouldn't matter.

less expensive not less valuable.

So I'm working for less, much less. Sometimes for nothing. I've dropped my rates way way down. I'm going to take projects that I agree with creatively, and I'll work as a collaborator. It's better to bounce ideas off a collaborator anyway. This doesn't me I'm delivering a second rate app. Nope. Nothing like that. Nothing is half assed, I'm 100% full ass here.

My Expertise is in Front-End, Back-End, and iOS development. So if you need an app, or a website, I'm your man. I'm an obsessive technologist desperate to try new things. If you have an idea for a game just like... why haven't you sent me an email yet?

I call this idea of mine Design Rocket!

For independent Artists and Designers my rate is $1,000/wk or less depending on the project and the client. If you're not an independent artist or designer, You can still hire me, My rate is $2,000/wk.

This isn't regular freelancing, I'm working at a reduced rate only for those creative people with an interesting idea and not a big budget.

I want to hear your amazing ideas. My email is me@kow.fm. Questions? Comments? Concerns? Send them on over. You can also find me on Twitter, twittering tweets as https://twitter.com/karloscarweber

I'm looking for great people with great ideas.

I look forward to hearing about all of the amazing stuff you want to make.


Karl Oscar Weber

Minimum Viable Post

There are a lot of those silly, startupy self help Blog posts about what's necessary for a Minimum Viable Product. That's great for trying to whittle down your idea to just the most necessary parts of it. But what about the progress to get to that Point? or the Effort needed to market your shiny new thing? I'd like to introduce a pattern that I call Minimum Viable Post: The smallest bit of change that is worth reporting.

Most Software Developers are already used to publishing small pieces of progress, it's called a change log. I'm not about to announce a new startup that embeds change logs easily into your blog, but I do suggest that you have a record of when you accomplish something small, and what type of accomplishment it is.

This is what my changelog will look like:

My personal Changelog

Update: Trigger App has a really good example of what a Roadmap would look like: Roadmap, which is very similar to the changelog in this context.

Update, Update: So Cheddar is back alive now and here is the Cheddarapp.com/Changelog.

Update, Update, Update: CushionApp has a really great example of a changelog: cushionapp.com/changelog


Karl Oscar Weber

We Need Time Alone to Think

We Need Time Alone to Think

The other day I was sitting down in bed holding my little girl, she's a newborn and not apt to sleeping at night sometimes. Lately I've been rocking her to sleep in our rocking chair (a great investment) and in those late night moments I often have my phone with me. Well this night I decided to put my phone down and just think.

You'll never know how much of your time is being stolen by the internet until you find yourself rocking a baby to sleep hardly noticing her. I was ashamed at all the time I dedicated to reading Twitter and playing games without the thought of looking at the little person I'm responsible for.

"A life devoid of self examination is one without master or commander, plan or course."

In this new connected world we've created for ourselves, content and amusement is literally in our pocket at any moment. With our smartphones we have never lived more zombie-like, disengaged lives. I decided to put my phone down and just be with my sleeping daughter for a while. I decided to sit and think.

Thinking in this way, in the middle of the night, basically by myself (my daughter doesn't say much yet) I felt calm and at peace. How often do you feel peace in your life? I thought about myself, my family, and my life. Sitting and thinking gave me an opportunity to re-evaluate things that I had been doing correctly, and incorrectly. My rights and wrongs; and to Steel myself to work my way out of the foibles of my life. A life devoid of self examination is one without master or commander, plan or course. I realized that I was a bit lost lately, at least in my conduct outside of my profession.

I recognized what I had been doing wrong and worked out ways to do better. I just required a few quiet moments with myself.

I've decided to have some alone time every single day. I find it to be the best way to clear my mind and to work through the imperfection that is myself. I'll sit and think, or walk and think. I encourage you to find some quiet alone time every day to sit and think. Make certain it's by yourself. Have no expectations for this time, other than to have no agenda outside of peace. Forget your phone, not even a book, reading is for later. Sit and think. I promise you'll feel better than you did before.

All of this sounds a lot like meditation, which has been proven to reduce stress, improve concentration and memory, and even makes you happier.

Cheers!


Karl Oscar Weber

You need your own Space to effectively work from home

You need your own Space to effectively work from home

Today my wife and I decided to reorganize our little room. It's five of us in a 12x12 foot square. Three beds in one room proved to be too much, So we decided to put our 2 year old's bed into storage. Children are obedient to their parents, our little boy was not angry, but a little sad to see his bed disassembled and put into storage.

After Cleaning up the room and putting everything in it's place our son was happy to see that his bed was nestled next to his toy box in a new part of the room. "MY BED!" he exclaimed. Overjoyed to see his bed in it's proper place again He immediately layed there to hug his stuffed animals, A big soft elephant, and two identical ikea bears that he's named Dabu. His mood was immediately improved to find that he had his own space again.

If my little boy could immediately recognize the value in having a place that was his alone, then surely there must be something of great value there. Children have a skill of recognizing the really important things in life. Let me share what I believe a space needs to be effective when working from.

Personal.

Whether it be a desk, a room, a bed, or a couch, whatever you choose to be your space needs to be controlled and maintained by you. Choose your own chair and desk. Decide where to put your furniture, what your furniture is, and exactly how it's organized. By maintaining a sense of control over your surroundings you'll also feel a sense of stewardship.

Your personal space should be a place that you feel comfortable exploring new ideas. Making it your own is essential to that plan. Sometimes you'll want to take a break, having a good book nearby, and reading it, helps me to be inspired and focused on work.

Respected.

For a short time we had my small desk in our little room. It was a bad idea. It quickly became the dump spot for everything out of place. Nothing is quite as discouraging than to find my desk covered in someone else's stuff.

Your space needs to be respected by your family. Recognized that it's special and that not anybody can just dump there. If you live alone then it is you that must respect your space. It's got to always be a place of thinking, study, and work. By working there and not playing there, you'll always be productive in your spot.

Clean.

They say that cleanliness is next to godliness, and they would be right. Having a clean and organized workspace is distraction free. Working from home is still working, and it doesn't work if we can't work. Having a clean workspace doesn't necessarily mean an uncluttered workspace, but one where everything has a place.

My little desk has a built in drawer. I keep a notebook, a programming book, and a typography book inside. I also have my scriptures. There is a box filled with stickers in there too. From time to time I slap one onto my laptop just for fun. Everything I keep close has its place and has a purpose, and that's how I like to keep it.

I hope that you were inspired to keep your workspace personal at home. Perhaps you have some new ideas, or a renewed vigor to improve your workspace, at least I hope that you remember to respect your space to keep it special.

Cheers.

You need your own Space to effectively work from home.


Karl Oscar Weber

Diminishing Returns of Working Late

Diminishing Returns of Working Late

I'm new to freelancing, which means I'm new to the scheduling and work conflicts that inevitably happen when securing enough projects to sustain myself. Oftentimes I feel overbooked and guilty because of the time that I miss with my family. Extra work means extra money, in exchange for losing the company of my wife and children for a few days.

It used to be that if I had a project due soon, next day soon, I would stay up late to get it done and out the door. The next day would always be horrible. Sleeping in past noon, an unfocused work ethic, a much shorter work day, and a disrupted schedule that won't be back on track for a week; All symptoms of the all nighter.

Working late is no longer an option for me. I've had enough. I will no longer work past my bedtime to deliver a product. The results in the work, and my personal life are sub-par and reeks of the rheumatic decay of aging obsolescence. I will no longer sacrifice Quality and family time for any sort of deadline.

Working Late Destroys your schedule.

Mankind is a species of Habit. We operate on autopilot most of the time. Routine actions are easy to perform, and we seldom need to think about them. Our Wake and sleep cycle is doubly tied to a stringent schedule, any disruption will throw our bodies way out of habit and destroy the focus time that our schedules are meant to protect.

Working late Reduces productive hours.

The next day is a destroyed day. I only get maybe 3 good hours of work the day after working late. It takes at least a week for me to get back into a healthy sleep schedule. That week is basically shot. I end up further behind than when I began.

Working late becomes a new habit of non-productivity.

Do you know the old adage: "If we're always on Red Alert then Red Alert means nothing?", Same thing with rushing work. If we're always rushing to finish work then rushing work doesn't mean anything. If we're always working late to finish something, then that will become the new norm, a heightened state of panic and fatigue, and it will mean nothing.

What to do?

  1. Just say no: If something is going to be late, then postpone it. Own up to it and move onward. If you lose work for this then you probably shouldn't have scheduled the work in the first place.
  2. Take less work: The less work you have, the better work you'll do. This is difficult when you really need the money. Suck it up and budget for less, have months of savings. Do better work for better clients.
  3. Stick to your schedule: never deviate for extra work, it is a slippery and expensive slope. Don't work more time than you usually do, and always work at the same times. Habits will form and productivity will improve.
  4. Overestimate the time it will take: Give yourself a buffer of extra time in each project for unexpected difficulties. It's guaranteed that you'll run into them. Having that extra time will mean the difference between working late and being late. You Never want to be late.
  5. Schedule realistic deadlines: The most important factor is to have a realistic deadline for when you'll finish your work. Optimistic deadlines are the bane of our existence. Never be late by never promising something will be done in less than a week. Everything is at least a week out for me now.

I hope you'll practice the hard lesson that I've had to learn, and learn from my mistakes. Good Luck.

Cheers!



Karl Oscar Weber

Hitting Reboot

A few months ago I started writing a programming book called Swift Foundations. Soon afterwards I also decided to start a podcast. Trying to do both projects at once was a big mistake. Deadlines have been missed, as well as opportunities. I was really distracted and stressed out of my mind. Recently I decided to start over, not only with my own personal deadlines, but also with the goals I had for my Podcast, and My Book. To scale everything back to manageable levels. I've decided to release my Book early.

Starting Today Swift Foundations (Beta) is available for sale and in open Beta. So... What does this mean. Well the book is for sale and almost done, But rather than wait until it's completely finished I'm releasing it into a Paid Beta Program. Anybody can buy the book, unfinished, and get to read the chapters as they get finalized for publication.

I'm really excited to get the book into the hands of as many Beginners as possible to see what they think. You can buy the book here: Swift Foundations, A Free Chapter is also available on the same page.

Feedback or comments are welcome, reach me by email at me@kow.fm, or on twitter @karloscarweber.


Karl Oscar Weber

Lessons Learned Writing Swift Foundations

A couple of months ago I started a pretty ambitious project, A programming book for Beginners: Swift Foundations. I also began working on a new podcast for this blog. Doing both at once was a bad move and my expectations for both projects were far below what they turned out to be.

I bit off more than I could chew. The Book ballooned from something simple to a directionless wreck. It was riddled with what looked like GOTO statements touching on every programming topic imaginable, I would add a chapter about almost anything. I had a full time job, A budding family, a Podcast to Spin up, and now a colossal book, Spreading myself so thin made everything suffer. It was an unfocused mess. I threw most of it out and started over.

I got distracted with this tiered pricing strategy with bonus content, videos, and sample apps. Eventually I remembered that I didn't want to write books, I wanted to make apps. I just want to write one simple book for beginners, not juice them for cash or become an independent author. Not that there is anything wrong with that, it's just not what I want to do. I want something Small, Focused, and Cheap.

Fewer Chapters made my book BETTER.

I Hit Reboot on my book by focusing on the essential concepts. I dropped the chapter count from 26 down to 6. I took a lesson from my own experience trying to learn to program PHP from a book. I learn best when I have a couple key concepts to practice before I move on to something new. This lesson was completely absent from Swift Foundations, I was teaching too much in a shallow manner It just wasn't a beginner friendly book.

Focus on the Basics

Focusing was the best thing I ever did. It was always supposed to be focused on the basics. Each Chapter teaches a couple core concepts in a relatable and comprehensive way. A quick explanation is given for concepts that aren't necessary to build the app. Core concepts, like the fact that data can be stored (which is earth shattering when you really think about it) are explained and demonstrated in various ways to ensure comprehension.

Show, Don't Tell.

Lots of examples are better than lots of explanation. A picture is worth a thousand words, but so is a block of code. The code to Text ratio in the book is about 60% text to 40% code, Just enough explanation to describe exactly what the code does. There are also examples of what not to do, incorrect syntax, or tricky situations to avoid. Warning signs are there. Enough Screenshots to paint a complete picture of what you'll build. Most of the chapters build a piece of the app step by step so that you won't get lost along the way.


Karl Oscar Weber

Micro blogs are already here

Microblog spec

I read Manton Reece's thoughts on defining a micro blog post which is pretty cool.i think that what hear getting at is a twitter replacement. Recently news broke that Twitter feeds would change from being a chronological list, to a more random algorithm driven feed. Tweets will show up in your feed based on yor interests not the people you follow. This change makes Twitter a much less useful tool for broadcasters and would essentially make Twitter useless for journalists.

We're stuck in this predicament with Twitter because they just need to make money, and We the users, are the product. It's almost surprising that Twitter has taken this long to make clearly money making decisions. This frustrates and unnerves everybody because we don't want to be sold.

We aren't in control of Twitter and we never were. Now we want to be in control. We're in control of our blogs and we never weren't. We want that control with twitter now. And I think that's the point of Manton's post, to replace Twitter.

I think that in order for a micro blog standard to really replace twitter it needs These features:

  • Use RSS.
  • Free for casual users or paid for power users.
  • hosted independently just like blogs.
  • Broadcast and Subscribe from the same client.

It wouldn't even be necessary to invent a new protocol, just building an RSS feed aggregator into our blogs, and then truncate the Tweets based on an arbitrary character count. Full blog posts would be truncated and expanded with a tap.

And just like that the whole twitter problem has been solved.

What do you think? Send me an email at me@kow.fm.


Karl Oscar Weber

48 Hour Book Jam

So this past Weekend there was a 48 hour game jam held in downtown Salt Lake City. I really wanted to participate but I realized I had slowed in my progress with Swift Foundations. If I was ever going to get the book finished it would require a huge effort to get the first Draft Finished. So I challenged myself to a 48 hour Book Jam.

Officially the goal is to write a book in 48 hours, or at least to finish the one I'm currently working on. I wasn't able to achieve that goal, but the book is very close to a completed first draft. I've also submitted the first sample app of the book, Stand To Make , to the app store.

Stand To Make is an app version of the popular web app. It's a calculator that helps you to understand how much you stand to make with selling a product after procesing fees. I have found it to be an invaluable tool and have wanted to turn it into an app for some time. Well Today I submitted version 0.5, the final version in the book to the App Store. It's not as pretty as it should be, but it works very well for estimating app Store revenue.

You can download the source code from github.

Now to finishing this book.


Karl Oscar Weber

Writing things

I used to do much more writing than I do now. The way that My wife and I worked ourselves in to love was through our letters. Pages upon pages of love letters. Since getting married and becoming parents the time that I have to sit down and write has dwindled. I have to make a concerted effort to sit down and write. Let me explain some of the benefits to writing daily.

Writing Improves your Thinking. Regularly Writing will help you to recognize the patterns and shortcuts in language. Because we think through our language, greater understanding improves thinking.

So Write more, and get better at thinking.


Karl Oscar Weber

How to make a realm model in swift

I ran into an issue when making my first realm object in swift. Realm is a new embedded database engine that treats models like objects. It's pretty slick.

I ran into trouble when trying to create my first Realm Model in Swift. Here is a gist for that:


	import Realm

class ModelName: RLMObject {
	dynamic name: String = ""
	dynamic value: Int = 0
}

Karl Oscar Weber

Interviews for the Book

I'm writing a book, Swift Foundations. It's a beginners book for learning to make iOS apps using Swift. It's going to be pretty rad.

kow.fm is still a pretty new thing. I purchased the domain on a whim, with the intent to broadcast myself via podcasting. It also eliminates the pesky misspellings of my email address: me@karloscarweber.com. Although I maintain that domain, kow.fm just rolls that much easier off the toungue.

With the development of Swift Foundations I've decided to conduct a series of interviews to promote the book. Focused on iOS developers, with the rough topic of staying motivated as a beginner, the first round of podcasts will be bundled up as Season 1.

Wrapping the podcast up into seasons relieves a ton of pressure. Producing a podcast on a regular basis is no longer a commitement. Now I can plan a topic, research Interviews, content, and promotions, and then produce the season around that. I can interview whomever I want to interview. I can even interview my mom, which will happen next season.

So I've thought a lot about what I want my Podcast to be. I have a little plan that I follow to produce an Episode.

Step 1: Contact

I've never met most of the people that I plan on interviewing. I was actually surprised that so many of them agreed to an interview with a complete stranger so quickly. I was originally nervous about asking for an interview from so many complete strangers; but I mustered up some courage and began to make contact.

I made a list of names, and "reached out" to each one in turn. This means I cold emailed them or messaged them on twitter. I began monday morning, and by monday evening I had 5 confirmed Interviews and a Pre-Interview phone call lined up. It was exciting receiving so many positive responses to my requests.

Step 2: Scheduling

Scheduling the actual Pre-Interview phone calls with each Guest is difficult. Most live in different time zones. Calls have to be adaptable to their schedule, and My Schedule. It's more difficult for me because I'm also working a full time job whilst conducting these phone calls. Today I have 2 Pre-Interviews, and 2 meetings scheduled, all juggled together like so much Wizardry.

Although I gripe, A quick email exchange with a guest and some creativity and patience yields a mutually agreed upon time for a phone call.

Step 3: Pre-Interview

So I think it's important to do appropriate research about a guest before recording with them. Jumping into an interview without any idea of what we're going to talk about is just silly.

Each Guest has a unique story and perspective, things that only they can share. Their ideas and thoughts are topics of discussion. The Pre-Interview gives us an opportunity to find their unique story. Each Season has a topic, and we find stories to fit that topic. Sometimes we find something even more interesting to talk about on our way to those stories.

One such phone call was with Sam Soffes. Sam Created a little To-Do list app named Cheddar, which he subsequently sold. I have a great love for cheddar and I still use it today. It's the flipping best. Anyway, so after our phone call he made a video requesting feedback on whether or not he should make another to do list app. He mentioned two seperate conversations that told him how much they loved Cheddar.

How awesome is that? Now I know what it is that we can talk about in our interview.

Step 4: Define Questions

Now that I have a short, private interview out of the way I go over the notes from the interview and prepare a list of proposed topics and questions. This seems manufactured but I believe that it produces a better interview if a guest has an opportunity to prepare. Preperation + Opportunity = Luck. Or, those who fail to plan, plan to fail.

Defining the questions beforehand allows us to find any topics that might be off limits, or that our guest would be uncomfortable discussing. It also allows us to really talk about what's unique to them, What perspective or experience do they offer that you just can't find elsewhere. Other questions and topics will arise, of course, it's a discussion.

Step 5: Record & Publish

At the end of the yellow brick road, is a darkish sound proof room with a microphone, and a draft. You just have to do it. DO IT. just make a phone call, start asking questions, and record everything that happens. Recording is good.

Once you have the recording, you edit it and then you publish it. Real rocket science. Around this time you tell everybody that you know that you just posted a new podcast and that you really want them to listen to it.

Wait for the listens to stack up and the feedback to roll in.

I hope that you found this as helpful as I found it enjoyable. If you have any questions, please message me on twitter or send me an email.

Now go forth and record.


Karl Oscar Weber

Oblivicons

Oblivicons vol 1

I made a few icons inspired by the movie Oblivion. They are free through Gumroad: Download.

They scale very well to just about any resolution. I designed them in Sketch with Pixel Hinting in mind so they look smooth at lower resolutions.

lots of icons


Karl Oscar Weber

How's the Book Going?

I'm writing a book that teaches Swift to beginners. Unlike my previous attempts to write a book I have a co-author this time.

My Sister Danny said to me that one day she wants to do what I do. I make apps and websites, So naturally I was very excited. Teaching brings a whole new perspective to a subject. It's one thing to program, but another to teach programming to someone else. It's really difficult. I was excited at the opportunity of teaching her to program.

Danny started to learn to program about 2 months ago. I was teaching her the basics of Objective-C development, I had given her all the heavy programming books that I read through trying to understand Objective-C, I became a much stronger developer for it too. None of these books are written for a beginner's audience. Every book required some programming experience before, and no explanation about how anything actually works. Very abstract for a student completely new to programming. This always frustrated me when I was first learning to program.

When I was growing up my older brother was the one that had the computers. He bought the computers, used the computers, even administrated them. He was the Lord of the computers and I wasn't allowed to touch them. Which SUCKED. Imagine trying to learn to program from arcane texts of crazy math that all assumed you had some programming experience, when in fact you didn't even have a computer.

I understand the frustration. So now that Danny wanted my help to learn to program I decided to write the book I wish that I had when I started. Danny is writing this book with me, each chapter is a team effort, make now mistake. Swift is a brand new language and there are going to be bumps along the way.

How we work

I write most of the text, code examples, and tutorials, Danny reads, learns from, and edits the book. We track changes using Github. We use Github's issues to track bugs, and progress on the book using Milestones. We've set up a Raneto installation that is synced with Github to share the book as it's being written. Danny can read new chapters and leave feedback on Github for me to correct. We meet one to two times a week to go over new chapters and each issue in depth. We believe that having a beginner Read the book as we're writing will identify any problem areas in the text before we publish. Plus it gives us the opportunity to teach Danny completely, without leaving anything out.

The goal of the book is to have complete beginners pick up the book with a bit of determination, and to finish with the ability to write fully featured iOS apps.

It is a rewarding experience to see this come together so well. The opportunity to teach is awesome.

Our Plan

We plan on selling the book as a ebook with resources, videos, sample apps and code included. Nathan Barry has been very successful with this model. He's actually just released the second edition of his book Authority it's about building an audience through teaching. Our goal is to release our own apps together. The journey to finishing an app is paved with lots of tough problems that we will write about it. Danny doesn't have previous programming experience, this makes every new app we work on not just an opportunity to learn, but also to teach.

There is no other career that I can think of that has such an endless expectation of continual education. What we do is always changing, and it always will, and that is a blessing. There will always be something new to learn, or an existing skill to improve upon. It is so much fun. On the way we'll write books with our apps. We'll share as much as we can on our blogs. The generosity of the Web community is something that I've always wanted to participate in.


Karl Oscar Weber

WWDC 2014

There were a lot of reveals in this years WWDC keynote. It was crazy. They just announced hundreds of new technologies for developers that open up whole new possibilities. There are too many features and apis to talk about. Routinely, Apple adds popular features and services that other companies have been offering for years, albeit with an apple twist. There was much of that as well.

Swift

Apple just announced a new programming language named Swift. Swift is envisioned to make developing for Apple platforms easier, less error prone, and more awesome. It is very awesome.

This is what it looks like:

var myVariable = 42
let myConstant = 42

The crazy thing is that Swift, right now, is 100% compatible with current Cocoa APIs. In fact you can mix C, Objective-C, and Swift together like a smoothie. This magic is achieved by the new and improved LLVM Compiler that apple is using, It can distinguish between Swift and Objective-C and compile it accordingly.
Swift Syntax is reminiscent of Javascript without the semicolons. variable & object type is implicitely inferred by the first value, and only explicetly inferred if you choose by using a colon ( : ) and then the type Double after the identifier.

var myInteger = 42
var myDouble  = 70.0
let myExplicitDouble: Double = 40

very cool.

The new Xcode also comes with Playground. The only way to describe it is a Swift Live Coding Environment. The best of Xcode's autocompletion with an engine that displays the result of each line of code.

Learning Swift is ridiculously easy. My Sister who has less than a week of programming experience was writing confident code in less than an hour. With Swift App development has never been easier.

CloudKit

Writing a server system for your app takes time. Modern web Apps aren't easy. With Cloudkit Apple is letting developers use iCloud to store all their Data, images, databases, user accounts, everything. It will handle Notifications, syncing, Distribution, everything for free. They are giving away 1PB of storage per app to developers. That's a Petabyte! That's a crazy amount of storage. You can imagine CloudKit as a Parse competitor.

I don't believe that App developers will forgoe writing their own server code completely with CloudKit around. I forsee more of a Hybrid approach with apps building on Cloudkit to validate Ideas, and Migrating to a custom solution when growth and performance demand it. Cloudkit really is great for everyone.

There were many more things revealed in the WWDC Keynote, too many to name here, So I'll leave that up to you to find out. It's no lie that this release of iOS is going to be the biggest since the app store almost 7 years ago. That's a crazy amount of time when you think about it. These technologies are making it easier than ever to make powerful software, and that's the point.


Karl Oscar Weber

Saving Time

I wrote the following about a year ago:

march 23rd 2013, time savings.

So you know how we save money? And we always have some leftover. What about saving time and using your savings if you need to? Schedule extra time into everything and you'll always be secure.

I've come to realize Time is the one thing that you just can't save. You can't store it or reuse it or anything. It's just gone.


Karl Oscar Weber

2014 New Years failures

It has been some time since the new year started. I wrote down a short list of habits I wanted to aim for. All of which I've failed at. So I've decided to make a new list of things. This one much more achievable.

  1. Ride to Work as often as possible.
  2. Write Every Day.
  3. Read a book every day.
  4. Program everyday.
  5. Go to bed after 12.

Now I think it's important to explain that last one. If I go to sleep before midnight, I wake up at about the same time as usual, around 8:30, I get ready for work, I show up at about 9:15, program until around 6, and then the cycle repeats.

If I stay up writing or programming for about an hour I stil wake up around 8:30. Going with less sleep really doesn't affect me that much. In fact, It might actually make me happier becuase now I can program on stuff I want to program.

As a rule I've learned it's really stupid to announce something that you haven't started yet. But as is the norm with The resolutions, I think it would help to write down my little list.

Perhaps a re-evaulation of your own goals wouldn't hurt.


Karl Oscar Weber

What is a programmer?

I'm a programmer. So what do I do all day? work out problems? Math? Something else that is super fancy. Really Programming is just messing around with a pile of Gibberish until it does what you want it to do. That's what programming is.

It doesn't matter what Programming language I use to get something done. It's almost always something that's been done before, and that I've done before. Just with a slight spin that is useful.

I would like to think of programming as the great endeavour to understand a particular set of problems, but in reality it's just a set of more problems, that never seem to get solved. The holes and flaws of my work are more apparent to me when I finish, than when I begin.

A Caveat

Although I feel like I'm never finished with any piece of software that I write, I do feel like I improve personally. I am a better programmer for programming what I just programmed. That constant improvement is positive.


Karl Oscar Weber

Organizing Your Time

The most precious resource we have is our time. It's limited, in short supply, and we can't get any more of it. Managing our time wisely becomes the most important thing we do. If you think of time as a currency, then you'll begin to understand that Time is most valuable thing we have.

Time can be spent, and it's in spending our time strategically, that gets us ahead. everyone has the same resource of time, no one is given more of it. So I thought it would be good to share some thoughts i have on time.

What Do You NEED To Do?

Make a list of all the things that you need to do in your daily routine. Shower, Eat, Brush your teeth, go to work. Then make a list of all the things that are necessary during the month; like paying Rent or you mortgage, Phone Bills, Transportation, Food money, riding your bike. Make certain that you write down in your schedule a block of time, usually an hour, where you do each of these things, and when the time comes, you do them.

prioritizing the essential things in life is the most important skill a person can learn, in regards to Time Management. It teaches honor and honesty. It builds confidence, and the humility to understand that we don't have time for everything.

Be Early

My Biggest Weakness, I think, is the procrastination of time. It is also the most important thing that must be mastered. Whether it is arriving to work early, or getting your work done before it's expected, being early earns sucess.

Say No.

When someone schedules a useless meeting, refuse. Most meetings aren't completely useless, but bring very little value. Only attend High value meetings. Apply this principle to everything. If you install Railings for example, it wouldn't make sense to start the day at Eight by driving three hours in one direction to install a job, only to pick up and leave after on hour to drive Two hours to another job. Now it's Two pm becuase you had to take a lunch hour, and both jobs require another Five hours to complete, in Two and a half hours work time is over and you have to go home.

Saying no to the less effective uses of your time is important to having time available for the important things in life. When you're not passionate about your work, you are working to live. It's important to maximize your effectiveness at work, prevent the possibility of overtime, and maintain good productivity to keep and excel at your job. In this sort of work it's important to spend as little time as possible actually working, and more time with your family.

If you love your job then that's even worse. You must fight for time away from your job. Avoid being trapped in endless spirals of just a little longer. Overworking is detrimental to your productivity and health.

Take Time Off.

From time to time everyone needs a vacation, or a little time to relax. Make certain that you do that daily, weekly, and monthly. Three hours of focused coding time is what I really need to get things done. I can get Two of These Solid Sessions in a work day, fitting emails and project management around them. I'll get a solid Session in the morning as well.

Just a couple of weeks ago we took a weekend off to go on a micro vacation. We visited San Fancisco and nearby Muir Beach. Admittedly we were driving for most of the time. My wife had never seen the beach before. We couldn't spend much time out of our car doing silly things but it was memorable. It was worthwhile to be together doing something that my wife has never done before. Making magical moments like that are worth it.


Karl Oscar Weber

document.ready for jQuery

So I've had to look this up so many times that I decided to write about it.

When using Javascript on a webpage it's important to execute your code only after all the content has been loaded. You do this with a $(document).ready() function. I always forget the specific syntax to do this so I thought I would include it here:

I hope that this is helpful.


Karl Oscar Weber

Sit at a typewriter and Bleed

Recently I wrote about writing two books. I must say that writing is hard. Merely putting my thoughts onto paper has proven difficult. Every sentence seems malformed and incomplete, each paragraph is an inconsistent mess. Complete thoughts seem to have taken the day off, leaving nothing but pointless, circular banter. Writing is difficult.

To keep going I've remembered the words of Ernest Hemingway:

There is nothing to writing. All you do is sit down at a typewriter and bleed.

Hemingway is one of my favorite authors. His style is so simple and direct. I think that if He was a modern designer He would use flat icons and designs exclusively. He also said that the first draft of anything is crap.

So get the first draft out there. Write something and share it with someone, even if it's just your editor. The second draft will always be better.


Karl Oscar Weber

Writing Two Books

I've decided to write a beginner's Book to themeing with Ghost. It will be a little different than most Beginner's Books as I'll assume that the Reader doesn't know how to code. I want to include a ton of glossaries, online companions, sample code, etc... Really cool stuff. Everything that I wish was included in most beginner's Books when I was starting out. This Project will probably take longer a couple months.

Another Project I'm working on is my personal experience on how to fail. I think that I'm an expert at failing. I'm pretty good at it, I've failed a few times. I should share my failing skillz with others.

Pay attention to my twitter account @karloscarweber to be notified when Launch These Books.


Karl Oscar Weber

Another New Blog

So I've moved my blog again. This time to Ghost. It's the Programmers Cliché to continually switch blog platforms. I plan on staying with Ghost for a while. It's beautiful, useful and brand new. Everything you could want in a blog.

A while ago I wrote about how I wanted to learn a handful of new technologies. That hasn't gone as well as I had hoped. I have done some iOS and Stripe work though. Stripe is awesome by the way. That's how you write Documentation.

I'm working on a thing called The Compendium, a collection of Stripe Ghost Themes that are all free and stuff. It's part of my effort to Commit to Github every day for a year. Which I reccommend by the way.

I'm also Working on Prologue.co, my effort to make my own products. I'm making Freemium apps, each one using the same login as every other app, and users are able to vote for the features they want to see made. Votes are Given out every month based on their subscription level. A free account gets 1 Vote, a Premium account gets 3 Votes. It will launch in the next couple of weeks.


Karl Oscar Weber

I'm Still in Love with the Web

Even with the swift change of focus towards mobile apps and experiences, I'm still in love with the desktop web. Apps feel trendy, or at least they did about 4 years ago when I saw an Android phone for the first time. The first app I ever saw was a skymap that you could use to see the stars in any direction. It was an experience of wonder. I was amazed. But there is still something about a mysterious landing page that sparks my curiosity far more. Some unseen secret waiting to be revealed to the world behind the login screen.

It's Awesome! one of my favorite things to do is to build out a site in HTML and CSS. Typesetting content is entertaining to me.


Karl Oscar Weber

The Fizz Buzz Problem

Today I was asked to "white board" fizz buzz while in an interview. Fizz Buzz is a simple problem that prints 1 to 100. For every number that is divisible by 3, print fizz, for every number divisible by 5, print buzz, and for the numbers that are divisible by both, print fizz buzz. I have never solved fizz buzz before, so it was hard. I had to ask for help: "Isn't there a function that divides a number and determines if it's a decimal or a whol number?" I asked. "Use the modulus operator" The CTO responded. Obviously I knew what had to be done to solve the problem instantly, I just didn't know which functions / operators to use to do so. A big fail on my part. The modulus operator returns the remainder if there is a remainder, or a 0 if there isn't.

Here is the code that I used for Fizz Buzz below:

for ($i = 1; $i < 101 ; $i++) {
  if (!($i % 3) && !($i % 5)) {
      echo "$i fizz buzz ";
  } else if(!($i % 3)) {
      echo "$i fizz ";
  } else if (!($i % 5)) {
      echo "$i buzz ";
  } else {
      echo $i;
      echo " ";
  }
}

Lesson learned. Know your control statements and operators.


Karl Oscar Weber

I love Pixels

I absolutely Love Pixel art. I think I'm going to move to pixel art for all of my projects. I'm not exactly sure what I can put on my site here, but I'll think of something.

I've been following a kickstarter called Retro Game Crunch since it's inception. I'm a big fan of Shaun Inman. If you have time check out his games Horror Vacui 2 and The Last Rocket. Both are Awesome retro pixel games. The idea is for these three guys to make six games in six months. Pretty inspiring when You think about it. Well Today the campaign was just funded, and they are for sure able to build their games. It's a triumph of independent gaming!

Recently I finished what would be considered my first "game"; a tutorial building a beat em up game. after this experience I'm going to try to iterate on my own ideas and build my own little, very little game. Let's see what happens.


Karl Oscar Weber

Documentation Matters

Good documentation absolutely matters. It's the difference between code being useful or an obstacle. The whole point of documentation is to teach the why and how of something. If the documentation doesn't allow quick and thorough understanding of your code, then the documentation has failed.

Documentation must be approachable for newcomers.

You need comprehensive beginners tutorials that cover all of the topics in macro. New Customers, as Jack puts it, want to feel empowered right away and each one is different. Covering the topics in macro help someone to learn the general concepts of your code before they look at specifics. Care must be taken write with common words. If there is an uncommon or obscure word then link to the definition. Make it as easy as possible for someone to learn all about your code.

You must also be very specific. Some people have a very specific and short term need for code, they want to get in, understand what they need to get the thing working, and then be done with it. Usually these are users that have been using your code for some time and want look something up very quickly. micro documentation also helps to teach the more powerful parts of your code. When a learner feels capable with your widget they will use it more often, and be more likely to contribute to your project as well.

Documentation must be approachable to you.

It's more important than commenting your code. If comments out number your code, then your code will be easier to maintain. Double so if your documentation outnumbers your comments.


Karl Oscar Weber

Git Troubles

I experienced some rather unfortunate consequences by keeping my git repository in my dropbox. I work at home, on my laptop, and at work on my desktop. Each project is maintained with git in my dropbox. Well I made the unfortunate mistake of turning dropbox off on my laptop, then making commits from my desktop. This made the files out of sync. Everything was duplicated on both computers, and I had to rebase the whole repository.

The Solutions

I see two possible solutions.

  1. Keep my projects out of dropbox.
  2. push everyday to github then pull every morning on both devices.

I think I'm going to go with number two for my own personal projects, and number one for projects I'm collaborating on. Also my work computer runs windows 7, syncing iOS projects with a windows device just doesn't make sense.

Sincerely, Karl Oscar Weber


Karl Oscar Weber

A New Blog

This is my very first post with textpress. I must say, It's a very impressive little blog engine. I have aspirations of writing my own blog engine, and I believe that I will. I don't see any harm in learning exactly how textpress works though. Today I spent a good 2 hours looking through the code and learning how this thing works. I hope to spend many more hours doing so.

Why a new Blog

I have had a big desire to host my own blog for some time now. TextPress just happens to be perfect. It's flat-file, which means no database, It uses markdown, and it's fairly simple and straight forward in it's design. I could use git with this Engine and deploy just fine. I'll work on moving this over to Heroku or something.

Also hosting my own blog gives me an incredible amount of expressive freedom. I'm a Web Developer and I need the opportunity to experiment with designs and layouts as I see fit. Slim is very flexible for my needs, and TextPress is very easy to modify and change.

Plans

I want to extend this blog engine to support Cheddar hash tags, and Cheddar OAuth 2.0. I also want to make a backbone.js powered admin backend for this thing. Which would be quite fun. We'll see how it goes.

Sincerely, Karl Oscar Weber