29. Jan 2020 |

WordPressi backupi tegemine (bash script)

Varukoopia tegemine enda WordPressi lehest ei ole nii keeruline kui võib tunduda.

Seoses kasvava vajadusega varukoopiate järgi tegin endale selgeks, kuidas bash scripti kasutada. Mul olid varasemalt vajalikud read olemas ja sain neid terminalis kasutada aga selline rea kaupa toimetamine muutus tüütuks. Google otsing andis sellised vastused:

Aga noh, natuke liiga keerulised minu arust. NB! Kui SSH ühenduse loomine on sulle võõras, siis Zone helpis on hea juhend. Aga, sul tegelikult ei ole SSHd varukoopia tegemiseks vaja. Piisab ka komplektist: notepad + FTP + cron töö (iseteeninduses). Samas, katsetamiseks ja hiljem nt lahtipakkimiseks on siiski SSH mugavam.

📌 NB! See varukoopia tegemise juhend töötab standardse WP installi puhul. Muudel juhtudel (nagu näiteks see) ma ei ole seda katsetanud.

Scripti sisu

Echo asjad panin tooltipideks, et terminalis vaikus ei oleks terve aja 🙂 Kui andmebaas on suur, siis selle export ja pakkimine võtab omajagu aega. Eeldus on, et scripti fail on ühe kausta jagu madalamal kui WP install. Antud näites on WP install kaustas /htdocs.

#!/bin/bash
echo "Backupi tegemine algas!"
cd htdocs
echo "Andmebaasi export algas..."
wp-cli db export
echo ""
echo "Andmebaasi export tehtud!"
cd ..
echo "Alustasin pakkimist..."
tar czf "$(date +"%Y%m%d")_veebileht.tar.gz" htdocs/
echo "Pakkimine tehtud!"
rm htdocs/*.sql
echo "Andmebaas kustutatud!"
echo "Backupi tegemine lõpetatud."

Selle ülal oleva sisu salvestad näiteks backup.sh failina, käivitad eelpool toodud käsureaga ja ongi kõik. Mida mingi rida teeb?

3. rida – liigub kausta, kus on WP install.
5. rida – teeb andmebaasist koopia ja paneb selle WP installi kausta. Zones piisab wp db export, Veebimajutuses on vaja wp-cli db export.
6. rida – prindib tühja rea terminali 🙂 ilu pärast.
8. rida – liigub ühe kausta jagu madalamale
10. rida – teeb tar.gz formaadis koopia WP installi kaustast, kus sees on ka andmebaasi koopia. Faili nimi kujul YYYYMMDD_failinimi.tar.gz. Kui peaksid selle varukoopia tegemise näiteks cron tööga automatiseerima, siis iga päev on erinev faili nimi. Stackoverflowst leiab mingi juhendi, kuidas kellaaeg ka sisse panna soovi korral.
12. rida – kustutab andmebaasi koopia (kõik *.sql failid WP installi kaustast), sest noh, ei jäta selliseid asju vedelema.

NB! Zones ei sellist lihtsat varianti .sh käivitamiseks nagu pildil näidatud. Seal on vaja faili 2. reale lisada ${0%/*} või 3. reale panna täielik teekond alates /tmp kaustast, kus script tegelikult käivitatakse. Lisaks on käsk iseteeninduses selline:

/bin/bash [[$D2ND_A]]/script.sh

ja scripti failile on vaja teha terminalis: chmod +x script.sh (sest script peab olema executable)

Veelkord: See path, mis Zone iseteeninduses määrad on täispikk kataloog, kus script asub. Sinna ei tehta vaikimisi “cd”, see on lihtsalt muutuja, mida kasutada, et näiteks kui partitsioon peaks muutuma, siis muutujas läheb partitsioon ise õigeks. Cron käivitatakse ~/tmp kataloogis. Käsurealt võib proovida ise cd ~/tmp ja seal sees /data/…/script.sh käivitada. See on siis sama olukord, nagu crontab seda käivitaks.

Kuidas .sh faili teha?

Notepadiga teed faili (kui muud tööriista ei ole harjunud kasutama) ja hiljem muuda lihtsalt faili laiend ära 🙂

Scripti käivitamine

Käsk scripti käivitamiseks (koos sisselogimisega) on Zones selline:

ssh virt5713@neti.ee "bash domeenid/www.neti.ee/neti.sh"

Veebimajutuses selline:

ssh -p 1022 vhost57175ssh@pood.eu "bash pood.sh"

.sh faili path sõltub sellest, kuhu sa parasjagu sisse logimisega satud. Zone.ee ja Veebimajutuse käsud on pisut erinevad (aga mõlemal on iseteeninduses juhendid olemas. See teeb korraga sisselogimise ja scripti käivituse. Kui oled juba sisse loginud ja .sh failiga samas kaustas, siis piisab lihtsalt:
bash failinimi.sh

Regulaarse varukoopia tegemiseks (nt üle päeva) on hea mõte kasutada regulaartöid ehk cron töid, mida on lihtne seadistada iseteenindusest. See tähendab, et script pannakse tööle sinu poolt määratud ajal. Veebimajutuses näeb see välja näiteks nii.

Cron töö seadistamine Veebimajutuses. All pool saab linnukeste panemisega määrata ka kuupäevad ja kellaajad.

Kuidas lahti pakkida

Lahti pakkimise osa on mul siin olemas käsuridade kaupa. Win10 arvutis mul seda lihtsalt 7zipiga näiteks lahti pakkida ei õnnestunud aga serveris tuleb kenasti näiteks sellise käsureaga:

tar -xzvf archive.tar.gz

NB! Suurte failihulkade lahtipakkimisel ole ettevaatlik. Ma ükskord pakkisin Magento (~60 tuhat faili) serveri root folderisse lahti muude asjade sekka. Tükk aega oli koristamist 😀

25. Jan 2020 |

IT-arenduse õppe esimene semester

Esimene semester sai sel nädalal läbi. Ülehomme algab uus, kell 8 hommikul. Kirjutan lühidal siia ka, kuidas asjad läksid.

Algus on olnud üsna pöörane. 7 ainet (35 EAP) tehtud. Kaks neist olid pisemad. Matemaatika täiendusõpe (YMA0090) 3 EAP ja programmeerimise täiendusõpe (ITI0002 ) 2 EAP. Teised kõik suured 6 EAP:

  • Diskreetne matemaatika (IAX0010)
  • IT eetilised, sotsiaalsed ja professionaalsed aspektid (ICY0004)
  • Hulgad, seosed, süsteemid (ICY0024)
  • Sissejuhatus infotehnoloogiasse (ITI0101)
  • Programmeerimise algkursus (ITI0102)

Kirjutan praegu lühidalt aga täiendan tulevikus, kui midagi meenub.

Diskreetne matemaatika

See õppeaine tundus alguses märksa keerukam. Sisuliselt on aine läbimiseks vaja endale selgeks teha kümmekond arvutusprotseduuri. Näiteks loogikafunktsioonide minimeerimine Quine-McCluskey meetodil, Karnaugn kaardi abil, funktsiooni esitamine Reed-Mulleri baasis jne. Soovitan käia loengutes, praktikumides, lahendada ise näidisülesandeid ja kindlasti Moodle testid ära teha (10% hindest!) ja kodutöö hästi korralikult teha (10% hindest + saad kõik vajaliku selgeks).

Õppejõududel on väga hea õpik aine läbimiseks ning rohkelt õppematerjale. See aine on täiesti tehtav.

Hulgad, seosed, süsteemid

Kontrolltööd ja eksam on avatud materjalidega. Ma seda alguses ei teadnud. Aga, isegi nii ei ole võimalik ilma õppimata ainest läbi saada, kui asjadest tegelikult aru ei saa. See on selline aine, kus asjadest aru saamine võib võtta natuke aega. Mõned asjad said selgeks alles pärast eksamit. Näiteks hakkasin kahtlema, kas väiksem naturaalarv on suuremas naturaalarvus elemendiks või on ta suurema naturaalarvu elemendi elemendiks 😀 Õige vastus on vist siin. Olen mõelnud, kas võiks kiirelt lahti kirjutada peamised keerukused, mis ette tulid. Aga noh, vaatab.

Hulgad, seosed, süsteemid on osalejate keskmise hinde poolest 2. kohal, kui reastada alates kõige madalamast. Allikas: TalTech ÕIS, 2017-2019.

Aine tehtud saamise võti on see, et orienteerud tähistes ja mõistetes ning oskad hulgateooria kirjutised enda jaoks ümber sõnastada “inimese keelde”. Näiteks tead, et seos on korteežide kogum, funktsioon on funktsionaalne seos, omadus on osahulk; iseenda elemendiks ei olda; iseenda osahulgaks ollakse jne.

Kindlasti üks huvitavamaid aineid aga kohati hakkas kontrolltöödeks ettevalmistamise koormus segama progemise ülesannete lahendamist. Loengud on huvitavad, hea huumorimeele ja näitelugudega õppejõud. Soovitan kasutada õppejõu tehtud õpikuid. Nendes on päris häid näiteid, mis aitavad asju mõista. Ma kasutaksin selle aine iseloomustamiseks sellist “gurmee aine” terminit, kuna seal oli lihtsalt umbes 20-30 tudengit päevaõppest (ÕIS näitab, et kokku deklareerunuid 87). Võrdluseks, progemise algkursusel oli 550 😀

Programmeerimise algkursus

See on päris krõbe aine ja sain selle üsna napilt tehtud. Kursus võtab hästi palju aega. Kursusele oli registreerunud umbes 550 tudengit (päevaõppes ja kaugõppes). Osade jaoks oli see ilmselt väga lihtne, teiste jaoks (nagu mina) üsna raske. Mõtlen kindlasti kursuse uuesti teha, et APIt ja OOPi puudutav osa ka ära teha. Sel korral jäin seal täiesti hätta.

📌 Õppeaine Youtube’i kanal on leitav siit, et saaksid huvi korral vaadata, mida seal tegime.

Aine seisneb suures osas iseseisvalt ülesannete lahendamises. Igal nädalal on 2 ülesannet, millest üks on lihtsam ja teine raskem. Lahenduste korrektsust kontrollivad ja tagasisidet annavad automaattestid, mida võid kasutada lõputult. Selleks, et ülesanne saada arvestatud, peab test andma vähemalt 50% tulemusest. Õppejõud (Ago Luberg – lihtsalt super õppejõud!) ja abiõppejõud on alati kättesaadavad kursuse Discordis, kui kuskile takerduma peaks. Probleemid tavaliselt korduvad ja vahest aitab lihtsalt Discordi kerimine, et vaadata, kas keegi on sama keerukuse otsa juba sattunud. Õppematerjaliks on Pydoc (ja loomulikult kogu internet). Saan aru, et progemises sellise eesti keelse õppematerjali olemasolu ei ole üldse levinud.

📌 Soovitan: Alguses kõik ülesanded 100% peale ära pusida. Esimesed asjad annavad lihtsalt nii palju punkte võrreldes ajaga, mis neisse tuleb panna. Hiljem mingisugust minesweeperi algoritmi või OOPi asju ilmselt pusid hulga kauem. Algkursus on natuke eksitav nimi sellele. Ma olen varasemalt teinud TÜ programmeerimise alused kursuse (3 EAP), mis oli palju lihtsam. Aga jah, eks heale tasemel jõudmiseks ongi vaja aega sisse panna.

Praegu siin pooleli aga kirjutan edasi.

18. Dec 2019 |

Last day at school this year and… I am confused

TL;DR In order to create some buffer that allows me to study useful things (computer sciences) at a feasible pace I need to study… other things. And it is only my fault.

I am writing it only to clear my thoughts

All my life I have liked going to school and I still do. Initially, my idea was to come to TalTech and to study things that I need. I have written about the need here and everything in the study programme seemed to fit. And NOT to study things that I already have learnt.

I have a master’s degree in business administration and have worked 7 years in an international company. So there is no actual need (at least I feel this way) to study English (12 EAP!!!), basic economics (6EAP!!!), business communication (3EAP), entrepreneurship (3EAP) etc. It is simply a waste of my time without any benefit.

There is a VÕTA solution, that would allow me to get previously mentioned subjects “done”. The snag is that VÕTA does not help meeting the semester’s EAP requirement. And my problem is that I am not simply capable of learning ONLY computer-subjects at the pace that is needed (30EAP worth of “something from the programme” every semester) if I decide not to create a buffer with unnecessary subjects.

So, from next semester I will start learning English to create some buffer. Because otherwise, I would have to pay 40€ every semester for every EAP that I am missing from cumulative EAP requirement.

Curious

I prepared such overview of IADB17/17 subjects. Maybe I am getting it wrong but there are two illustrative KPIs for subjects:

  • The average grade
  • Positive results / declarations ratio

I am curious who suggested that Logic is the only recommended elective course on the 2nd semester’s standard study plan? Nothing else is not even mentioned there 😀 By forementioned KPIs it seems to be the hardest subject on the programme. And for spring semester there are plenty of other things to choose from.

5. Dec 2019 |

Random thought on school

Magnus Carlsen playing timed, blind simultaneous exhibition in front of thousands of people defeating opponents in 3 styles – checkmate, resigned, ran out of time.

And I am not able to solve object oriented programming excercise 😀

4. Dec 2019 |

Quick school update

Not much time to post, therefore just some quick notes.

I admire my Russian coursemates. It must be so much more difficult for them with this language barrier. I did no see it at Tartu University that much.

I tend to be amused by people’s ability to listen to (for example) set theory lecture (which is quite intensive) and solve OOP puzzles on Python at the same time in early morning lectures 😀 What a brain must it be.

Kakk is a real influencer. To get Django to work with all the pip installations I finally installed Linux (Ubuntu, dual boot next to Win10). Pip and Django installation was just ~20 characters of command lines to the terminal. Compared to the mess on Win10 and its Ubuntu terminal 😀 So now all my coding takes place on Linux part of my computer.

I just did my first AOC task and got the first points. So being a nerd is now official I assume.

Algorütm (in Estonian) is a really good podcast. I got shivers listening to Alvar Lumberg and Sergei Anikin on fire talking about Transferwise’s architecture.

21. Nov 2019 |

Audience of Testlio CEOs’ lecture in 2015

Audience of Kristel Kruustük and Marko Kruustük
Audience for the lecture by Kristel Kruustük and Marko Kruustük – founders of Testlio.

Kakk mentioned the importance of alt tags so this is the first picture I added those. This is just a funny picture from 4 years ago. Audience for the lecture by Kristel Kruustük and Marko Kruustük – founders of Testlio. I belive they now would have this classroom packed (like Python Code Clubs are on Wednesdays).

16. Nov 2019 |

Pentabonacci and other N-bonacci numbers

I had Python test on friday and one task was related to pentabonacci numbers. I still have not figured it out because I never trained such tasks.  You can find some information here and on GeeksForGeeks (by the way, it is really good explanation!).

But I now understand that without knowing this background it would have not been possible to solve this task despite it being 1 min task in Excel 🙂

Need to know: N-bonacci numbers with first N-1 initial terms set to 0 and Nth initial term set to 1. And everything that comes after is the sum of N previous numbers.

14. Nov 2019 |

Järjehoidja endale – IT-ametite päev

Hea video IT õppimisest neile, kes veel mõtlevad. Ago juhib hästi tähelepanu sellele, kuidas natuke eksitavalt kommunikeeritakse IT õppimise “lihtsust”. Samas, minu arust natuke liiga palju räägib “suurtest palkadest” ja “lahedatest kontoritest”, mis kumbki väga ei päästa, kui töö ikka üldse ei meeldi 🙂 Väljalangemiste asi on minu jaoks muidugi ikka müstika (23-24% juures paistab graafikul olevat). Et kas või kuidas saavad mingid asjad mingil hetkel osutuda ületamatult raskeks VÕI kas tegelikult ka inimesed lähevalt lihtsalt tööle poole õpingu pealt. Samas ma ei taju hästi ka enda puhul hetkel, kui realistlik selle õppekava läbimine üldse on. Aga noh, mõtlen, et kui asjadega tegeleda, siis ju peaks olema küll.

Inimeste lugusid oli küll huvitav kuulata selles videos. Lauri Greenbaum SEBst meeldis sellise suurkorporatsiooni protsesside vaatega ning tegelikult ka näiteks Marek Õunpuu – kuidas kuu ajaga saad Omniva Java junior arendajaks (ja samal ajal see 23-24% väljalangemine IT õppes). Ühtlasi soovitan Algorütm podcasti, mis natuke annab veel IT töö ja hariduse teemale vaatenurga kolme tippjuhi poolelt.

9. Nov 2019 |

Bulk delete WooCommerce products by category using WP-CLI

If you would like to know how to bulk delete posts from a specific category using the WP-CLI then here it is.

WP-CLI is command line interface for maintenance of WordPress. This is something I try to figure out.

Deleting one product

This deletes 1 product. 1157 is product ID. Without –force it does not work, because posts of type ‘product’ do not support being sent to trash.
So you need to use –force flag to skip trash and delete them permanently.

wp post delete 1157 --force

Deleting 100 products

Now I try to figure out how can I delete all products within category. This allows to delete 100 products at a time.

wp post delete $(wp wc product list --user=1 --format=ids --category=64) --force

Deleting specific number of products

wp post delete $(wp wc product list --user=1 --format=ids --category=64 --per_page=10) --force

By specifying –per_page you can limit how many products will be deleted with one execution. But it only works between 1 and 100 products.

Reason is that WooCommerce commands are implement as REST API requests and they are limited to a maximum of 100 results per request. This is a limitation that comes from WooCommerce, not WP-CLI. It’s unfortunate they have limited it that way, as it seriously lessens the benefits of having CLI commands in the first place.

Final solution that works (tested with 5000+ products)

for run in {1..2}; do wp post delete $(wp wc product list --user=1 --format=ids --category=64 --per_page=10) --force; done

This line does the job. Loops I found here and here. This sample deletes 20 products by using two runs, 10 products each. And this deletes products with status as “draft” (reference):

for run in {1..2}; do wp post delete $(wp wc product list --user=1 --format=ids --status=draft --per_page=10) --force; done

Delete products by product tag

Another one is here. tag is product tag ID.

wp post delete $(wp wc product list --user=1 --format=ids --tag=82 --per_page=2) --force

Deleting revisions

It is not uncommon sites to have multiple revisions on their pages. This is simply due editing and updating content. Let’s say for example a site has 700 pages or posts with 150 revisions on each, this would be over 100,000 entries in the database. To delete unnecessary revisions you can use the following command line:

wp post delete $(wp post list --post_type='revision' --format=ids) --force

I have posted the question also to WordPress.org forum here for discussion and #cli channel. Hopefully someone comes up with the answer 🙂 Also sent it to Eric. Maybe he knows.

1. Nov 2019 |

How to remember

When I do coding tasks for school I find really cool solutions and wonderful workarounds from time to time. I wonder how should I remember all this. How should I archive and structure all this knowledge. Should it be like learning a language where I should prepare learing cards (for vocabulary) to remember basic things by heart. Like what goes where when I need to append something to a list.