Skip to content

Sajt https://free.scorespro.com/ je sajt sa kojeg možemo besplatno preuzimati sportske rezultate a koje kasnije možemo kao uslugu da ponudimo u različitim aplikacijama: IPTV, Android, veb itd. Radi poboljšanja ažurnosti sportskih rezultata javlja se potreba za optimizacijom procesa preuzimanja podataka.

Korak 1

Preuzimanje rezultata trenutno funkcioniše na sledeći način: sistemski šedjuler na svaka tri minuta pokreće skript koji skida rezultate za sve sportove redom (fudbal pa zatim košarka pa zatim tenis itd). Prvi korak je da se preuzimanje rezultata razdvoji po sportovima, odnosno, da se preuzimanje rezultata vrši nezavisno za svaki sport što samo po sebi neće ubrzati proces ali će biti dobra osnova za korak 2.

Korak 2

Potrebno je uvesti pravila za preuzimanje podataka. Npr., ako u nekom sportu nema utakmica koje su u toku, frekvencija preuzimanja podataka treba da se smanji sa jednom u tri minuta na npr. jednom u pet ili deset minuta. Sa druge strane, ako u sportu imamo aktivne utakmice, frekvencija preuzimanja podataka može da se poveća na npr. svaki minut.

Drugi primer je sport za koji nemamo zakazane utakmice u datom danu. U ovom slučaju ne bi bila greška ako ne bismo pozivali skript za preuzimanje podataka za taj sport više u tom danu ili, da bismo bili 100% sigurni, možemo za dati sport proveravati rezultate jednom u sat vremena.

Ovaj korak zahteva prelazak sa sistemskog šedjulera na deamon koji ima sopstveni šedjuler preuzimanja podataka.

Korak 3

Za svaki sport imamo listu utakmica, svaka utakmica ima vreme početka. Ako prva utakmica dana počinje u 17 sati, nema razloga proveravati rezultate za ovaj sport barem sat vremena pre početka prve utakmice. U ovom scenariju možemo da ne dobijemo pravovremenu informaciju o promenu statusa zakazane utakmice (npr. vreme početka je pomereno ili je utakmica odložena).

Korak 4

Ako u datom trenutku ne postoji aplikacija koja preko našeg API-ja preuzimaju rezultate, onda verovatno ne postoji potreba ni da mi u tom trenutku preuzimamo rezultate sa https://free.scorespro.com/ 🙂

U nekom ekstremnom scenariju, za svaki sport bi u bazi bilo zabeleženo vreme kada sledeći put treba preuzeti podatke sa https://free.scorespro.com/. Kada aplikacija preko našeg API-ja zatraži rezultate za određeni sport, prvo se proverava da li je prošao trenutak sledećeg preuzimanja podataka. Ako nije prošao, aplikacija dobija natrag postojeće rezultate iz baze. Ako jeste prošao trenutak, rezultati se prvo preuzimaju sa https://free.scorespro.com/, upisuju u bazu, ažurira se vreme kada sledeći put treba preuzeti podatke i onda se aplikaciji vraćaju ti ažurirani podaci (iz baze). U ovom slučaju, taj prvi korisnik koji inicira preuzimanje podataka sa https://free.scorespro.com/ će imati kašnjenje od par sekundi.

 

Za početak:

git clone <source> ~/projekat
cd ~/projekat
composer update
git clone https://github.com/laravel/homestead.gt ~/Homestead
cd ~/Homestead
git checkout v7.4.2
bash init.sh

Zatim editujemo ~/Homestead/Homestead.yaml u nešto poput ovog:

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/projekat
      to: /home/vagrant/code

sites:
    - map: projekat.local
      to: /home/vagrant/code/public

databases:
    - homestead

Nakon toga je potrebno dodati zapis u datoteku /etc/hosts:

192.168.10.10 projekat.local

I za kraj iz ~/Homestead direktorijuma pokrećemo virtuelnu mašinu:

vagrant up

October CMS možemo instalirati pomoću instalera, što je i preporučljiv način, a možemo i preko Kompozera:

composer create-project october/october projekat
cd projekat
php artisan october:install

Ako instalaciju vršimo preko Kompozera, onda ćemo u datoteci config/cms.php promenljivu disableCoreUpdates da postavimo na true.

Pošto ja imam običaj da projekte držim u svom home direktorijumu i da pravim simboličke linkove u /srv/http/, moraćemo da podesimo dozvole. Kao prvo i osnovno je da sebe dodam u grupu http. Nakon toga mogu ovako da podesim dozvole i da to sve manje-više radi kako treba 🙂

chown -R benke:http projekat/
chown -R http:http projekat/storage/
chmod -R ug+w projekat/

Na ovaj način mogu da menjam kod i iz Atoma i iz October CMS integrisanog editora i da nemam problema sa snimanjem dokumenata.

Na primeru jednostavnog HTML dokumenta:

<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Modern JavaScript</title>
    <link rel="stylesheet" href="https://bootswatch.com/4/cyborg/bootstrap.min.css">
  </head>
  <body>
    <main role="main" class="container">
      <br>
      <div class="jumbotron">
        <h1 id="heading">Sample text</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia libero, laudantium at laboriosam neque repudiandae! Vel quae corporis debitis, asperiores, autem provident quaerat beatae totam possimus quia, esse necessitatibus porro.</p>
        <p>Necessitatibus sint vel animi magni, omnis ducimus libero, expedita nemo eveniet voluptatum in rerum temporibus quam provident perspiciatis delectus ex asperiores doloribus voluptatem tempora non soluta id. Deserunt, nihil, ad recusandae quisquam dicta deleniti dolorum ipsam magni, voluptatibus esse temporibus. Architecto, quaerat!</p>
        <p id="toRemove">To be removed</p>
      </div>

      <a href="#" id="link" class="btn btn-danger btn-lg">Don't push me</a>
    </main>
  </body>
</html>

imamo:

CSS stilizovanje

<script>
document.querySelector('.jumbotron').style.color('red');
document.querySelector('.jumbotron').style.color = 'cornflowerblue';
document.querySelectorAll('main p').forEach(p => p.style['font-family'] = 'arial');
</script>

CSS klase

<script>
document.querySelector('.jumbotron').classList.remove('jumbotron');
document.querySelector('.container').classList.add('active');
document.querySelectorAll('p').forEach(p => p.classList.add('active'));
</script>

Loading Events

<script>
document.addEventListener('DOMContentLoaded', init);
window.addEventListener('load', load);
</script>

forEach()

<script>
let p = document.querySelectorAll(".jumbotron p");
p.forEach((item, index) => {
console.log(index, item.textContent);
});
</script>

DOM manipulacije

<script>
  let heading = document.querySelector('#heading')
  console.log(heading.innerText)

  alert("Last paragraph will be removed")

  let el = document.querySelector('#toRemove')
  el.remove()

  let paragraphs = document.querySelectorAll(".jumbotron p")
  //console.log(jumbotron[0].innerText)
  Array.from(paragraphs).forEach(p => {
    console.log(p.innerText)
  })

  alert("Adding text")

  let jumbotron = document.querySelector('.jumbotron')
  jumbotron.prepend('And now something completely different...')
  jumbotron.before('Here goes Jumbotron:')

  let parent = jumbotron.parentNode
  console.log(parent)

let main = document.querySelector('main');
let par = document.createElement('p');
par.textContent = 'New paragraph';
main.insertAdjacentElement('beforeend', par);
//beforebegin, afterbegin, beforeend, afterend </script>

Događaji

<script>
  let link = document.querySelector('#link')
  link.addEventListener('click', e => {
    e.preventDefault()
    alert("Don't push me!")
  })

document.querySelector('.jumbotron').addEventListener('click', function(ev){
//this.style.color = 'purple';
ev.currentTarget.style.color = 'gold';
});

document.querySelectorAll('p').forEach(function(p, index){
p.addEventListener('mouseover', function(ev){
ev.currentTarget.style.backgroundColor = 'skyblue';
});
p.addEventListener('mouseout', function(ev){
ev.currentTarget.style.backgroundColor = 'transparent';
});
}); </script>

Ajax & vanilla JavaScript

<script>
const URL = 'http://jsonplaceholder.typicode.com/albums'; document.addEventListener('DOMContentLoaded', () => {
let req = new Request(URL, {
method: 'GET'
});
});
fetch(req)
.then(response => response.json())
.then(data => {
console.log(data);
console.log(JSON.stringify(data, null, 2));
})
.catch(err => {
console.log('error')
}); </script>

Ajax & Axios

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
  axios.get('https://swapi.co/api/starships')
  .then(res => console.log(res.data))
  .catch(error => console.log(error))
</script>

Izvor: Traversy Media, Steve Griffith

U principu, sve što je potrebno da se uradi da bi se optimizovalo učitavanje sajta se nalazi na Guglovoj stranici PageSpeed Insights ali evo u kratkim crtama šta je sve to:

Slike treba kompresovati kako bi se smanjila količina bajtova. Smanjivanje količine bajtova (informacija o slici) vodi ka degradaciji kvaliteta pa stoga treba naći kompromis između veličine fajla i kvaliteta prikaza. Sajt Optimizilla vam može pomoći oko optimizacije slika. Generalno gledano, JPEG fajlovi su manji od PNG fajlova ali samo ako imamo sliku sa puno nijansi boja i detalja (fotografiju); ako slika više naginje ka crtežu i ima manji broj velikih jednobojnih površina, onda je PNG bolje rešenje.

gzip je format kompresije fajlova koji podržavaju svi moderni brauzeri i u principu se svodi na to da server, kada brauzeru šalje podatke, šalje ih u kompresovanom obliku a onda ih brauzer u letu dekompresuje i prikazuje korisniku bez da ovaj išta primeti sem naravno toga da se stranice brže učitavaju 🙂 Ukoliko veb hosting podržava gzip kompresiju, treba je uključiti kako bi se ubrzalo učitavanje sajta.

Minifikacijom se uklanjaju nepotrebni znaci poput praznina i novih redova iz HTML, CSS i JS koda čime se dobijaju manji fajlovi te se stranice opet brže učitavaju.

Keširanje je proces kojim se fajlovi u određenom periodu čuvaju na klijenstkoj strani i ne dovlače uvek iznova sa servera čime se takođe pozitivno utiče na brže učitavanje sajta.

CDN je mreža servera koja omogućuje krajnjem korisniku da bude bliže vašem sajtu bez obzira u kom se delu sveta on nalazio.

Odlaganje učitavanje sadržaja koji se ne vidi odmah po otvaranju sajta (above the fold) kao i skriptova koji nisu od presudne važnosti.

freeCodecamp

  1. prioritizing sleep to lose weight
  2. drink more water and lose weight fast
  3. eating breakfast is great for weight loss
  4. don't drink your calories
  5. stress management
  6. find activity you enjoy it
  7. walking and taking stairs
  8. two daily meals should be massive salads
  9. keep meals simple
  10. smart snacks: fruits
  11. enjoy more and play more
  12. quit counting calories
  13. cheat days and cheat meals

Jack Wilson

Kron je sistemski šedjuler na Linuksu i srodnim operativnim sistemima. Evo par interesantnih primera koje ili već koristim ili sam našao na netu za buduće potrebe...

Pokreni proces na svaki pun sat:

0 * * * * /home/petar/x.sh >> /home/petar/x.log

Pokreni proces na kraju dana:

55 23 * * * /home/petar/x.sh >> /home/petar/x.log

Pokreni proces svakih 10 minuta:

*/10 * * * * /home/petar/x.sh >> /home/petar/x.log

Pokreni proces svakog ponedeljka u ponoć:

0 0 * * 1 /home/petar/x.sh >> /home/petar/x.log

Pokreni proces svakog prvog u mesecu u 3 ujutro:

0 3 1 * * /home/petar/x.sh >> /home/petar/x.log

Pokreni proces na svakih pola sata između 9 i 5:

25 09-16 * * * /home/petar/x.sh >> /home/petar/x.log
55 08-16 * * * /home/petar/x.sh >> /home/petar/x.log

Pokreni proces prilikom svakog restarta sistema:

@reboot /home/petar/x.sh >> /home/petar/x.log

Više komandi možemo spajati sa && a putanje u kojima ima razmaka treba staviti pod navodnike:

*/15 * * * * cd "/home/petar/drn zvrc/" && /usr/bin/php "/home/petar/drn zvrc/x.php" >> "/home/petar/drn zvrc/x.log"

Kronov log se na Arču može videti sa:

journalctl -f | grep CRON

Izvor: Majstor Kvariš

PHP funkcija mail() služi za slanje mejlova eksternim programom sendmail. sendmail je jako star program koji je bio dobar za ove stvari sve dok nije otkriveno da ima znatne propuste u pogledu sigurnosti. Zbog ovakve reputacije, mnoge Linuks distribucije ga više ne uvrštavaju u svoje repozitorijume već nude alternativna rešenja. Problem nastaje u tome što, ako PHP ne nađe program sendmail na sistemu, više ne može da pošalje mejl funkcijom mail(). Stoga ova alternativna rešenja za slanje mejlova često obezbeđuju "simulirani" sendmail kako bi se funkcionisanje programa koji zavise od njega nastavilo nesmetano.

Pošto se sendmail više ne nalazi u zvaničnim Arč repozitorijumima, instaliraćemo sSMTP, pojednostavljeno rešenje za slanje mejlova putem SMTP protokola. sSMTP nije kompletan mejl server i nema mogućnost primanja mejlova već služi samo da isporuči mejl sa lokalnog računara do mejl servera a to je ono što nama treba. Plus, sSMTP je kompatibilan sa programom sendmail i pravi simbolički link /usr/bin/sendmail 🙂

lrwxrwxrwx 1 root root 5 феб 18 2017 /usr/bin/sendmail -> ssmtp

sSMTP-u je potrebno navesti kojem mejl serveru treba da šalje mejlove, koji su kredencijali i slično. Sve to se čuva u konfiguracionom fajlu /etc/ssmtp/ssmtp.conf . Primer konfiguracionog fajla:

root=postmaster
mailhub=mail.server.com:465
AuthUser=username
AuthPass=password
rewriteDomain=server.com
FromLineOverride=YES
UseTLS=YES

A log možemo da vidimo sa

journalctl -f | grep sSMTP

 

Telemedicina predstavlja upotrebu komunikacionih i informacionih tehnologija u cilju obezbeđivanja medicinske nege. Telemedicina može biti jednostavnog oblika poput diskusije dva lekara preko telefona a može biti i kompleksna kao u slučaju upotrebe satelitske tehnologije i opreme za videokonferenciju za sprovođenje konsultacija između medicinskih specijalista iz dve različite zemlje u realnom vremenu.

Postoje tri tipa telemedicine: uskladišti-i-prosledi, praćenje na daljinu i interaktivna telemedicina.

  1. Uskladišti-i-prosledi telemedicina obuhvata prikupljanje medicinskih podataka i njihovo slanje lekaru ili specijalisti na analizu i ona ne zahteva prisustvo obe strane u isto vreme. Medicinski radnik u ovom vidu telemedicine svoje zaključke zasniva na istorijatu slučaja i informacijama koje dobija a ne na fizičkom pregledu pacijenta.
  2. Praćenje na daljinu odnosno samopraćenje omogućuje lekaru da prati pacijenta na daljinu pomoću različitih tehničkih uređaja. Ovakvo praćenje je efikasnije i jeftinije od klasičnog pristupa - ličnog susreta pacijenta i lekara.
  3. Interaktivna telemedicina omogućuje interkaciju u realnom vremenu između pacijenta i lekara a obuhvata telefonsku konverzaciju, online komunikaciju i kućne posete.

Telemedicina je najkorisnija u udaljenim, izolovanim oblastima kao i u slučaju komunikacije opšteg lekara sa specijalistom. Telemedicina je jeftinija od tradicionalne. Specijalisti koji koriste telemedicinu obično dodaju prefiks “tele” pa tako imamo telekardiologiju (slanje EKG zapisa žičnim ili bežičnim putem), teleradiologiju (slanje rentgenskih slika) i slično.

Što se tiče uređaja koji se koriste u telemedicini, generalno gledano postoje dva tipa uređaja:

  1. Medicinski uređaj koji je opremljen sistemom za slanje SMS poruka; u ovom slučaju se u uređaj stavi SIM kartica, on se registruje na mrežu i može slati poruke serveru ili lekaru na obradu
  2. Medicinski uređaj koji je opremljen bluetooth-om; ovakav uređaj je lako povezati sa mobilnim telefonim ili računarom u cilju obrade ili slanja podataka na dalju obradu

Slede primeri iz prakse...

U Americi 75 miliona ljudi koristi telemedicinu a s obzirom na to da su Amerikanci jedna od vodećih nacija po broju srčanih oboljenja, njihovi su naučnici proizveli pacemaker pod nazivom Biotronik Home Monitoring System koji proverava stanje srca pacijenta 24 sata na dan. Rezultat svake pojedine kontrole se preko mobilnog telefona automatski šalje u bolničku bazu podataka, a odgovorni lekar u svakom trenutku zna šta se događa s njegovim pacijentom. LG Electronics je svoju pažnju posvetio osobama obolelim od dijabetesa pa je tako razvijen mobilni telefon koji omogućuje kontrolu glukoze u krvi. Izraelska kompanija MedicTouch već se godinama bavi uvođenjem novih tehnologija u medicinu. Zaslužni su za mobilni uređaj pod nazivom Pulse Meter, proizveden u saradnji sa Sun Microsystemsom, koji u samo nekoliko sekundi meri puls korisnika. U slučaju da puls ne odgovara prihvatljivim vrednostima aplikacija šalje podatke određenoj medicinskoj službi. Iskustvo je pokazalo kako je Pulse Meter idealan način za nadgledanje pacijenta tokom rehabilitacije izvan bolničkih prostora, a ujedno se štede i bolnička sredstva.

Bolnica Homerton iz Velike Britanije šalje SMS poruke svojim pacijentima kako bi ih podsetila na zakazane lekarske preglede. Zbog prisutnosti mobilnih uređaja u svakom trenutku i na svakom mestu pacijenti su brzo i efikasno upozoravani, a bolnica je ubeležila gotovo stopostotan učinak. Bolnica Ealing u zapadnom delu Londona preuzela je spomenutu metodu i dodatno je razradila. Uvidevši da veliki broj pacijenata ima određene medicinske teškoće, što zbog stidljivosti, a što zbog neznanja, osigurali su svim zainteresovanima SMS savetovanja o podbačaju, polno prenosivim bolestima ili kontracepcijskim sredstvima. Fire and Rescue Service povezao se s operaterom Orange pa su zajedno razvili sistem slanja MMS poruka medicinskim ustanovama pre dovođenja povređenih. Slike ozleda omogućavaju hitnoj službi da pripremi odgovarajuće medicinske
instrumente i lekove pre nego što pacijent stigne, a time su veće šanse za spašavanje dragocenih života.

U Indiji se koriste uređaji za merenje krvnog pritiska, šećera i EKG opremljeni bluetooth-om radi lakog povezivanja sa mobilnim telefonom i slanja podataka nadležnom lekaru. U Nemačkoj je konstruisana pumpa za insluin koja se kontroliše sa udaljenog računara pomoću kriptovanih SMS poruka. U Americi se razvija MDphone, mobilni telefon baziran na Android platformi i OpenRMS-u, koji će pomoći u prikupljanju i obradi podataka o stanju pacijenata.

OpenMRS je sistem elektronskih kartona pacijenata i implementiran je u više od dvadesetak zemalja sveta sa ciljem da se informacije uskladište na način koji će olakšati njihovu analizu i izvlačenje zaključaka što će reći: minimalna upotreba teksta - maksimalna upotreba kodiranih informacija.