-
Notifications
You must be signed in to change notification settings - Fork 0
/
feed.xml
2542 lines (1831 loc) · 135 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Brian Wheeler's Blog</title>
<link>http://brianw.io</link>
<atom:link href="http://brianw.io/feed.xml" rel="self" type="application/rss+xml" />
<description></description>
<language>en-us</language>
<pubDate>Thu, 19 Nov 2015 17:31:08 +0000</pubDate>
<lastBuildDate>Thu, 19 Nov 2015 17:31:08 +0000</lastBuildDate>
<item>
<title>Science Is just the Universe Pushing It's Own Limits</title>
<link>http://brianw.io/blog/2014/06/13/science-is-just-the-universe-pushing-its-own-limits</link>
<pubDate>Fri, 13 Jun 2014 19:34:45 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/06/13/science-is-just-the-universe-pushing-its-own-limits</guid>
<description><p>Yeah. Think about that for a second.</p>
</description>
</item>
<item>
<title>How to migrate a blog</title>
<link>http://brianw.io/blog/2014/05/25/how-to-migrate-a-blog</link>
<pubDate>Sun, 25 May 2014 20:02:54 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/05/25/how-to-migrate-a-blog</guid>
<description><p>Migrating a blog can be tricky; there are a few things you may not think about, but you're going to want to pay attention to
maintaining your established SEO, keeping everything in working order</p>
</description>
</item>
<item>
<title>Optimize your work efficiency with tips for using Google Chrome</title>
<link>http://brianw.io/blog/2014/05/21/optimize-your-work-efficiency-with-tips-for-using-google-chrome</link>
<pubDate>Wed, 21 May 2014 20:36:38 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/05/21/optimize-your-work-efficiency-with-tips-for-using-google-chrome</guid>
<description><p>Using Google Chrome is better when you have the inside knowledge. Here are some tips to make Google Chrome better.</p>
<h3>Use browser profiles</h3>
<p><img src="/images/chrome_profiles.png" /></p>
<p>Browser profiles allow you to switch seamlessly between your digital identities. For me I have a personal profile, a work profile,
and separate profiles from different projects I've worked on.</p>
<p>Key points of separate profiles</p>
<ul>
<li>Separate home page(s) for each profile</li>
<li>Separate browser history</li>
<li>Separate bookmarks</li>
</ul>
<h3>Pinning Tabs</h3>
<p>Pinning tabs is great for things you need on the regular, such as your email, Stack Overflow, and your music service.
To pin a tab, left click it, and click "Pin tab".</p>
<h3>Important hotkeys</h3>
<ul>
<li>Cmd-L - Highlights URL Bar</li>
<li><code>Shift-Cmd {</code> - Move one tab left</li>
<li><code>Shift-Cmd }</code> - Move one tab right</li>
<li><code>Cmd ~</code> - Next window</li>
<li><code>Cmd Click</code> - Open link in new tab</li>
<li><code>Option-Enter</code> - Open search in a new tab</li>
<li><code>Cmd D</code> - Bookmark current tab</li>
<li><code>Shift-Cmd D</code> Bookmark all tabs</li>
<li><code>Cmd F</code> - Find in page</li>
</ul>
<p>For a full list of hotkeys, <a href="https://support.google.com/chrome/answer/165450?hl=en">check out the google documentation.</a></p>
<p>Thanks for reading!</p>
<p>-Brian</p>
</description>
</item>
<item>
<title>How the hell do companies raise money without profit?</title>
<link>http://brianw.io/blog/2014/05/19/how-the-hell-do-companies-raise-money-without-profit</link>
<pubDate>Mon, 19 May 2014 21:15:23 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/05/19/how-the-hell-do-companies-raise-money-without-profit</guid>
<description><p>It seems the trend lately is to spend first, and ask for money later. Companies like Twitter and Box and many other cloud service providers
are running this game of providing a free service, at an enormous loss, and then scrambling to monetize later.</p>
<p>I'm not bagging on Box, or Twitter, or any other simply brilliant company of this century, I'm merely pointing out
that if your revenue comes from people who invest in your company, and your main means of monetization is a never ending cycle
of investment: you're running a <a href="http://en.wikipedia.org/Ponzi_scheme">Ponzi Scheme</a>, not a company.</p>
<p>Take the following pitch: Our company buys postage stamps, sells them for 75% of what we paid for them, and because of the
<strong>huge volume</strong> we're going to make SO MUCH money once we figure that whole part out.</p>
<p>I bet investors are already emailing me lining up. If you didn't catch the analogy, postage stamps are a means of sending information,
much like the tech products most companies now provide. The joke is that these companies are spending exorbitant amounts of money
on services they can't afford to provide.</p>
<p>Why can't companies provide a service, become profitable, and scale profits and investments in tandem? Am I crazy or is there something
wrong with the world?</p>
<p>Long-tail cloud-based agile scalable innovative management performance groundbreaking breakthrough simple b2b c2c brand. That was a vent of
startup buzzwords. Thanks for reading.</p>
</description>
</item>
<item>
<title>How to send a meaningful email.</title>
<link>http://brianw.io/blog/2014/05/16/how-to-send-a-meaningful-email</link>
<pubDate>Fri, 16 May 2014 16:56:10 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/05/16/how-to-send-a-meaningful-email</guid>
<description><p>I've sent a <strong>ton</strong> of emails this last week; cold emails, intros, follow ups, you name it. No rest for the wicked. I've decided that it's about
time someone wrote about this.</p>
<h3>Your subject line is important.</h3>
<p>In your subject line, have a meaningful, honest sentence or question. That's it. Don't camelcase. Don't use ALLCAPS. Don't just write "Follow up" or "Intro".</p>
<p>Bad: Follow Up</p>
<p>Good: Brian wheeler following up on last weeks crowd-investing conference</p>
<p>Bad: Intro</p>
<p>Good: Intro between Jane Doe and John Smith</p>
<p>Bad: TRY OUR FREE TRIAL</p>
<p>Good: Would you be interested in working with software that « insert description here »</p>
<h3>Don't tautologize</h3>
<h4>A.K.A. Don't repeat yourself</h4>
<p>Getting to the point is important. <strong>Shorter</strong> emails are <strong>better</strong>.</p>
<p>Examples of tautology you have probably used in your emails:</p>
<ul>
<li>working on developing (working and developing are essentially the same word)</li>
<li>new innovation (innovations are intrinsically new)</li>
<li>added bonus (bonuses are always "added")</li>
</ul>
<p>For more examples of tautology, and how to avoid it, see <a href="http://examples.yourdictionary.com/reference/examples/examples-of-tautology.html">http://examples.yourdictionary.com/reference/examples/examples-of-tautology.html</a></p>
<h3>Don't talk about yourself</h3>
<p>It's easy to start an email off with</p>
<pre><code>John Doe,
my name is So and So and I would like to me me myself I us our blah blah blah
</code></pre>
<p>Don't fall into this trap. Remember that if you sign your emails correctly, your name will appear at the bottom. Explain why your email,
introduce yourself later.</p>
<h3>Sign your email</h3>
<pre><code>Intro,
body copy of the email ends. Put a "thank you" somewhere here or in the signature.
Brian Wheeler
Position
Company
805.452.6222
</code></pre>
<p>Follow these basic tips, it will make your emails more concise, easier to read, and easier to respond to.</p>
</description>
</item>
<item>
<title>Why I hate the phrase Corporate America</title>
<link>http://brianw.io/blog/2014/05/15/why-i-hate-the-phrase-corporate-america</link>
<pubDate>Thu, 15 May 2014 17:07:52 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/05/15/why-i-hate-the-phrase-corporate-america</guid>
<description><p>It happens all the time when people want to blame someone. The phrase "Corporate America" gets used.
This phrase is shallower than a lake in California, and people need to stop using it in their arguments.</p>
<p>I get it, corporations in the U.S. are self-serving, greedy, and gluttonous, but guess what?
<strong>So are corporations in every country in every part of the world.</strong> Why? Because corporations
exist in an ecosystem in which taking more is rewarded greater than it is punished.</p>
<p>If you haven't done so already, you need to <a href="http://www.geo.mtu.edu/~asmayer/rural_sustain/governance/Hardin%201968.pdf">read The Tragedy of the Commons</a></p>
<p>In a corporation, you have a group of individuals who are working together to achieve a common goal.
Each person is responsible for individual components headed by a board of directors or c-level execs, or both.
There is no decision made by the corporation itself, but rather by a group of people incentivized by
the structure of the profit-driven economy you helped create.</p>
<p>Next time you think about using the phrase "Corporate America", just remember that
corporations are not sentient beings acting out of malice in order to maximize profit.
Corporations are autonomous robots that provide the products and services that <strong>you</strong>,
the consumer, ask for.</p>
</description>
</item>
<item>
<title>Track the time (benchmark) a command takes in *NIX</title>
<link>http://brianw.io/blog/2014/04/22/track-the-time-benchmark-a-command-takes-in-star-nix</link>
<pubDate>Tue, 22 Apr 2014 17:58:29 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/04/22/track-the-time-benchmark-a-command-takes-in-star-nix</guid>
<description><p>How do you benchmark commands in linux? Looking for the easiest way to
track the time of a command on *NIX systems?</p>
<p>Check out the <code>time</code> command.</p>
<pre><code>time my_command
</code></pre>
<p>Consult <code>man time</code> for a full list of options.</p>
<p>This post was migrated from <a href="http://stackoverflow.com/questions/12096966/track-the-time-a-command-takes-unix-linux">this Stack Overflow question.</a></p>
</description>
</item>
<item>
<title>Ruby on Rails Controller VS. Model</title>
<link>http://brianw.io/blog/2014/04/22/ruby-on-rails-controller-vs-model</link>
<pubDate>Tue, 22 Apr 2014 16:37:15 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/04/22/ruby-on-rails-controller-vs-model</guid>
<description><p>This post is migrated from <a href="http://stackoverflow.com/questions/20366236/rails-best-practices-controller-or-model/20366964#20366964">this Stack Overflow question</a></p>
<p>Often times the question comes up in Rails regarding what code belongs
in the model vs the controller. Picture this, the web request comes into
the controller, and from there we access the model, and then back into the
controller. So to answer this question I would say that any code that
can be used in multiple controllers should be moved to functions
inside of a model.</p>
<p>Take the following example</p>
<pre><code>@user = User.find(params[:id])
@stripe_cards = Stripe::Customer.retreive(@user.stripe_customer_id).cards.all
</code></pre>
<p>Since I'm fairly confident that we're going to want to use this
feature of accessing the stripe customer of the user, I would define a method
in the user model.</p>
<pre><code>class User.rb
def customer
Stripe::Customer.retreive(self.stripe_customer_id).cards.all
end
end
</code></pre>
<p>The bottom line is, controllers should be used to find records and authrrize
actions. Any time code can be reused in multiple controllers,
move it to a model.</p>
</description>
</item>
<item>
<title>Unicoins are the Greatest Thing Ever</title>
<link>http://brianw.io/blog/2014/04/01/unicoins-are-the-greatest-thing-ever</link>
<pubDate>Tue, 01 Apr 2014 14:48:48 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/04/01/unicoins-are-the-greatest-thing-ever</guid>
<description><p>If you haven't been on <a href="http://stackoverflow.com">Stack Overflow</a> yet today, go now! Stack Overflow
has introduced an awesome new cyber-currency, UNICOINS!</p>
<p>Unicoins can be used to do awesome things such as multiply your reputation by 10, or place your own
avatar on a tag!</p>
<p>Obviously this is an April Fools Joke, but it's probably one of the best ones ever. If you want all
the unicorns in the world, here is an auto-miner, written on <a href="http://meta.stackoverflow.com/questions/227363/what-are-stack-overflow-unicoins">this SO thread</a></p>
<pre><code>(function uniMine()
{
$.getJSON('/unicoin/rock', function(data)
{
setTimeout(function()
{
$.post('/unicoin/mine?rock=' + data.rock, {fkey: StackExchange.options.user.fkey});
}, 10000);
});
setTimeout(uniMine, 11000);
})();
</code></pre>
</description>
</item>
<item>
<title>Startup Challenge Update: Delegating design with Elance</title>
<link>http://brianw.io/blog/2014/03/28/startup-challenge-update-delegating-design-with-elance</link>
<pubDate>Fri, 28 Mar 2014 01:15:49 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/28/startup-challenge-update-delegating-design-with-elance</guid>
<description><p>So... I'm bad at sales. I can't sell things, and it's a problem for me. This is why I've
started a challenge for myself I'm calling the "Startup Challenge". I'm going to sell a simple
website builder that creates a full domain name to website service for small businesses. Kind of
like what launch rock does for startups.</p>
<p>Anyways... this is a brief update on the process, hiring a designer through <a href="elance.com">Elance</a>.
At first I was skeptical, I got bids from some people who clearly did not know what I was looking
for. For example I had a pakistani design firm send me a fully buzzword-compliant bid on the project
that included</p>
<blockquote><p>"professional and all browsers compatible / mobile compatible design"</p></blockquote>
<p>So clearly right at the beginning I was a little skeptical. Then I looked into their portfolio
and while they looked like they had a decent eye for design, but their implementation was subpar.</p>
<p>It did not feel like Elance was coming through. I kindly rejected their bid and moved on to other
proposals. <strong>Then the same designer offered to cut there price in half.</strong></p>
<p>At this point, I was ready to move on to Odesk, which to be honest has a far sexier look to it, but
later that day I got a bid on a design from <a href="http://marmoncreations.com/">Marmon Creations</a>, a U.S.
based designer. I had a quick Skype call with him and accepted his bid.</p>
<p>This all happened yesterday (with reference to the time of this writing obviously) so I'm
excited to see what designs he comes up with. More to come!</p>
</description>
</item>
<item>
<title>Startup Challenge: Build a profitable business on a simple idea as fast as possible</title>
<link>http://brianw.io/blog/2014/03/22/startup-challenge-build-a-profitable-business-on-a-simple-idea-as-fast-as-possible</link>
<pubDate>Sat, 22 Mar 2014 06:11:33 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/22/startup-challenge-build-a-profitable-business-on-a-simple-idea-as-fast-as-possible</guid>
<description><p>I like challenging myself, and lately I've learned something about myself that I would like to improve.
I suck at selling things. So over the next few weeks, or maybe months, I'm going to blog about a
new challenge that I've created for my self. Build a simple product and get as many customers as
possible.</p>
<p>So here's the idea: recently I offered to my friend to set up <a href="http://eljuezchocolate.com">a website for his super awesome
business making bean-to-bar chocolate.</a>, and I realized how incredibly painful
the process is. I'm building a website that is essentially a landing page service for small businesses.</p>
<p>I know it sounds cliché, so it's important to understand that this is not another website builder.</p>
<ul>
<li>It's not Wix</li>
<li>It's not a blogging engine</li>
<li>It's not like anything you've ever seen before</li>
</ul>
<p>The closest thing I can compare it to is <a href="http://launchrock.co/">LaunchRock</a>, but a little more detailed,
and for small businesses, not startups.</p>
<p>The goal is to give local businesses the ability to set up a basic info website and register a domain
for $17/month. And the sweetest part is that they <strong>never have to deal with a domain registrar</strong>.</p>
<h4>How?</h4>
<p>I'm going to handle the domain registration for them. They can make the site, enter a credit card,
and then using a domain registration API, I'm going to register the domain and set the records for them
because I am a kick-ass developer (insert humility here, amirite?).</p>
<p>No more godaddys or network solutions or 1and1s. The working title is Localizr, because it is
geared towards small businesses, and it's on it's way to creating a start to finish website
for any and all small businesses.</p>
</description>
</item>
<item>
<title>5 Reasons you're not at a startup</title>
<link>http://brianw.io/blog/2014/03/21/5-reasons-youre-not-at-a-startup</link>
<pubDate>Fri, 21 Mar 2014 16:34:58 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/21/5-reasons-youre-not-at-a-startup</guid>
<description><p>Startups are more than just company size, there also an idea and a mentality, a mindset and a way of
life, a set of rules and practices that aren't written or spoken, they just exist. Not being a part of
a startup isn't necessarily a bad thing. All companies must grow at some point, here are five indicators
that you are past your startup phase.</p>
<h3>#1</h3>
<h4>You have a last name in your email.</h4>
<p>Yes, if you work at a startup, and your email is anything other than [email protected], you are not at a startup. Why? This is a clear distinction between the founders
and the employees. It's sort of like a secretive email cast system that companies employ to deliniate between the starters and the joiners. Having a last initial is
a way of saying "this company doesn't know you on a first name basis". For example, when I say Jeff at Amazon, that is ONE person (Jeff Bezos). Same thing with Mark at Facebook or Tony
at Zappos. Those people are on a first name basis with their company. If you have a last name or an initial in your email, you are not.</p>
<h3>#2</h3>
<h4>You don't have stock.</h4>
<p>This is an obvious one. No stock, not at a startup.</p>
<h3>#3</h3>
<h4>You have a schedule.</h4>
<p>If you clock in, clock out, or have someone to answer to, you're not at a startup. Startups are supposed to be relatively flat in structure, and everyones' work speaks for itself.
Having a time tracker, or some bullshit method of timetracking or project management, you are not at a startup.</p>
<h3>#4</h3>
<h4>You don't make your own decisions.</h4>
<p>The other day, I literally had my superior tell me, in my code, that the following lines</p>
<pre><code>call_a.function() if condition_if_true?
</code></pre>
<p>Should be changed to</p>
<pre><code>if condition_is_true?
call_a.function()
end
</code></pre>
<p>for "clarity". I was about ready to blow my brains out. If you don't have the freedom to make your own decisions and take control of the projects you work on, guess what, you're not at a startup.</p>
<h3>#5</h3>
<h4>You don't feel like part of the team.</h4>
<p>If you feel like there are decisions being made without you even knowing about them, or like you're not really in the loop, chances are you are not at a startup, just a small company.
When you work in a startup environment, you know every intimate detail of the company, so much so that your probably sick of how it invades every aspect of your personal life.</p>
</description>
</item>
<item>
<title>MeteorCast #3: How To Use Session Variables in Meteor.JS</title>
<link>http://brianw.io/blog/2014/03/19/meteorcast-number-3-how-to-use-session-variables-in-meteor-dot-js</link>
<pubDate>Wed, 19 Mar 2014 05:17:25 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/19/meteorcast-number-3-how-to-use-session-variables-in-meteor-dot-js</guid>
<description><p>Here it is, the third MeteorCast.</p>
<iframe width="560" height="315" src="//www.youtube.com/embed/n8ORPuUf_9M" frameborder="0" allowfullscreen></iframe>
<h4>Notes</h4>
<p><strong>HTML</strong>
<head>
<title>SpeedyRentals</title>
</head></p>
<pre><code> &lt;body&gt;
&lt;/body&gt;
&lt;template name="newRental"&gt;
&lt;h1&gt;New Rental&lt;/h1&gt;
&lt;input type="button" value="New Rental" class="new_rental btn btn-primary" /&gt;
&lt;div class="rental_form"&gt;
&lt;input type="text" class="rental_name" placeholder="Name" /&gt;
&lt;input type="text" class="rental_make" placeholder="Make" /&gt;
&lt;input type="text" class="rental_model" placeholder="Model" /&gt;
&lt;input type="submit" class="rental_submit" /&gt;
&lt;/div&gt;
&lt;/template&gt;
&lt;template name="selectedRental"&gt;
&lt;p&gt;
You have selected
&lt;/p&gt;
&lt;p&gt;
No rental selected...
&lt;/p&gt;
&lt;/template&gt;
&lt;template name="airplanes"&gt;
&lt;table class="table table-striped"&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Make&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="rental"&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#" class="delete btn btn-danger"&gt;Delete&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/template&gt;
</code></pre>
<p><strong>JS</strong>
var Airplanes = new Meteor.Collection("airplanes");</p>
<pre><code>if (Meteor.isClient) {
Template.newRental.rendered = function() {
$('.rental_form').hide();
};
Template.newRental.events({
'click .new_rental': function () {
$('.rental_form').toggle();
},
'click .rental_submit': function() {
Airplanes.insert({
name: $('.rental_name').val(),
make: $('.rental_make').val(),
model: $('.rental_model').val()
});
}
});
Template.selectedRental.rental = function() {
return Session.get("selected_rental");
};
Template.airplanes.rentals = function() {
return Airplanes.find({});
};
Template.airplanes.events({
'click a.delete': function(e) {
e.preventDefault();
Airplanes.remove(this._id);
},
'click .rental': function() {
Session.set("selected_rental", this);
}
});
}
if (Meteor.isServer) {
Meteor.startup(function () {
// code to run on server at startup
});
}
</code></pre>
</description>
</item>
<item>
<title>Become an OAuth2 Provider</title>
<link>http://brianw.io/blog/2014/03/16/become-an-oauth2-provider</link>
<pubDate>Sun, 16 Mar 2014 03:20:18 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/16/become-an-oauth2-provider</guid>
<description><p>I know, you've been waiting for the day where you could become an OAuth2 provider, without building your
own OAuth2 server and authentication. Something that would integrate seamlessly with Devise, but also
provide the advanced features you would expect out of a high quality Ruby Gem.</p>
<h3>Devise OAuth2 Rails</h3>
<p>is here!</p>
<p>And it only takes a second to add to your Rails 4 application!</p>
<p><strong>Gemfile</strong>
gem 'devise_oauth2_rails4'</p>
<p><strong>Console</strong>
<code>bash
rails g devise:oauth2:migrations
rake db:migrate
</code></p>
<p>And that's it!</p>
<p>For the full documentation, check out <a href="https://github.com/bwheeler96/devise_oauth2_rails4">the GitHub page</a>, and feel free to contribute!</p>
</description>
</item>
<item>
<title>Delete with AJAX in Rails</title>
<link>http://brianw.io/blog/2014/03/13/delete-with-ajax-in-rails</link>
<pubDate>Thu, 13 Mar 2014 14:52:07 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/13/delete-with-ajax-in-rails</guid>
<description><p>One of the biggest pains in Rails when you're just starting out is that there is no AJAX, and it
can be laborious to add AJAX to your site. The easiest AJAX snippet to add, by far, is a simple
AJAX delete button.</p>
<p>If your running Rails, you've seen the code below (Pretend we have a table holding all of our comments)</p>
<pre><code>%table
%tr
%th User
%th Comment
%th
- @comments.each do |comment|
%tr
%td= comment.user.name
%td= comment.text
%td= link_to 'Delete', comment_path(comment), method: :delete
</code></pre>
<p>How annoying is it that clicking that <code>Delete</code> button will cause the page to reload <strong>every</strong> time?</p>
<p>Using the following jQuery, we can add an AJAX delete to any model in our project, instantly.</p>
<pre><code>$('a.destroy').click(function(e) {
e.preventDefault();
destroyable = $(this).closest('.destroyable');
url = $(this).attr('href') + '.json';
$.ajax(url, {
type: 'DELETE',
complete: function() {
$(destroyable).fadeOut(100);
}
});
});
</code></pre>
<p>And then just change your view accordingly</p>
<pre><code>%table
%tr
%th User
%th Comment
%th
- @comments.each do |comment|
%tr.destroyable
%td= comment.user.name
%td= comment.text
%td= link_to 'Delete', comment_path(comment), class: 'destroy'
</code></pre>
<p>See how this is extendable to literally any scaffold? It's only about 15 extra lines of code and
it's a <strong>huge</strong> UX improvement.</p>
<p>Cheers!</p>
<p>-Brian</p>
</description>
</item>
<item>
<title>MeteorCast #2: Basics of Templates</title>
<link>http://brianw.io/blog/2014/03/13/meteorcast-number-2-basics-of-templates</link>
<pubDate>Thu, 13 Mar 2014 03:48:56 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/13/meteorcast-number-2-basics-of-templates</guid>
<description><h3>Basics of Templates</h3>
<iframe width="560" height="315" src="//www.youtube.com/embed/1E94zoNcVfk" frameborder="0" allowfullscreen></iframe>
<h4>Code</h4>
<pre><code>&lt;head&gt;
&lt;title&gt;SpeedyRentals&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
{{&gt; newRental}}
&lt;/body&gt;
&lt;template name="newRental"&gt;
&lt;h1&gt;New Rental&lt;/h1&gt;
&lt;input type="button" value="New Rental" class="new_rental btn btn-primary" /&gt;
&lt;div class="rental_form"&gt;
&lt;input type="submit" class="rental_submit" /&gt;
&lt;/div&gt;
&lt;/template&gt;
&lt;/template&gt;
</code></pre>
</description>
</item>
<item>
<title>MeteorCast #1: Intro to C.R.U.D.</title>
<link>http://brianw.io/blog/2014/03/12/meteorcast-number-1-intro-to-c-dot-r-u-dot-d</link>
<pubDate>Wed, 12 Mar 2014 18:27:56 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/12/meteorcast-number-1-intro-to-c-dot-r-u-dot-d</guid>
<description><p>Basically just an intro into how to interact with a database in Meteor.JS. To run this yourself, you can get the code below the video.</p>
<iframe width="560" height="315" src="//www.youtube.com/embed/kWOStdgbUrQ" frameborder="0" allowfullscreen></iframe>
<p><br /></p>
<h4>HTML</h4>
<pre><code>&lt;head&gt;
&lt;title&gt;SpeedyRentals&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;template name="newRental"&gt;
&lt;h1&gt;New Rental&lt;/h1&gt;
&lt;input type="button" value="New Rental" class="new_rental" /&gt;
&lt;div class="rental_form"&gt;
&lt;input type="text" class="rental_name" placeholder="Name" /&gt;
&lt;input type="text" class="rental_make" placeholder="Make" /&gt;
&lt;input type="text" class="rental_model" placeholder="Model" /&gt;
&lt;input type="submit" class="rental_submit" /&gt;
&lt;/div&gt;
&lt;/template&gt;
&lt;template name="airplanes"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Make&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#" class="delete"&gt;Delete&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/template&gt;
</code></pre>
<h4>Javascript</h4>
<pre><code>var Airplanes = new Meteor.Collection("airplanes");
if (Meteor.isClient) {
Template.newRental.rendered = function() {
$('.rental_form').hide();
};
Template.newRental.events({
'click .new_rental': function () {
$('.rental_form').toggle();
},
'click .rental_submit': function() {
Airplanes.insert({
name: $('.rental_name').val(),
make: $('.rental_make').val(),
model: $('.rental_model').val()
});
}
});
Template.airplanes.rentals = function() {
return Airplanes.find({});
};
Template.airplanes.events({
'click a.delete': function(e) {
e.preventDefault();
Airplanes.remove(this._id);
}
});
}
if (Meteor.isServer) {
Meteor.startup(function () {
// code to run on server at startup
});
}
</code></pre>
</description>
</item>
<item>
<title>Understanding Computer Network Security Part 3: Man in the Middle</title>
<link>http://brianw.io/blog/2014/03/11/understanding-computer-network-security-part-3-man-in-the-middle</link>
<pubDate>Tue, 11 Mar 2014 05:16:21 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/03/11/understanding-computer-network-security-part-3-man-in-the-middle</guid>
<description><p>This post is part of <a href="http://brianw.io/blog/2014/02/05/understanding-computer-network-security/">a series about computer network security</a>.</p>
<p>Today's lesson in computer network security begins with a basic knowledge of public key encryption.
Public key encryption is how it is possible for me to tell you some information over an insecure channel
(the internet), and be able to obscure that information from an attacker, without ever using a private channel.
This can be a REALLY hard concept to wrap your head around, and there's a lot more to it than what I'm
covering here, if you wan't, you can view <a href="https://www.khanacademy.org/math/applied-math/cryptography/modern-crypt/v/diffie-hellman-key-exchange--part-1">this awesome khan academy regarding public key encryption.</a></p>
<p>What you do need to know about public key encryption is that it is the secret sauce that protects passwords,
credit cards, bank account info, and virtually anything getting transmitted over the internet.
The main idea is that if you have a public key and a private key, and I have a public key and a private
key, we can exchange information safely. Each key is a essentially a random set of characters, the public
key is shared, the private key is not.</p>
<p>Well what if I use the <a href="http://brianw.io/blog/2014/02/20/understanding-computer-network-security-part-2-wireless-network-poisoning/">tactics described in my previous post</a>
to replace a website's public key with my own public key? Well then I have effectively tricked you into
encrypting all of your data in a format that only I can read, and once I send it off to the website
you were trying to access, no one will be any the wiser, sort of...</p>
<p>So how can you protect against getting wrapped up into a MitM attack? Well there are a number of ways</p>
<ol>
<li>Avoid doing sensitive transactions over public WiFi, watch movies, browse the internet,
but don't move your money around, check your credit card statement, etc.</li>
<li>If you see this red warning, keep in mind that someone might be trying to spy on you, and your
sensitive data may not be safe.</li>
</ol>
<p><img src="/images/ssl_warning.jpeg" /></p>
</description>
</item>
<item>
<title>Understanding Computer Network Security Part 2: Wireless Network Poisoning</title>
<link>http://brianw.io/blog/2014/02/20/understanding-computer-network-security-part-2-wireless-network-poisoning</link>
<pubDate>Thu, 20 Feb 2014 09:16:09 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/02/20/understanding-computer-network-security-part-2-wireless-network-poisoning</guid>
<description><p>If you haven't already, checkout my last post regarding <a href="http://brianw.io/blog/2014/02/15/understanding-computer-network-security-part-1-wireless-network-sniffing/">wireless network sniffing</a>
as it will help set the scene for what's going on here.</p>
<p>Wireless network poisoning is the practice of getting onto a wireless network, and then tricking other users
of the network to route all of the traffic to your computer, <strong>before</strong> it goes to the router, and therefore,
before it goes on to the internet. By "user", I mean any device connected to the network such as a phone,
laptop, tablet, pc, etc.</p>
<p><img src="/images/noobs.jpeg" /></p>
<p>As that image comically points out, wireless network signals are sent in all directions, so the attacker
actually doesn't need to be in between you and the network, or have physical access to any device.</p>
<p>Now let's pretend I have poisoned a network, and I'm getting all of those sweet sweet 802.11 frames (data).
What can I actually do with this? Well a few problems come to mind</p>
<ol>
<li>I can read your potentially sensitive unencrypted info, potentially passwords, browser cookies, etc., unless of course, you are on an encrypted connection.</li>
<li>I can modify the information that the router returns to you.</li>
<li>I can take this a step further by tampering with encryption, which is more easily detectable, and easy to defend yourself from.</li>
</ol>
<p>The first item on the list, <a href="http://brianw.io/blog/2014/02/15/understanding-computer-network-security-part-1-wireless-network-sniffing/">we talked about earlier</a>, and the last item we will get to eventually,
but the second item on our list is by far the most interesting. When I have all of the traffic running
through my computer, I can actually edit what gets sent back to the user.</p>
<p>How is this dangerous? Well what if you were trying to access Facebook, and instead, I sent you a new
version of Facebook that has a little bit of code in the background that sends me every keypress you
type. This could include any private message, credit card, password, etc.</p>
<p>How do you defend against an attack like this? Well first off, you shouldn't send private information
over a public WiFi network. Secondly, ensure that encryption is available on websites that you are browsing.</p>
<p>To learn more about how wireless network poisoning works, learn about <a href="http://en.wikipedia.org/wiki/Address_Resolution_Protocol">the ARP protocol</a>.
Also, it would certainly be worth while to take a look at <a href="http://ettercap.github.io/ettercap/">Ettercap</a>.</p>
</description>
</item>
<item>
<title>Understanding Computer Network Security Part 1: Wireless Network Sniffing</title>
<link>http://brianw.io/blog/2014/02/15/understanding-computer-network-security-part-1-wireless-network-sniffing</link>
<pubDate>Sat, 15 Feb 2014 06:11:01 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/02/15/understanding-computer-network-security-part-1-wireless-network-sniffing</guid>
<description><p>Welcome to the first part in my newest series, <a href="http://brianw.io/blog/2014/02/05/understanding-computer-network-security/">"Understanding Computer Network Security"</a>, where I try and give a brief overview of the general topics of computer security, and how to protect yourself.</p>
<p>The first attack I'm going to talk about in this series is what happens the moment that information leaves your computer and enters a wireless network. Imagine you
visit a website called generic-example.com. The first thing that is going to happen is your computer will send out a request asking generic-example.com for the homepage.
Generic-example.com responds with the information that you requested and the process is pretty much complete. It seems pretty harmless, so lets look at a more dangerous example.</p>
<p>Imagine that website X wants you to sign up for their great new photo sharing service. You enter in your email and your desired password and your in, but not without caveats. When you submit your email
and your password to website X, your browser actually puts that information in the URL (it's how the data is transported), and then broadcasts it all across the wireless network you are on.
Wireless communications broadcast in all directions, indiscriminantly. Now anyone on your network will see a request being made to
<code>generic-ecample.com/users/[email protected]&amp;password=my_generic_password</code>. All data that gets sent over the internet gets sent in a format similiar to this. Bank accounts, credit cards, passwords, emails, SSN's, etc. All of it.</p>
<p>Ok, so I maybe massaged the truth a little bit for the sake of riling you up, there are ways of hiding your information from other people on wireless networks. It's called <strong>encryption</strong>.
On a wireless network, there are two layers of encryption, there is the encryption that is generated when you enter the password for the network, this <strong>only</strong> occurs if you are on a password protected network, and anyone else who has the password can break this encryption protocol with little to no effort. The second form of encryption is called SSL, which stands for Secure Socket Layer. Use of SSL changes on a website to website basis, but theres a really easy way to tell. Almost all browsers in use now will have a green bar at the top, or a lock, or some form of reassuring security icon by the URL that will inform you that you are using safe browsing.</p>
<p>Not all websites offer SSL, and that's OK, it's not absolutely necessary for every site, but you should be aware that you should NEVER share credit card info with a site that doesn't use SSL, and you should probably pick different passwords for sites using SSL and sites that aren't.</p>
</description>
</item>
<item>
<title>Understanding Computer Network Security: Intro</title>
<link>http://brianw.io/blog/2014/02/05/understanding-computer-network-security</link>
<pubDate>Wed, 05 Feb 2014 08:45:39 +0000</pubDate>
<author></author>
<guid>http://brianw.io/blog/2014/02/05/understanding-computer-network-security</guid>
<description><p>Lately, it seems as if the media has been super hyped on declaring "hacks" and spewing a lot of inaccurate information on what got "hacked" and who was affected by the "hack".
In this series I'm going to write a post on each of the different access points that a computer's sensitive information can be accessed from, and what the protection options are.</p>
<p>Before I start writing detailed posts on network security, I would like to go over the <strong>more common</strong> points at which a computer "hack" can occur. Keep in mind that I've never seen
formal writing about different "access points" for sensitive data, so the nomanclature used in this post may not be widely acceptable, but it should still be applicable.</p>
<ol>
<li><a href="http://brianw.io/blog/2014/02/15/understanding-computer-network-security-part-1-wireless-network-sniffing/">Wireless network sniffing</a></li>
<li><a href="http://brianw.io/blog/2014/02/20/understanding-computer-network-security-part-2-wireless-network-poisoning/">Wireless network poisoning</a></li>
<li><a href="http://brianw.io/blog/2014/03/10/understanding-computer-network-security-part-3-man-in-the-middle/">Encryption tampering (Man in the Middle)</a></li>
<li>Man in the Browser</li>
<li>XSS (Cross Site Scripting)</li>
<li>Directory Traversal</li>
<li>Cookie forgery</li>
<li>Session hijacking</li>
<li>SQL Injection</li>
</ol>
<p><strong>Wireless network sniffing</strong> -
Did you know that when you use wireless networks, you transmit data in all directions? Often times unencrypted.</p>
<p><strong>Wireless network poisoning</strong> -
Wireless networks can be tricked very easily, because wireless devices trust all other wireless devices.</p>