This repository has been archived by the owner on Jan 11, 2019. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy path08.misc.topics.html
executable file
·1164 lines (1037 loc) · 37.8 KB
/
08.misc.topics.html
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
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Web & Mobile Development — 08.Misc.Topics</title>
<meta name="description" content="Web & Mobile Development — 08.Misc.Topics">
<meta name="author" content="Bram(us) Van Damme - Davy De Winne - ikdoeict.be">
<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/main.css" media="screen">
<link rel="stylesheet" href="css/print.css" media="print">
<!-- <link rel="stylesheet" href="assets/08/examples.css"> -->
<link rel="stylesheet" href="lib/zenburn.css">
</head>
<body>
<div id="reveal">
<!-- Any section element inside of this container is displayed as a slide -->
<div class="slides">
<!-- 0 : Title -->
<section>
<section>
<h3 class="inverted">Web & Mobile Development <small>JLW288</small></h3>
<h1>08.Misc.Topics</h1>
<footer>
<em><a href="http://www.ikdoeict.be/">ikdoeict.be</a> — <a href="mailto:[email protected]">[email protected]</a> — <a href="mailto:[email protected]">[email protected]</a></em>
</footer>
<script>
// Delicously hacky. Look away.
if(navigator.userAgent.match(/(iPhone|iPad|iPod|Android)/i))
document.write('<p style="color: rgba(0,0,0,0.3); text-shadow: none;">('+'Tap to navigate'+')</p>');
</script>
</section>
</section>
<!-- 1 : Intro -->
<section>
<section>
<h2>Misc Topics</h2>
<p><img src="assets/08/theprisonerofbenda.jpg" alt="" title="" height="376" width="640" /></p>
<q>I'm not sure. I'm afraid we need to use ... Math.</q>
</section>
</section>
<!-- 2 : CSS Preprocessors -->
<section>
<section>
<h2>CSS Preprocessors</h2>
<ul>
<li class="fragment">
New way to writing CSS, giving us
<ul>
<li class="fragment">Variables</li>
<li class="fragment">Nesting</li>
<li class="fragment">Mixins (includes)</li>
<li class="fragment">Operations & Functions</li>
</ul>
</li>
<li class="fragment">
Two popular systems
<ul>
<li class="fragment"><a href="http://sass-lang.com/">Sass</a></li>
<li class="fragment"><a href="http://lesscss.org/">Less</a></li>
</ul>
</li>
<li class="fragment">
Write “Special CSS”, then compile it to CSS
</li>
</ul>
</section>
<section>
<h2>CSS Preprocessors Example (1)</h2>
<ul>
<li class="fragment">
Nesting
<div class="fragment">
<div style="width: 50%; float: left;">
<pre class="bigger"><code>/* style.scss */
#navbar {
width: 80%;
height: 23px;
ul { list-style-type: none; }
li {
float: left;
a { font-weight: bold; }
}
}</code></pre>
</div>
<div style="width: 50%; float: left;">
<pre class="bigger"><code class="language-css">/* compiled style.css */
#navbar {
width: 80%;
height: 23px; }
#navbar ul {
list-style-type: none; }
#navbar li {
float: left; }
#navbar li a {
font-weight: bold; }</code></pre>
</div>
</div>
</li>
</ul>
</section>
<section>
<h2>CSS Preprocessors Example (2)</h2>
<ul>
<li class="fragment" style="clear: left;">
Variables
<div class="fragment">
<div style="width: 50%; float: left;">
<pre class="bigger"><code>/* style.scss */
$main-color: #ce4dd6;
$style: solid;
#navbar {
border-bottom: {
color: $main-color;
style: $style;
}
}
a {
color: $main-color;
&:hover { border-bottom: $style 1px; }
}</code></pre>
</div>
<div style="width: 50%; float: left;">
<pre class="bigger"><code class="language-css">/* compiled style.css */
#navbar {
border-bottom-color: #ce4dd6;
border-bottom-style: solid; }
a {
color: #ce4dd6; }
a:hover {
border-bottom: solid 1px; }</code></pre>
</div>
</div>
</li>
</ul>
</section>
<section>
<h2>CSS Preprocessors Example (3)</h2>
<ul>
<li class="fragment" style="clear: left;">
Mixins
<div class="fragment">
<div style="width: 50%; float: left;">
<pre class="bigger"><code class="language-css">/* style.scss */
@mixin rounded-top {
$side: top;
$radius: 10px;
border-#{$side}-radius: $radius;
-moz-border-radius-#{$side}: $radius;
-webkit-border-#{$side}-radius: $radius;
}
#navbar li { @include rounded-top; }
#footer { @include rounded-top; }</code></pre>
</div>
<div style="width: 50%; float: left;">
<pre class="bigger"><code class="language-css">/* compiled style.css */
#navbar li {
border-top-radius: 10px;
-moz-border-radius-top: 10px;
-webkit-border-top-radius: 10px; }
#footer {
border-top-radius: 10px;
-moz-border-radius-top: 10px;
-webkit-border-top-radius: 10px; }</code></pre>
</div>
</div>
</li>
</ul>
</section>
</section>
<!-- Composer & Packagist -->
<section>
<section>
<h2>Composer & Packagist</h2>
<p><img src="assets/08/splash-composer.png" width="500" alt="" style="margin-top: 1em;" /></p>
</section>
<section>
<h2>Composer</h2>
<div class="columns clearfix fragment">
<div class="column column-13">
<figure><img src="assets/08/logo-composer-transparent.png" width="250" class="noborder" title="Composer" /></figure>
</div>
<div class="column column-23" style="width: 66.666666%">
<blockquote style="width: 100%; margin-top: 1em;">Composer is a tool for dependency management in PHP. It allows you to declare the dependent libraries your project needs and it will install them in your project for you.</blockquote>
</div>
</div>
<ul style="clear: left;">
<li class="fragment">Freely translated: this tool will save you lots of headaches when working with external libraries</li>
<li class="fragment">
<a href="http://getcomposer.org/">Composer</a> is worthless without <a href="https://packagist.org/">Packagist</a> though:
<ul>
<li class="fragment">Composer = the command line tool installing the packages</li>
<li class="fragment">Packagist = the repository aggregating all installable packages</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>Why Composer?</h2>
<ul>
<li class="fragment">
Composer is a project specific dependency manager
<ul>
<li>Packages are installed on a per project basis (<code>vendor</code> subfolder), not system-wide (cfr. PEAR)</li>
</ul>
</li>
<li class="fragment">
Composer is clever
<ul>
<li>Composer finds out which versions of which packages (and which versions of its dependencies) need to be installed, and installs them.</li>
</ul>
</li>
<li class="fragment">
Installed packages can be autoloaded
</li>
</ul>
<footer class="fragment">Told you: it saves lots of headaches!</footer>
</section>
<section>
<h2>Composer: Installation</h2>
<ul>
<li class="fragment">
OS X
<pre class="bigger"><code>$ curl -s https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/bin/composer</code></pre>
</li>
<li class="fragment">
Windows: <a href="https://getcomposer.org/Composer-Setup.exe">Download & Run the installer</a>
</li>
</ul>
<div class="fragment warning"><p style="font-size: 65%; line-height: 1.2;">OS X users beware: If you're using MAMP, make sure that the <code>php</code> binary used is the one included with MAMP, and not the one shipped with OS X.</p></div>
</section>
<section>
<h2>Composer: Obtaining packages</h2>
<ul>
<li class="fragment">
Create a file named <code>composer.json</code> in your project root to declare your dependencies in
<pre class="bigger"><code class="language-js dontrun">{
"require": {
"swiftmailer/swiftmailer": "4.*"
}
}</code></pre>
</li>
<li class="fragment">
Run <code>composer install</code> to install the dependencies
<ul>
<li class="fragment">Composer will install the packages in a <code>vendor</code> subfolder</li>
<li class="fragment">Composer will also generate a <code>composer.lock</code> file</li>
</ul>
</li>
<li class="fragment">Whenever a new version of a dependency is released, run <code>composer update</code> to see some more magic</li>
</ul>
</section>
<section>
<h2>Composer: Using packages</h2>
<ul>
<li class="fragment">
Include the Composer autoloader
<pre class="bigger"><code class="language-php">require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';</code></pre>
</li>
<li class="fragment">That's it</li>
</ul>
<div class="fragment warning">Warning: don't ever change any of the files inside the <code style="color: #000">vendor</code> subfolder! Above that don't add that folder (along with <code style="color: #000">composer.lock</code>) into version control!</div>
</section>
<section>
<h2>Composer Example: Swiftmailer</h2>
<ul>
<li class="fragment">
Except for a different autoloader, nothing has changed!
<pre class="bigger"><code class="language-php" style="max-height: 340px; overflow: scroll;"><?php
// Require autoloader
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
// Create the Transport
$transport = Swift_SmtpTransport::newInstance('smtp2.kahosl.be', 25);
// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
// Create a message
$message = Swift_Message::newInstance('Lorem Ipsum')
->setFrom(array('[email protected]' => 'John Doe'))
->setTo(array(
'[email protected]' => 'blackhole'
))
->setBody(strip_tags(file_get_contents('assets/content.html')))
->addPart(file_get_contents('assets/content.html'), 'text/html');
// Send it (or at least try to)
if(!$mailer->send($message, $errors)) {
echo 'Mailer Error: ';
print_r($errors);
} else {
echo 'Message sent!';
}
// EOF</code></pre>
</li>
</ul>
<footer class="fragment">What also changed is that this package can now easily be updated!</footer>
</section>
</section>
<!-- 3 : H5BP -->
<section>
<section>
<h2>HTML5 Boilerplate</h2>
<ul>
<li class="fragment">
<a href="http://html5boilerplate.com/">http://html5boilerplate.com/</a>
</li>
<li class="fragment">
Full blown start template to develop an HTML5 page
<ul>
<li class="fragment">Doctype</li>
<li class="fragment">IE SHIV</li>
<li class="fragment">Mobile Optimizations</li>
<li class="fragment">(old)IE Optimizations</li>
<li class="fragment">jQuery & Modernizr included by default</li>
</ul>
</li>
</ul>
</section>
</section>
<!-- 4 : CSS Frameworks & Grid Systems -->
<section>
<section>
<h2>CSS Frameworks & Grid Systems</h2>
<ul>
<li class="fragment">
Think of it as H5BP but then for styling your pages
<ul>
<li class="fragment">Reset</li>
<li class="fragment">Basic Typography</li>
<li class="fragment">
Grid System
<ul>
<li>Columns & Gaps</li>
<li>Can even be responsive</li>
</ul>
</li>
</ul>
</li>
<li class="fragment">
Examples
<ul>
<li class="fragment"><a href="http://www.getskeleton.com/">Skeleton</a></li>
<li class="fragment"><a href="http://goldengridsystem.com/">Golden Grid System</a></li>
<li class="fragment"><a href="http://lessframework.com/">Less Framework</a></li>
<li class="fragment"><a href="http://twitter.github.com/bootstrap/">Bootstrap, from Twitter</a></li>
<li class="fragment"><a href="http://foundation.zurb.com/">Zurb Foundation</a></li>
<li class="fragment">...</li>
</ul>
</li>
</ul>
</section>
</section>
<!-- 5 : Modernizr -->
<section>
<section>
<h2>Modernizr</h2>
<ul>
<li class="fragment">
HTML5 & CSS3 Feature Detection via JavaScript<br />
<ul>
<li class="fragment"><a href="http://www.modernizr.com/">http://www.modernizr.com/</a></li>
</ul>
</li>
<li class="fragment">
Sets classes on the <code><html></code> tag tellling you if the browser suppors feature X or not
<pre class="bigger"><code class="language-html dontrun"><html lang="en" dir="ltr" id="modernizrcom" class="js no-touch postmessage history multiplebgs boxshadow opacity cssanimations csscolumns cssgradients csstransforms csstransitions fontface localstorage sessionstorage svg inlinesvg blobbuilder bloburls download formdata wf-proximanova1proximanova2-n4-active wf-proximanova1proximanova2-i4-active wf-proximanova1proximanova2-n7-active wf-proximanova1proximanova2-i7-active wf-proximanovacondensed1proximanovacondensed2-n6-active wf-athelas1athelas2-n4-active wf-active js flexbox flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths tk-loaded wf-active"></code></pre>
</li>
</ul>
</section>
<section>
<h2>Modernizr</h2>
<ul>
<li class="fragment">
Based on the classes, you can fix some CSS if a certain feature isn't available
<pre class="bigger"><code class="language-css">.no-borderradius .box {
/* a bit less padding perhaps? Or some background image? */
}</code></pre>
</li>
<li class="fragment">
Recommended presentation: <a href="http://www.slideshare.net/paul.irish/modernizr-lightning-talk">Modernizr - Detecting HTML5 and CSS3 support</a>
</li>
</ul>
</section>
</section>
<!-- 6 : Polyfills -->
<section>
<section>
<h2>Polyfills and Shims</h2>
<ul>
<li class="fragment">
Little pieces of JavaScript/HTML/CSS that provide support for missing browser features
</li>
<li class="fragment">
What's the difference between the two?
<ul>
<li class="fragment">
Polyfill: Provided code mimics the native API in browsers that don't support the feature
<ul>
<li class="fragment">viz. IE7 doesn't support <code>sessionStorage</code>, but if you plug in a <a href="https://gist.github.com/350433">sessionStorage polyfill</a>, it'll work without needing to adjust your code</li>
</ul>
</li>
<li class="fragment">
Shim: Provided code provides an alternative or a hotfix you can use if the feature is unsupported
<ul>
<li class="fragment">viz. <a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/">DD_BelatedPNG</a> to give IE6 transparent .png support</li>
</ul>
</li>
</ul>
</li>
<li class="fragment">
Huge list/overview available <a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills">on the Modernizr Wiki</a>
</li>
</ul>
</section>
<section>
<h2>Polyfills and Shims</h2>
<ul>
<li class="fragment">
Modernizr + <a href="http://yepnopejs.com/">yepnope</a> + Polyfill = #winning
<pre class="bigger"><code class="language-js dontrun">yepnope({
test: Modernizr.geolocation,
yep: 'regular-styles.css',
nope: ['modified-styles.css', 'geolocation-polyfill.js']
});</code></pre>
</li>
<li class="fragment">
Recommended read: <a href="http://www.netmagazine.com/features/making-html5-and-css3-work-polyfills-and-shims">Making HTML5 and CSS3 work with polyfills and shims</a>
</li>
<li class="fragment">
Recommended read: <a href="http://addyosmani.com/polyfillthehtml5gaps/slides/">Polyfilling the HTML5 gaps</a>
</li>
</ul>
</section>
</section>
<!-- 7 : UI Thread -->
<section>
<section>
<h2>The UI Thread</h2>
<ul>
<li class="fragment">
The browser has something called <em>The UI Thread</em>
<ul>
<li class="fragment">
Tasks
<ul>
<li>Draw UI Updates</li>
<li>Execute JavaScript</li>
</ul>
</li>
<li class="fragment">
Only one task can happen at the same time
</li>
<li class="fragment">
Tasks are queued
</li>
</ul>
</li>
<li class="fragment">
Example: button <code>onclick</code> handler
<ul>
<li class="fragment">Change UI to button down (pressed) state</li>
<li class="fragment">Execute handler</li>
<li class="fragment">Change UI to button up (normal) state</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>The UI Thread</h2>
<ul>
<li class="fragment">
Take this handler function for example
<pre class="bigger"><code class="language-javascript">var square = document.getElementById('square');
for (var i = 0; i < 100; i++) {
square.style.left = parseInt(square.style.left) + 1 + 'px';
}</code></pre>
<div id="square" style="margin: 0 auto 0; background: lime; width: 100px; height: 100px; text-align: center; line-height: 100px; font-size: 14px; position: relative; left: 0;">#square</div>
</li>
<li class="fragment">
Remember: one task at a time!
<ul>
<li>No UI updates while executing JavaScript!</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>The UI Thread</h2>
<ul>
<li class="fragment">
Solution <em>(animations)</em>: use <code>setTimeOut()</code> or <code>setInterval()</code> or <code>requestAnimationFrame()</code>
<pre class="bigger"><code class="language-javascript">var square = document.getElementById('square2'),
i = 0;
var move = function() {
square.style.left = parseInt(square.style.left) + 1 + 'px';
if (i++ < 100) setTimeout(move, 1000 / 60);
}
move();
</code></pre>
<div id="square2" style="margin: 0 auto 0; background: lime; width: 100px; height: 100px; text-align: center; line-height: 100px; font-size: 14px; position: relative; left: 0;">#square</div>
</li>
<li class="fragment">
Solution <em>(XHR)</em>: use it asynchronously
</li>
</ul>
</section>
<section>
<h2>The UI Thread</h2>
<ul>
<li class="fragment">
Recommended read: <a href="http://www.slideshare.net/nzakas/responsive-interfaces">Responsive Interfaces</a>
</li>
</ul>
</section>
</section>
<!-- 8 : Cronjobs -->
<section>
<section>
<h2>Cronjobs</h2>
<ul>
<li class="fragment">
Some tasks can't be performed in one simple go
<ul>
<li>viz. send out 10000 mails</li>
</ul>
</li>
<li class="fragment">
Some tasks need to run once a day
<ul>
<li>viz. process gathered stats and create a linechart of the data</li>
</ul>
</li>
<li class="fragment">
Possible via <em>cronjobs</em>
<ul>
<li>On Linux: <code>crontab</code></li>
<li>On Windows: Task Scheduler</li>
</ul>
</li>
<li class="fragment">
Most of the time a cronjob will fetch a (PHP) script to performs the task required
<ul>
<li>Mostly via <code>wget</code> or <code>curl</code></li>
</ul>
</li>
</ul>
</section>
</section>
<!-- 9 : Domain Registration -->
<section>
<section>
<h2>Domain Registration</h2>
<ul>
<li class="fragment">
In Belgium
<ul>
<li class="fragment"><code>.be</code> Top Level Domain in control of <a href="http://www.dns.be/">DNS.be</a></li>
<li class="fragment">Registration possible via a <a href="http://www.dns.be/whois/findRegistrars/?0">registrar</a> <em>(registered agent)</em></li>
<li class="fragment">Registrar registers your domain on your name</li>
</ul>
</li>
<li class="fragment">Domains mostly registered for a period of one year</li>
<li class="fragment">
If you don't renew a domain in due time, it's placed in <a href="http://www.dns.be/nl/domeinnaam/domeinnaamstatus">quarantine</a> for 40 days
<ul>
<li class="fragment">Orignal registrant can re-active the domain (at an extra cost)</li>
<li class="fragment">After 40 days, anyone can register it</li>
</ul>
</li>
<li class="fragment">
Other terms you should know
<ul>
<li class="fragment">Move a domain = change registrar</li>
<li class="fragment">Transfer a domain = change owner</li>
</ul>
</li>
</ul>
</section>
</section>
<!-- 10 : Website Publishing -->
<section>
<section>
<h2>Website Publishing (1)</h2>
<ul>
<li class="fragment">
Most of the time
<ul>
<li class="fragment">Upload changed files via FTP</li>
<li class="fragment">Go to PHPMyAdmin and do some DB changes</li>
<li class="fragment">Hope that site still works and you haven't made any mistakes</li>
</ul>
</li>
<li class="fragment">
Things can be automated though
</li>
<li class="fragment">
Example: <a href="https://github.com/capistrano/capistrano/wiki/">Capistrano</a>
<ul>
<li class="fragment">Make changes and commit them to your version control system</li>
<li class="fragment">Run <code>cap deploy</code> on your machine, sit back, and enjoy the show</li>
<li class="fragment">Possible to roll back if you've deployed a wrong version</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>Website Publishing (2)</h2>
<ul>
<li class="fragment">
Example: <a href="www.bram.us/2012/07/18/automatic-website-publishing-with-git-ftp-py-on-mac-os-x/">git-ftp.py</a>
<ul>
<li class="fragment">Run <code>python git-ftp.py</code> to upload (FTP) the files committed in Git since you've last run the command.</li>
</ul>
</li>
<li class="fragment">
Example: <a href="http://www.heroku.com">Heroku</a>
<ul>
<li class="fragment">Platform as a service. Just add heroku as a remote, push to it and the service will deploy your app onto one or more servers automatically</li>
</ul>
</li>
<li class="fragment">
…
</li>
</ul>
</section>
</section>
<!-- 11 : Reporting Bugs -->
<section>
<section>
<h2>Reporting Bugs</h2>
<ul>
<li class="fragment">
If you find a (browser/library/etc) bug, report it
<ul>
<li class="fragment">
Be descriptive
<ul>
<li>Which browser?</li>
<li>Which version?</li>
<li>What happens?</li>
<li>What should have happened?</li>
</ul>
</li>
<li class="fragment">Provide a test case</li>
<li class="fragment">Provide a reduction</li>
</ul>
</li>
<li class="fragment">
Recommended read: <a href="http://ejohn.org/blog/a-web-developers-responsibility/">A Web Developer's Responsibility</a>
</li>
</ul>
</section>
</section>
<!-- 12 : PHP Frameworks -->
<section>
<section>
<h2>PHP Frameworks</h2>
<p><img src="assets/08/easierlife.jpg" alt="" title="" height="376" width="640" /></p>
<q>This will make your life easier</q>
</section>
<section>
<h2>PHP Frameworks</h2>
<q>
The idea behind a framework is to offer a design you can use across multiple applications. All applications have a number of basic things in common. A framework is designed to provide a structure for those common elements (database interaction, presentation layer, application logic) so you spend less time writing up database interface code or presentation-layer interfaces and more time writing the application itself.
</q>
<p>from <a href="http://www.ibm.com">ibm.com</a></p>
</section>
<section>
<h2>Which one should I choose</h2>
<ul>
<li class="fragment">If you are the boss
<ul>
<li class="fragment">Documentation & community</li>
<li class="fragment">Learning curve, skills of your team</li>
<li class="fragment">Less code, faster development</li>
<li class="fragment">Focus of your future applications</li>
<li class="fragment">Extensibility</li>
<li class="fragment">Performance</li>
<li class="fragment">(Developers are more expensive than servers)</li>
</ul>
</li>
<li class="fragment">When you aren't the boss
<ul>
<li class="fragment">Listen to your colleagues</li
</ul>
</li>
</ul>
</section>
<section>
<h2>Most used & most popular</h2>
<ul>
<li class="fragment">Popular: People talk about it...
<ul>
<li class="fragment">Does this mean it's popular?</li>
<li class="fragment">Does this mean it's poorly documented?</li>
</ul>
</li>
<li class="fragment">Most used: How many times someone has downloaded it</li>
<li class="fragment">
Combined <br/>
<img src="assets/08/statisticsframework.png" alt="" title="" height="337" width="566" />
</li>
</ul>
</section>
<section>
<h2>Zend framework</h2>
<ul>
<li class="fragment">Founded 1997</li>
<li class="fragment">Built by PHP core contributors</li>
<li class="fragment">Well known</li>
<li class="fragment">Great API and reference guide</li>
<li class="fragment">Used for enterprise-level applications</li>
<li class="fragment">Zend studio, PHP </li>
<li class="fragment"><a href="http://www.zend.com/services/certification/">Zend certifications</a></li>
</ul>
</section>
<section>
<h2>Yii framework</h2>
<ul>
<li class="fragment">Yes it is</li>
<li class="fragment">Founded 2008</li>
<li class="fragment">Derived from the Prado framework</li>
<li class="fragment">Highly modular</li>
<li class="fragment">High performance</li>
<li class="fragment">Well documented</li>
</ul>
</section>
<section>
<h2>CodeIgniter</h2>
<ul>
<li class="fragment">First release in 2006 (EllisLab)</li>
<li class="fragment">"Beginners" framework</li>
<li class="fragment">Easy to learn</li>
<li class="fragment">Small footprint</li>
<li class="fragment">High performance</li>
<li class="fragment">For content websites and small web applications</li>
</ul>
</section>
<section>
<h2>CakePHP</h2>
<ul>
<li class="fragment">First release in 2005</li>
<li class="fragment">Based on Ruby on Rails ideas</li>
<li class="fragment">Huge community</li>
<li class="fragment">The documentation can be better</li>
<li class="fragment">Fairly strict, not flexible</li>
<li class="fragment">Rather slow (performance)</li>
<li class="fragment">Often used to build prototypes</li>
</ul>
</section>
<section>
<h2>Symfony</h2>
<ul>
<li class="fragment">First release in 2005</li>
<li class="fragment">Adaptable and extendable</li>
<li class="fragment">Used for enterprise-level applications</li>
<li class="fragment">Drupal and phpBB</li>
</ul>
</section>
<section>
<h2>Silex</h2>
<ul>
<li class="fragment">Mini framework</li>
<li class="fragment">Solid documentation</li>
<li class="fragment">Pimple DIC</li>
<li class="fragment">Based on Symfony components</li>
<li class="fragment">Plays nice with Doctrine DBAL, Twig, etc.</li>
</ul>
<footer class="fragment">FYI: Silex is now <a href="http://bramus.github.com/ws2-sws-course-materials/">being taught in Webscripting2</a></footer>
</section>
</section>
<!-- 13 : Content Management Systems -->
<section>
<section>
<h2>Content Management Systems</h2>
<p><img src="assets/08/updatemywebsite.png" alt="" title="" height="376" width="640" /></p>
<q>Maybe you can update my website?</q>
</section>
<section>
<h2>Content Management Systems</h2>
<q>
A content management system (CMS) allows publishing, editing and modifying content as well as site maintenance from a central page. It provides a collection of procedures used to manage work flow in a collaborative environment.
</q>
<p>from <a href="http://www.wikipedia.org">wikipedia.org</a></p>
<ul>
<li>Focus on <strong>Web</strong> CMS</li>
</ul>
</section>
<section>
<h2>Which one should I choose</h2>
<ul>
<li>Are you the boss? Look back to PHP framework</li>
<li>What kind of application/websites?</li>
<li>Extensible & adaptable</li>
<li>Documentation & community</li>
<li>Structure</li>
<li>User-friendly</li>
</ul>
</section>
<section>
<h2>Most used in top 10.000</h2>
<p>
<img src="assets/08/statisticscms.png" alt="" title="" height="320" width="577" />
</p>
<ul>
<li class="fragment">Sidenote: WordPress got its traction as a blog engine</li>
</ul>
</section>
<section>
<h2>WordPress</h2>
<ul>
<li>Blog engine</li>
<li class="fragment">Extended to a complete CMS
<ul>
<li>Taxonomy</li>
<li>Multisites (3.0)</li>
</ul>
</li>
<li class="fragment">User friendly interface</li>
<li class="fragment">Plugins and widgets</li>
<li class="fragment">Uncountable amount of themes</li>
<li class="fragment"><em>Easy</em> to develop own plugins and themes</li>
<li class="fragment">Great <em>Codex</em></li>
<li class="fragment">Used for blogs and smaller websites</li>
</ul>
</section>
<section>
<h2>Drupal</h2>
<ul>
<li>Founded in 2001 by Dries Buytaert</li>
<li class="fragment">Interface (and terminology) for developers</li>
<li class="fragment">More than 9000 modules
<ul>
<li>Not always compatible with eachother</li>
<li>Not always up to date, bug free</li>
</ul>
</li>
<li class="fragment">Huge, but still seizable</li>
<li class="fragment">Possible to develop own plugins and themes</li>
<li class="fragment">Well documented</li>
<li class="fragment">Enterprise level CMS</li>
</ul>
</section>
<section>
<h2>Joomla</h2>
<ul>
<li>Founded in 2000, as Mambo</li>
<li class="fragment">Very user friendly interface</li>
<li class="fragment">Very popular amongst dummies</li>
<li class="fragment">More than 9000 extensions</li>
<li class="fragment">Structure not always clear</li>
<li class="fragment">Well documented</li>
<li class="fragment">Business level CMS
<ul>
<li>Nevertheless mostly used for content sites</li>
<li>Limited user roles</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>Others</h2>
<ul>
<li class="fragment">Expression Engine
<ul>
<li>Very popular amongst designers</li>
<li>Easy to make templates</li>
<li>Very user friendly back-end</li>
<li>Built on CodeIgniter (EllisLab)</li>
<li>Not free :-(</li>
</ul>
</li>
<li class="fragment">Fork CMS
<ul>
<li>Very popular in Ghent</li>
<li>Built on the <del>Spoon library</del> <ins>Symfony Components</ins></li>
<li>User friendly back-end</li>
<li>Clear structure</li>
<li>Extensible with themes and modules</li>
<li>MarCom focus</li>
</ul>
</li>
</ul>
</section>
</section>
<!-- Node.js -->
<section>
<section>
<h2>Node.js</h2><ul>
<li class="fragment">
Event-Driven Model
</li>
<li class="fragment">
Powered by Google's V8 (JavaScript!)
</li>
<li class="fragment">
Can be used as a webserver
</li>
<li class="fragment">
Ships with a package manager <code>NPM</code> (cfr. Composer for PHP)