Wykład przeznaczony jest dla studentów II roku I stopnia Informatyki na WPPT. Odbywa się w czwartki w godz. 18:55 - 20:30 w sali 1.31/C-13. Na stronie tej znajdziesz informacje o zasadach zaliczenia, realizowanym materiale, literaturze oraz listę zadań.
Będziecie mieli do zrealizowania trzy projekty. Oceniana będzie jakość kodów (html, css, skrypty) oraz poprawność graficzna i typograficzna przedstawionych stron. Ocena końcowa będzie obliczana za pomocą wzoru $$ \frac{2 \cdot x_1 +3 \cdot x_2 + 4 \cdot x_3 }{9}~, $$ gdzie $x_1, x_2, x_3$ są ocenami z kolejnych projektów.
Spróbuj, w dowolny sposób, zbudować taką mniej więcej stronę - wizytówkę (kod html i css mają się zawierać w jednym pliku):
i przepuść ją przez walidatory HTML oraz CSS (linki są na górze tej strony). Tak długo modyfikuj stronę aż wyeliminujesz wszystkie błędy i ostrzeżenia
Spróbuj możliwie krytycznie ocenić stronę z tego obrazka - są na niej dwa ewidentne błędy kompozycyjne i jeden mniej ewidentny.
Do realizacji zadań związanych z budowanymi stronami WWW na razie nie stosujemy żadnych narzędzi ani bibliotek czy też frameworków (czyli - bez bootstrapa, bez jQuery itp). Korzystamy tylko z Notepad++ lub z Sublime Text.
suma, która oblicza sumę dwóch liczbsuma, którą możesz zastosować do dowolnej liczby argumentów, np. suma(2,3,22,14) (poczytaj o parametrze arguments funkcji).el posłuż się funkcją el.offsetHeight,
a do ustawienia wysokości może się posłużyć konstrukcją
el.style.height = h + "px";, gdzie h jest wyliczoną wysokością w pixelach.
body można oczytywać i zapisywać za pomocą document.body.style.fontSizeparseInt()""||16 oraz 24||16 (uwaga: 16px to domyślny rozmiar fontu większości przeglądarek).
<?php
require_once(__DIR__."/PHP/MyPage.php");
$P = new myPage("Jan Kowalski: edukacja");
$P->SetDescription("Główna strona witryny Jana " .
"Kowalskiego poświęconej przygodom edukacyjnym.");
echo $P->Begin();
?>
<header id="main-header">
....
</header>
a koniec mniej więcej tak
<?php echo $P->End();?>
<frame> zawierającym jeden element typu textarea, z dwoma przyciskami button. Po naciścięciu pierwszego przycisku okno ma wyliczyć liczbę liter we wprowadzonym tekście do textarea zaś drugi ma służyć do oczyszczenia textarea oraz starych wyliczeń.
| & | & |
| < | < |
| > | > |
| " | " |
| ' | ' |
| / | / |
html { box-sizing: border-box;}
*, *:before, *:after { box-sizing: inherit;}
.row:after{ content: ""; clear: both; display: table;}
.col{ float: left; width: 50%;}
Napisz kod w języku PHP, który wygeneruje grid złożony $n$ wierszy oraz $2^k$ kolumnami z losowymi kolorami tła. Kolumny mają być generowanie rekurencyjnie. Tam ma, mniej wiecej wyglądać wygenerowany wiersz dla $k=2$:
<div class="row">
<div class="col">
<div class="row">
<div class="col" style="background: #3a2b3d"> </div>
<div class="col" style="background: #b4d273"> </div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col" style="background: #665d32"> </div>
<div class="col" style="background: #076da3"> </div>
</div>
</div>
</div>
Przetestuj zachowanie przeglądarek dla $n=20$ i $k=1,\ldots,9$. Możesz posłużyć się następującym kodem do wygenerowania losowych kolorów:
$rand = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function RandomColor(){
global $rand;
return '#'.$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)];
}
$topmenu-bg : #33b5e5;
#topmenu{
background: lighten($topmenu-bg, 20%);
color: #222;
ul {
list-style: none;
li {
display: block;
&.active {
color: #12d232;
}
a {
color: 10ea30;
&:hover{
color: #ce1211;
}
}
}
}
}
Przenalizuj wynik, pomyśl o uproszczeniu struktury css, popraw scss i ponownie skompiluj.
%light-element{
background: lighten($topmenu-bg, 20%);
color : #333;
padding: .5em 1em;
}
.jasny-element{
@extend %light-element;
border : 1px solid red;
}
table.jasny-element{
@extend %light-element;
td {
padding: 0.25em;
}
}
Przenalizuj wynik.
@mixin setBgColPad($bg, $col, $pad){
background: $bg;
color : $col;
padding : (0.5)*$pad $pad;
}
.myDarkElement{
@include setBgColPad(#222, #eee, 1em);
font-size: 2em;
p {
padding: 1em;
}
}
.myLightElement{
@include setBgColPad(#eee, #222, 1.5em);
border: solid 2px red;
header {
color : #000;
}
}
chrome://flags/#allow-insecure-localhost.
imie = "Jola";
var osoba = {
imie : "Anna",
hello : function(){console.log(this.imie)}
}
osoba.hello();
function wywolaj(f) {f()}
wywolaj(osoba.hello);
Uwaga: jeśli testujesz ten kod w środowisku Node, to pierwsza linijkę zmień na global.imie="Jola";
mathjax dodaj do opisów wykładów teoretycznych przenajmniej po jednym z najważniejszych wzorów które poznałeś na wykładzie
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <title>Tytul strony</title> <meta name="description" content="..."> <meta name="author" content="..."> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> </head> <body> </body> </html>
* { box-sizing: border-box;}
body{
background-color:#000;
}
#container{
width:100%;
max-width:940px;
margin:1em auto 0em auto;
background-color:#fff;
padding:0 0.5em;
}
html (od roku 2013)
.row:after {
content: "";
clear: both;
display: table;
}
[class*='col-'] {
float: left;
padding: 0 0.5em;
width: 100%;
margin-bottom:0.5em;
}
@media screen and (min-width: 640px) {
.row+.row {
margin-top: 0.5em;
}
.col-1-2 {
width: 49.5%;
margin-right:1%;
}
.col-2-2 {
width: 100%;
}
[class*='col-']:last-of-type {
margin-right:0;
}
}
<div class="row">
<div class="col-1-2">
<h2>Kolumna 1a</h2>
</div>
<div class="col-1-2">
<h2>Kolumna 2a</h2>
</div>
</div> <!-- row -->
Uwaga: nie przejmujcie się, jeśli wszystkiego nie chwyciliście. Na następnym wykładzie omówimy raz jeszcze zamieszczone kody - tym razem dokładniej i spóbujemy zapoznać się ze wszystkimi detalami (linijka po linijce) i omówimy sobie dokładniej o co chodzi z css.
col-k-n : width: $k\cdot \Delta + (k-1)\cdot\delta$;
node.js i zacznij korzystać z REPL. Podłącz node.js do swojego edytora tekstów.
let
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<title>PHP intro</title>
<link rel="stylesheet" href="css/intro.css">
</head>
<body>
<div id="container">
<?php
$autor = "Jacek Cichoń";
echo "<h1>Jestem stroną wygenerowaną przez PHP</h1>\n";
echo "<p>Tę piękną stronę zbudował {$autor}.</p>\n";
?>
</div>
</body>
</html>
A to jest wyniki: PHPIntro01.php.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<title>PHP intro</title>
<link rel="stylesheet" href="css/intro.css">
</head>
<body>
<div id="container">
<?php
function myDiv($txt, $class){
$s = "<div class=\"wider {$class}\">\n";
$s.= " " . $txt;
$s.= "\n</div>\n";
return $s;
}
function myCard($title, $info, $img=""){
$title = trim($title);
$img = trim($img);
$s = "<div class=\"card-info\">\n";
if ($title !==""){
$s.= " <header>{$title}</header>\n";
}
if ($img !== ""){
$s.= " <img src=\"img/{$img}\">\n";
}
$s.= " <p>{$info}</p>\n";
$s.= "</div>\n";
return $s;
}
?>
<?php
$autor = "Jacek Cichoń";
echo "<h1>Jestem stroną wygenerowaną przez PHP</h1>\n";
echo "<p> Tę piękną stronę zbudował {$autor}.</p>\n";
echo myDiv("To jest niebieski div","blue");
echo myDiv("To jest czerwony div","red");
echo myDiv("To jest zielony div","green");
echo "<div class='row'>\n";
echo myCard(
"Wakacje 2016",
"Piękna i dosyć trudno dostępna laguna Balos na Krecie. Najłatwiej jest tam dostać się łodzią.",
"gr01.jpg");
echo myCard(
"Wakacje 2016",
"Drugie zdjęcie z laguny Balos",
"gr02.jpg");
echo "</div>\n";
?>
</div>
</body>
</html>
A to jest wyniki: PHPIntro02.php.
<?php
class MyPage {
private $Title = "";
public function __construct($Title = "") {
$this->Title = $Title;
}
public function Begin(){
$s = "<!DOCTYPE html>\n";
$s.= "<html lang='pl'>\n";
$s.= "<head>\n";
$s.= "<meta charset='utf-8'>\n";
$s.= "<title>" . $this->Title . "</title>\n";
$s.= "<meta name='author' content='Jacek Cichoń'>\n";
$s.= "<meta name='viewport' content = 'width=device-width, initial-scale=1.0'/>\n";
$s.= "<link rel='stylesheet' href='css/reset.css'>\n";
$s.= "<link rel='stylesheet' href='css/grid.css'>\n";
$s.= "<link rel='stylesheet' href='css/mystyle.css'>\n";
$s.= "<script src='js/application.js'></script>\n";
$s.= "</head>\n";
$s.= "<body>\n";
$s.= "<div id='container'>\n";
return $s;
}
public function End(){
$s = "</div>\n";
$s.= "</body>\n";
$s.= "</html>";
return $s;
}
}
?>
<?php
$MAIN_MENU_TMPL =<<<EOT
<ul id="mainmenu">
{{M1}}
{{M2}}
<li>Dydaktyka
<ul>
{{M3.1}}
{{M3.2}}
{{M3.3}}
</ul>
</li>
<li>Badania
<ul>
{{M4.1}}
{{M4.2}}
{{M4.3}}
</ul>
</li>
</ul>
EOT;
$MAIN_MENU_ITEMS = [
"M1" => ["Strona głowna","index.php"],
"M2" => ["Kadra", "kadra.php"],
"M3.1" => ["Osoby", "listaosob.php"],
"M3.2" => ["Konsultacje", "konsultacje.php"],
"M3.3" => ["Dyplomowe", "pracedyplomowe.php"],
"M4.1" => ["Seminaria", "seminaria.php"],
"M4.2" => ["Publikacje", "publikacje.php"],
"M4.3" => ["Projekty", "projekty.php"]
];
$MAIN_MENU_LI_1 = '<li class="active">{{T}}</li>';
$MAIN_MENU_LI_2 = '<li><a href="{{H}}">{{T}}</a></li>';
/**
*
* @param string $active identyfikator elementu menu który nie jest linkiem
* @return string
*/
function generujMenu2($active) {
global $MAIN_MENU_TMPL, $MAIN_MENU_ITEMS, $MAIN_MENU_LI_1, $MAIN_MENU_LI_2;
$s = $MAIN_MENU_TMPL;
foreach ($MAIN_MENU_ITEMS as $key => $array) {
$mkey = "{{" . $key . "}}";
$item = ($key === $active)? $MAIN_MENU_LI_1 : $MAIN_MENU_LI_2;
$item = (string)str_replace(["{{T}}","{{H}}"], $array, $item);
$s = (string)str_replace($mkey, $item, $s);
}
return $s;
}
?>
var gulp = require('gulp');
var sass = require('gulp-sass');
gulp.task('hello', function() {
console.log('>>>>>>>>>>>');
console.log('Hello Jacek');
console.log('<<<<<<<<<<<');
});
var sassOptions = {
errLogToConsole: true,
outputStyle: 'expanded',
precision: 8
};
var sassOptionsCompressed = {
errLogToConsole: true,
outputStyle: 'compressed',
precision: 8
};
gulp.task('callsass', function(){
return gulp.src('scss/HomePage.scss')
.pipe(sass(sassOptions))
.on('error', sass.logError)
.pipe(gulp.dest('css'));
});
gulp.task('obserwuj',function() {
gulp.watch('scss/*.scss', ['callsass'])
.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type);}
);
});
refresh(); startRefresh(); i stopRefresh();
this w javascript.session_start();: to musi być użyte przed wygenerowaniem dowolnego tekstu (np. poleeniem echo ..)header("location: PLIK");: przed tym też nic nie powinno być wygenerowanePromise.all) oraz sekwencyjne wywołanie obietnic (promise.then(promise).then(promise) ...) function podstawPodElem (elem) i zobacz co oznacza w jej kodzie słowo kluczowe this; wyjaśnij co się tutaj dzieje (czyli dlaczego this wskazuje obiekt img); podstawPodElem (elem) jest polecenie window.scrollTo(0,0)?
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
do wyświetlania potencjalnych błędów.
var i =1;
console.log((i++)+ " one");
setTimeout(function (){console.log( (i++) + " TWO"); }, 0);
console.log((i++) + " three");
console.log((i++) + " four");
console.log((i++) + " five");
Wewnętrzny stos, API i kolejka (przeanalizuj uważnie kod z tej strony i zinterpetuj jego działanie).
font-size jednostek vw: Bad.html: wyobraź sobie, że masz kłopoty ze wzrokiem i spróbuj zwiększyć rozmiar czcionek na tamtej stronie.https://cs.pwr.edu.pl/apiKadra.php oraz https://cs.pwr.edu.pl/apiKadra.php?NICK=MGE i następnie spróbuj samodzielnie się dobrać do tego serwisu.
Aplication i odczytaj plik manifest.json.
Spróbuj na swoim telefonie otworzyć tę stronę i przypnij ją do ekranu startowego.
Na następnym, ostatnim, wykładzie przekształcimy tę aplikację na Progresive Web Application.
A na razie zainstaluj sobie wtyczkę Lighhouse oraz Web Server for Chrome (200 OK).