Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - petteriIII

Sivuja: 1 2 [3] 4 5 ... 31
41
Moni ei varmaan tiedä mikä on "Teletype"...   :)

Sitähän minun ensimmäinen tietokoneeni käytti kun siinä ei ollut näyttöä eikä näppäimistöä. Muistiakin oli peräti 640 sanaa, mutta olihan siinä nelinkertainen laajennos.

42
Ubuntun kehitysversio / Vs: Ubuntu 17.04 Zesty Zapus
« : 26.11.16 - klo:05.07 »
Mikähän tekee sen että kehitysversiolla on aika yleistä se että Live:nä se toimii ja asennuskin onnistuu, mutta kovalevyltä se ei boottaa? Näytönohjainhan sen täytynee olla, mutta kun koneissani ei yhdessäkään ole näytönohjain-korttia vaan esimerkiksi intelin piiri emolevyllä. Nytkin kolme dailya peräkkäin on epä-toiminut noin.

43
Ubuntun kehitysversio / Vs: Ubuntu 17.04 Zesty Zapus
« : 24.11.16 - klo:11.56 »
Zapukseni päivitti itsensä boottaamattomaksi ja kahtena päivänä uusi dailyä ei ole toiminut. Onpa odottavan aika pitkä.

44
Ubuntun kehitysversio / Vs: Ubuntu 17.04 Zesty Zapus
« : 10.11.16 - klo:10.39 »
Pääpalvelin on käytössä, mutta proposed:it ei sillä käytän jatkuvasti tätä Zesty Zapus:ta. Luuloa ja toivoahan se kyllä vaan on että niin on paras.

45
Ubuntun kehitysversio / Vs: Ubuntu 17.04 Zesty Zapus
« : 10.11.16 - klo:05.05 »
Eilisiltana tuli noin 50M:aa päivitettävää. Tänäaamuna normaalipäivitys tarjosi vain osittais-päivitystä jota en hyväksynyt vaan menin Synapticiin päivittämään, muta Synaptic kieltäytyi - oli kai liian mahdoton päivitettävä sillekin. Päivitin sitten komentoriviltä. Ihme että onnistui. Pitänee kuitenkin hakea uusi daily parin päivän kuluttua.
- kai niillä amerikaanoilla oli nyt muutakin hommaa kuin laittaa kunnollisia päivityksiä.

46
Yksi helppo osaratkaisu on:  kirjaudu sisään vieraana - se ei kysy salasanaa. Eihän se käytössä kiva ole, mutta selvittää sen toimiiko Ubuntu ylipäätään vai vierastaako vain salasanaasi.

- kirjautuminen vieraana: paina ensin nappulaa nuoli_alas ja sitten enter.
- tosiaan: tuo yläpalkissa oleva valaistun neliön sisällä oleva: fi   koettaa väittää että käytössä on suomi-näppis. Kuitenkin saattaa olla ettei koneeseesi ole asennettu kaikkia kielipaketteja jolloin kone ei käsitä itseään skandien ja erikoismerkkien suhteen. Muistaakseeni silloinkin pääsee kirjautumaan sisään kun näpäyttää tuota kirjainryhmää: fi  ja avautuvasta valikosta näpäyttää: Suomalainen
- entä aukeaako pääte kun painat Ctrl-Alt-f1  ? Siellä voit ainakin kokeilla minkä merkin saa mistäkin nappulasta. Löydät ehkä haluamasikin.

47
pitäisi onnistua käskyllä':
Koodia: [Valitse]
cd kansio; ls  | rename 's/string_//g'
- mutta tämmöset joukkonimeämiset  ovat vaarallisia, sillä jo kirjoittaa jotakin väärin niin saa kasan sutta ja sekundaa. Ota varmuuskopio ensin.

48
boottauskyvynpalautus käyttäen ainoastaan live-Ubuntua

Teoriassa verkkosivuilla olevat skriptit voi leikata-liimata live-Ubuntun pääteeseen sellaisenaan - tällöin skriptille ei tarvitse myöntää suoritusoikeuttakaan. Käytännössä skriptejä ei saa toimimaan tällätavoin esimerkiksi:
1. terminaalin skriptikielenä on Dash ellei toisin määrätä. Dash eroaa Bash:ista niin vähän että useimmat Bash-skriptit toimivat Dash:issa ihan hyvin mutta jotkut skriptit eivät. Terminaali määrätään käyttämään Bash:ia käskyllä: #!/bin/bash. Määräyksen: #!/bin/bash eteen täytyy kirjoittaa välilyönti.
2. skriptit toimivat sittenkin vain useimmiten. Sillä jonkun tulkin bugin vuoksi myös Bash vaatii että joskus muidenkin lauseiden eteen täytyy lisätä välilyönti - ilmeisesti kuitenkin vain pääohjelmassa ja siellä voi lisätä kaikkien lauseiden eteen välilyönnin. Mutta funktioihin ei tarvitse koskea. Saavathan ne välilyönnit siellä rivien alussa olla valmiiksikin sillä eivät ne toimintaan vaikuta, mutta skriptin voi aina leikata-liimata mikäli lauseiden edessä on välilyönti. Ja mikäli rivien alussa ei ole välilyöntejä niin skripti ei aina toimi ennenkuin rivien eteen lisää välilyönnin käyttäen esimerkiksi gedit-editoria antamalla käsky: gedit. Liimaa teksti sinne. editoi sitä ja leikkaa koko teksti uudestaan ja liimaa päätteeseen. Mutta geditissäkin ainoastaan editointi toimii mutta talletus ei, joten kun boottaat niin menetät kaiken.
- suomenkielisen näppiksen saa näin: näpäytä yläpalkista neliötä jossa lukee EN ja avautuvasta valikosta: TextEntrySettings... ja avautuvan tekstineliön vasemmasta alakulmasta + . Avautuvaa valikkoa selataan kunnes esiin tulee: Finland jota näpäytetään ja sitten näpäytetään ADD. Valikot suljetaan ja näpäytetään taas yläpalkissa neliötä EN ja avautuvasta valikosta näpäytetään FI .
- verkkosivulla olevasta koodista ei näe onko sen lauseiden edessä välilyönnit vai ei.
3. live-Ubuntussa ei ole kaikkia niitä sovellus-ohjelmia jotka normaali-koneessa on. Sovellus-ohjelmien lisääminen live-Ubuntuun on mahdollista mutta siinä on melkoinen työ.
4. interaktiivisuus katoaa - esimerkiksi kun skripti kysyy jotakin niin se odottaa vastausta väärästä paikasta joten skripti jää ikuisesti odottamaan vastausta.


Todetaksesi että tämä toimii voit ajaa boottauskyvynpalautus-skriptin - sillä on hyvä kokeilla monipuolisuutensa takia. Siis koko koodin voi liimata-leikata yhtenä palana live-Ubuntun päätteeseen - suoritusoikeutta ei tarvitse antaa. Boottauskyvynpalautus-skriptin hakeminen UbuntuFoorumin sivuilta ja sen:
1. Boottaa live-Ubuntulla ja avaa sen verkkoyhteys (verkkoyhteys avataan ihan samallatavoin kuin normaalistikin, elikä napauttamalla yläpalkista verkkokuvaketta ja .... )
2. Avaa selain, kirjoita selaimen hakukenttään: ubuntu
3. avautuvasta valikosta valitse ubuntu suomi ja siellä näpäytä UbuntuYhteisö - keskustelualueet.
4. Kirjoita UbuntuSuomen hakukenttään: boottauskyvynpalautus ja paina enter. Hetkenkuluttua avautuvasta ikkunasta näpäytä: Ohjeita shell-skriptaukseen
-  hakukenttiä on kaksi. Se oikea kenttä on se alempi.
5. Paina Ctrl-f ja kirjoita: boott
-  maalaa alempana oleva harmaa koodikenttä.
-  maalaaminen tapahtuu näin: kohdista hiiriosoitin kopioitavan alkuun ja paina hiiren vasen nappi alas. Pitäen nappia alhaalla siirrä hiiriosoitin kopioitavan loppuun jossa voit päästää hiirinapin ylös.
6. Paina ensin Ctrl-c , sitten paina Ctrl-ALT-T ja pääteikkunan auettua paina: SHIFT-Ctrl-v . Heti alkaa tapahtua joten pistä näppisi taskuun.
-  siis esimerkiksi Ctrl-ALT-t tehdään näin: ensin nappulat Ctrl ja ALT alas ja pitäen niitä alhaalla painetaan kirjainnappulaa t
Koodia: [Valitse]
#!/bin/bash
# 1.1.2016 petteriIII.
# Tämä päivitys-skripti paivittää kovalevyltä sen kaikki Ubuntut (ja monet muutkin Linuxit). 105
# bootata voidaan mistä halutaan, eikä merkitse mitään jos jommassakummassa on EFI tai vaikka molemmissa.
# päivitys-skripti voi myös sijaita joko päivitettävässä tai päivittävässä. Päivitys-skripti kannattaa ajaa boottaus-välineen nautiluksella käyttäjätilassa.
# Jos salasanaa kysytään on se boottaus-välineen salasana; jos on bootattu live-versioon ei salasanaa kysytä ollenkaan.
# Btrfs-tiedostomuoto vaatii päivitys-skriptiin muutoksia.
# Kun on bootattu live-versiolta täytyy verkkoyhteys luoda ensin; live-versiossa verkkoyhteys luodaan samallatavoin kuin kovalevyllä olevassa.
# Kun on bootattu live-versiolta korjataan kovalevyn kaikkien liittämättömien osioiden levyvirheet ennen päivitystä.
# Ennen päivitystä yritetään poistaa kaikki päivityksen esteet ja turhista roskista pyritään eroon.
# Jos koneessa on lukemattomia turhia imageja saattaa kestää pitkäänkin poistaa ne, mutta muuten päivitys toimii lähes yhtä nopeasti kuin tavallinenkin päivitys.
function KirjoitaOhje { echo '- ennen päivittämistä kannaattaa sulkea muut ohjelmat.
- aluksi kysytään salasanaa ettei sitä kysyttäisi sitten toiminnan aikana keskenkaiken. Salasana on kovalevyllä toimittaessa oma
  salasanasi ja muistitikulla toimittaessa se on ubuntu jos sitä edes kysytään.
- toimiva internet-yhteys on välttämätön; live-versioiden verkkoyhteys asennetaan aivan samoin kuin normaalistikin - muistitikun asetukset säilyvät mutta cd:n ei.
- kovalevyosiot tarkistetaan ja yritetään korjata lukuunottamatta sitä osiota jolla on bootattu. Windows on kylläkin kantona kaskessa.
- roskikset tyhjennetään, vain viimeinen image jätetään ja päivityksen esteitä poistetaan.'; }
function tarkistaKovalevyjenKaikkiOsiot () {
read -t 5 -n 1 -p 'jos haluat tarkistaa kovalevyn perusteellisesti paina jotain kirjainta; silloin tarkistus kestää jonkinverran kauemmin mutta tarkistaa paremmin.' apu
echo
for osio in $(sudo blkid | grep -v swap | awk '{print $1}' | sed 's/\://g'); do
  [[ $(echo $osio | grep loop) ]] && continue
  sudo fsck -MVCaf $osio ||   sudo fsck -MVCac $osio
  echo ""
done
# live-tikku saattaa aiheuttaa virheviestin:There are differences between boot sector and its backup.
}
function unmountmnt { # if grep -qs '/mnt/foo' /proc/mounts; then
cd / # umount ei onnistu, jos joku umountattavan kansio on valittuna
sudo echo ""
for mountattu in $(sudo mount | grep /mnt | awk '{print $3}')
do
  if grep -qs $mountattu /proc/mounts; then sudo umount -l $mountattu; fi
done
echo '/mnt:n mountit on poistettu'
}
function Levy {  echo -n $(ls -l /dev/disk/by-id | grep -m 1 '/'${Chrootosio##*/} | awk '{print $9}' | sed "s/-part*//g") ;}
function paivitaKaikkiOsiot () { # itseensä chroottaus onnistuu ihan kivasti joten tällätavoin voi ihan hyvin päivittää itsensä
unmountmnt
for Chrootosio in $(sudo blkid | grep -v swap | grep -v vfat | awk '{print $1}' | sed 's/\://g'); do
  # [[ $( mount | grep $Chrootosio) ]] && echo && echo $Chrootosio'ohitettu' && echo && continue # hypätään seuraanaan loopissa
  osiontyyppi=$(sudo blkid -o value -s TYPE $Chrootosio)
  sudo mount -t $osiontyyppi $Chrootosio /mnt
  [[ -d /mnt/boot/grub ]] && [[ $(cat /mnt/boot/grub/grub.cfg | grep menuentry.*Ubuntu ) ]] &&  {
  sudo cp -L /etc/resolv.conf /mnt/etc/ ######################################### koe 21.10.16
  sudo mount -t sysfs none /mnt/sys &&  sudo mount -t proc proc /mnt/proc && sudo mount --bind /dev/ /mnt/dev &&  sudo mount --bind /dev/pts /mnt/dev/pts && sudo mount -o bind /etc/resolv.conf /mnt/etc/resolv.conf && sudo mount -o bind /dev/shm /mnt/dev/shm && sudo mount --bind /proc /mnt/proc
  echo; echo -n '********** päivitetään: '$Chrootosio '   levyllä: '; Levy; echo '     tiedostomuoto: '$osiontyyppi; echo
  [[ -d /mnt/home/$(env | grep USER)/.local/share/Trash ]] && sudo rm -rf /mnt/home/$(env | grep USER)/.local/share/Trash # poistaa roskikset kaikilta osioilta joiden käyttäjä on sama kuin se jonka tililtä päivitä-skriptiä ajetaan eikä eriliskodin roskisia tyhjennetä koskaanfunction  käskynlähde() ( set -o pipefail;
[[ $(type $1  2> /dev/null | grep sisäänrakennettu ) ]] && echo sisäänrakennettu ||
which "$@" | xargs -r readlink -f | xargs -r dpkg -S ;
(( $? )) && echo -n käskyä ei ole asennettu mutta se löytyy paketista: &&
apt-cache search $1 | awk '{print $1}' | grep -w ^$1 ;); käskynlähde agrep
:
  # Kohdekoneen muistin vapauttaminen ei helpota tätä ohjelmaa. Kohdekoneen siistimisen syy onkin se, että kohdekone pärjäisi tulevaisuudessa itsekseen.
  sudo chroot /mnt tune2fs -m 1 $Chrootosio # rajoittaa pääkäyttäjälle varattua kovalevytilaa yhteen prosenttiin.
   for n in $(ls /mnt/boot | grep config | grep -v $(ls /mnt/boot | grep config | sort | tail -1) | sed 's/config-//g'); do
    sudo chroot /mnt apt-get --yes  purge 'linux-image-'$n
    sudo chroot /mnt apt-get --yes  purge 'linux-image-extra-'$n # turha lause, mutta muistutuksena siitä mitä tapahtuu.
    sudo chroot /mnt apt-get --yes  purge 'linux-headers-'$n
  done # Mikäli et halua poistaa imageja kommentoi nämä 5 riviä
  # seuraavia kommentointeja poistetaan kun haetaan vikaa jos päivitys-skripti toimisi joskus virheellisesti; ei toistaiseksi ole tarvittu
  #sudo fuser -cuk /var/lib/dpkg/lock; sudo rm -f /var/lib/dpkg/lock   
  #sudo fuser -cuk /var/cache/apt/archives/lock; sudo rm -f /var/cache/apt/archives/lock
  sudo chroot /mnt rm -f /var/cache/apt/archives/lock /var/lib/aptitude/lock /var/lib/dpkg/lock /var/lib/apt/lists/lock
  #sudo chroot /mnt rm /var/lib/apt/lists/*$; sudo rm /var/lib/dpkg/lock$; sudo rm /var/cache/apt/archives/lock # pitäiskö siirtää alkuun?
  sudo chroot /mnt apt-get check # korjaa pakettivaraston riippuvuudet
  sudo chroot /mnt dpkg --force-confnew --configure -a
  sudo chroot /mnt apt-get --yes  --fix-broken install
  sudo chroot /mnt apt-get --yes  autoclean
  #sudo chroot /mnt apt-get --yes  clean # poistaa myös osittaiset_ja_vahingoittuneet paketit ja tekee toiminnan varmemmaksi, mutta hidastaa ellei verkkoyhteys ole tosinopea.
  sudo chroot /mnt apt-get --yes  autoremove
  # jos jossain vaiheessa kun vahingoittueen paketin nimi selviää saa sen poistettua: sudo dpkg --remove -force --force-remove-reinstreq paketin_nimi
  sudo chroot /mnt rm -f /var/crash/* # poistaa tehdyt raportit etteivät ne jatkuvasti kiusaisi. Jos ne kiusaa sittenkin: sudo gedit /etc/default/apport ja kirjoitta 0
  sudo chroot /mnt apt-get update
  [[ $(env | grep USER.*=ubuntu) ]] && sudo chroot /mnt apt-get -y upgrade || sudo chroot /mnt apt-get -y dist-upgrade
  # $($Chrootosio | sed -r 's/[0-9]+$//g')
   sudo chroot /mnt update-grub && echo -n 'grub.cfg sijoitettiin levylle: '; Levy
} # vastaava avaava sulkumerkki on rivillä 38
unmountmnt
done
}
# Pääohjelma
# echo ${0%} | tr "/" " " | awk '{print $(NF-2)}';read
#[[ $(lsb_release -i | grep Ubntu$ ) ]] && echo tämä on standardi Ubuntu joten jatketaan || echo tämä ei ole stardardi Ubuntu ja jatkaminen saattaa olla vaarallista. Vain vastaamalla: kyllä jatketaan. Haluatko välttämättä jatkaa? && read apu && [[ $apu != kyllä ]] && exit || echo jatketaan kun lupa saatiin
 KirjoitaOhje
 echo ''; sudo echo
 hommaalkoi="$(date +%s)"
 tarkistaKovalevyjenKaikkiOsiot # sitä osiota jolta on bootattu ei tarkisteta.
 paivitaKaikkiOsiot
 echo -e 'päivitetty: '$(date +"%d-%m-%y %k:%M")'\t ja päivittäminen kesti sekunneissa: '$(($(echo $(date +%s)-$hommaalkoi)))
:
**
Koska BASH:ilta puuttuu kirjastot tulee sen alkeellisistakin käskyistä usein todella hankalia eikä niiden laatu päätä huimaa. Esimerkiksi: Efi_osio voi sijaita millä osiolla hyvänsä, ei sen levyn ensimmäinen osio tarvitse olla. Kun halutaan tietää mikä laitenimi on sillä efi-osiolla jota osio /dev/sda6 käyttää niin se saadaan tietää käskyllä:
Koodia: [Valitse]
function laitenimeä_vastaava_levy () { echo ${1##*/} | sed -r 's/[0-9]+$//g' ;}
function levyn_efi_osio () { sudo fdisk -l | grep EFI | grep $(laitenimeä_vastaava_levy $1) | awk '{print $1}';}   # funktiosta voidaan kutsua toista funktiota
levyn_efi_osio  osion_laitenimi    # siis esimerkiksi: levyn_efi_osio /dev/sda6
- muuten se keno-viritelmä jota usein käytetään jotta saataisiin käskyn esitys selväpiirteiseksi onkin yleensä turha ja hankalan-näköinen sillä esimerkiksi tässä nuo kolme lausetta voi kopioida päätteeseen yhtenä palana - perään joutuu kylläkin painamaan return. Voit kopioida päätteeseen vaikka tuhatrivisen skriptin ja perään painaa return yhden kerran.
**
Siitäkin tämä BASH on kiva että kaikessa on ikuisesti parannettavaa ja parantaminen on yksinkertaista. Jokatapauksessa seuraavassa on tärkeää funktion muodostustapa. Muodosta: funktio {}  siirrytty muotoon: funktio () .
- kaarisulut muodostavat funktiolle oman prosessin joten funktion asetukset eivät saastuta muuta skriptiä:
Koodia: [Valitse]
function  käskynlähde() ( set -o pipefail; [[ $(type $1 | grep sisäänrakennettu ) ]] && echo sisäänrakennettu || which $1 | xargs -r readlink -f | xargs -r dpkg -S ; (( $? )) && echo käskyä ei ole ;); käskynlähde käskyn_nimi
- itseasiassa sekin on täysin selvää että testi on: (( $? )) eikä [[ $? ]] sillä tottakai vertailun pitää olla aritmeettinen. Kestipä pikään tajuta.

Nyt alkaa parantelu mennä alueelle jossa en osaa kunnolla testata, mutta toiminto olisi todella tarpeellinen jos sen vaan saisi toimimaan virheettömästi (saattaa toimiakin mutta en ole läheskään varma):
- selvitystä: käsky ei välttämättä löydy käskyn nimen mukaisesta paketista niinkuin esimerkiksi käsky: ls . Paketin nimi täytyy selvittää kulman takaa.
Koodia: [Valitse]
function  käskynlähde() ( set -o pipefail;
[[ $(type $1  2> /dev/null | grep sisäänrakennettu ) ]] && echo sisäänrakennettu ||
which "$@" | xargs -r readlink -f | xargs -r dpkg -S ;
(( $? )) && echo -n käskyä ei ole asennettu mutta se löytyy paketista: &&
apt-cache search $1 | awk '{print $1}' | grep -w ^$1 ;); käskynlähde agrep
:

- leikka-liimaa kaikki käskyn rivit kerralla - ei koodiin tarvitse laittaa kenoja vaan toimii se ilmankin
- kun käsky on kerran toiminut niin painamalla nappia nuoli ylös saat koko käskyn historiasta yhtenä rivinä ja voit kirjoittaa agrep:in tilalle ls tai echo tai xargs tai mitämielitkin.
- agrep on muuten käyttökelpoinen: se etsii samankaltaisia kuin mitä määrätään.
**
Taas kertaalleen aloin kehittää menetelmää jolla saisi tulostettua päätteessä käskyn antamishetkellä määriteltyjen muuttujien nimet ja arvot:
Koodia: [Valitse]
apu=$(echo ' '${!a*}' '${!b*}' '${!c*}' '${!d*}' '${!e*}' '${!f*}' '${!g*}' '${!h*}' '${!i*}' '${!j*}' '${!k*}' '${!l*}' '${!m*}' '${!n*}' '${!o*}' '${!u*}' '${!v*}' '${!w*}' '${!x*}' '${!z*}\
' '${!y*}' '${!A*}' '${!B*}' '${!C*}' ' ${!D*}' '${!E*}' '${!F*}' '${!G*}' '${!H*}' '${!I*}' '${!J*}' '${!K*}' '${!L*}' '${!M*}' '${!N*}' '${!O*}' '${!P*}' '${!Q*}' '${!R*}' '${!S*}' '${!T*}\
' '${!U*}' '${!V*}' '${!W*}' '${!X*}' '${!Z*}' '${!Y*}  | sed 's/ /\n$/g' | sed '/$\B/d' | sed '/$apu/d' | grep [[:lower:]] | tr [[:space:]] ¤) && (echo $apu | tr ¤ '\n';\
 eval echo $apu | tr ¤ '\n') > /tmp/delme && awk '{a[NR]=$0; i=NR}END{i=i+i%2;for(m=1;m<=i/2;m++) print a[m]"    "a[m+i/2]}' /tmp/delme | column -t
- tämän käskyn voi liittää skriptiinsä tai tehdä esimerkiksi näin: ensiksi tyhjennät päätteessä määritellyt muuttujat käskyllä: "exec bash"  ja sitten esimerkiksi: a=1 ja: b=2 jonka jälkeen annat edelläkuvatun käskyn. Se tulostaa:
$a   1
$b   2
- alle 10ms nopeus on BASH-skriptille erittäin suuri sillä tavanomaisin menetelmin ei saa 200ms nopeampaa aikaiseksi.
- nopeus ei myöskään riipu muuttujien lukumäärästä mikä on BASH-skriptille erikoista.     
- muuttujissa saa olla välilyöntejäkin eikä muuttujia silti tarvitse laittaa sulkuihin - mutta kyllä sulutkin saa olla.
- mikäli jokin muuttuja on määritelty mutta sillä ei ole arvoa näkyy tämä listauksesta.
- matriisista näytetään vain jäsen 0.
- awk on BASH:iakin monipuolisempi ja vaikeampi erittäin nopea skripti-kieli. Tuossa edellisessä se hoitaa tulosteen muotoilun mikä on se hidas ja vaikea osa. Tuo awk-osa on niin nopea ettei sen lisääminen tunnu edes vaikuttavan - Perl ja Python eivät missään nimessä pääse edes samaan. Awk kärsii aivan sama/media/petteri/tikku/OMATSKRIPTITsta kuin BASH:kin ja ne molemmat kärsivät samasta kuin assembler: ihan liian työläitä - vaikka ovatkin tarvittaessa tosi- nopeita.
Muuten: skriptien muuttujien nimissä pitää olla ainakin yksi pieni kirjan - yksinomaan suurilla kirjaimilla kirjoitetut ovat BASH:in omia muuttujia.
**
Assosiatiivisen matriisin kirjoittaminen levylle, sen lukeminen levyltä ja sen tulostaminen.
- matriisin nimi ja koko voivat olla mitä hyvänsä.
- muuten matriisit sorttaavat itsensä automaattisesti, joten lukujen järjestys muuttuu. Mutta osoitteet ovat aina samassa järjestyksessä kuin arvotkin.
- esitän tämän sillä se kertoo miksi bash:ia mollataan: esimerkiksi tämä matriisin tallettaminen: jos meitä pyydetään tekemään  skripti matriisin tallettamiseksi niin luultavasti tehtävä yritetään ratkaista  tekemällä skripti joka tallettaa matriisin? Totaalisen idioottimaista, vain opin saanut voi sortua moiseen.  Sensijaan tietämätön saattaa ajatella niinkuin tässä: matriisi on jo bash:in muistissa ja sen kuva muistissa on yksi tekstijono. Mikäli talletetaan tämä tekstijono niin homma on tehty ehdottomasti moitteetta - se normaalitapa sensijaan on buginen ja hidas kuin .... Näin on bash:issa aina: paljon puhuvan suupielet ovat ruskeat, niin minun kuin myös professorien.

Bash:issa assosiatiivisen matriisin voi siirtää funktioon globaalialueella mutta palautus ei globaalialueen kautta assosiatiivisena matriisina toistaiseksi onnistu. Palauttamisen voi kuitenkin tehdä "normaalina" matriisina. Sillä sekä "normaalin" että assosiatiivisen matriisin muistikuvat ovat samanlaisia ja kun siirretään muistikuva niin on bash:ista kiinni tulkitseeko se matriisin muistikuvan "tavallisena" vai assosiatiivisena.
Koodia: [Valitse]
#!/bin/bash
declare -A matriisi # assosiatiivinen matriisi siirtyy globaalialueella funktioon päin mutta palauttaminen ei onnistu noinvain. 181

function talleta_matriisi () { echo $(declare -p | grep "declare -A".*$1  | cut -d= -f 2-) > /tmp/delme ;} # assosiatiivisen matriisin muistikuva RAM:missa talletetaan levylle.

function tulosta_matriisi () { ( echo -n 'jäsenten arvot   : '; eval echo \${$1[*]}; echo -n 'jäsenten osoitteet : '; eval echo \${!$1[@]} ) | column -t ;}

# muodostetaan koematriisi:
matriisi[ykkönen]=yksi
matriisi[555]=2
matriisi[17]=3
matriisi[2]=4

talleta_matriisi matriisi
unset matriisi; declare -A matriisi # unset nollaa matriisin joten voi olla varma että matriisi on luettu levyltä. Mutta unset vie samalla assosiative-statuksen joten se täytyy palauttaa. Lauseen voi kommentoida
eval matriisi=$(cat /tmp/delme)     # assosiatiivinen matriisi muodostetaan uudelleen levyltä luetun muistikuvan mukaan. Erillistä funktiota levyltä lukemiseen ei edes tarvita
tulosta_matriisi matriisi
 

49
Skriptiajurista tuli uusi versio sillä edellisen version erikoistoiminnoissa oli paljon korjattavaa.
- vähän uuttakin, esimerkiksi skriptien tulosteet talletetaan nyt ja niitä voi käydä katsomassa painamalla nappulaa insert ja valitsemalla halutun kerran tuloste.

- skriptiajurin haku omalle koneelle:
1. näpäytä Ubuntu-foorumilla latauslinkkiä: OMATSKRIPTIT.tar.bz2 ja talleta. näpäytä latauslinkkiä Skriptiajuri (kopio).tar.bz2  ja talleta.
2. mene oman koneesi nautiluksella oman koneesi lataukset-kansioon (tai joskus lataus on mennyt kotikansioon)  ja siellä näpäytä: tiedostoa OMATSKRIPTIT.tar.bz2 ja avautuvasta pura ja avautuvasta taas pura ja lopeta. Näpäytä tiedostoa Skriptiajuri (kopio).tar.bz2 ja avautuvasta pura ja avautuvasta taas pura ja lopeta.
3. kotikansioosi on muodostunut OMATSKRIPTIT kansio ja käynnistin nimeltään Skriptiajuri. Siirrä käynnistin työpöytä-kansioon jos sellaista löytyy.
- kun tuplanäpäytät käynnistintä niin skriptiajuri käynnistyy.
- voit siirtää *.tar.bz2-kuvakkeet roskikseen.
- kun haluat päästä eroon skriptiajurista siirrä OMATSKRIPTIT ja käynnistin roskikseen; silloin skriptiajurin muistokin katoaa.
**
- taisinpa keksiä kuinka lyhyet viiveet saa mitattua tarkemmin skriptiajurissa: skriptin suoritusaika nimittäin riippuu siitä ajetaanko skripti omassa prosessissaan vai siinä mikä on jo auki. Sillä prosessin luominenhan kestää aina; milloin enemmän ja milloin vähemmän - joten luotaessa prosessi väärään aikaan skriptin mitattu toiminta-aika on liian suuri ja lisäksi aika vaihtelee kerrasta toiseen enemmän kuin ennen. Käytännössä korjaus aiheuttaa sen että "nollaskripti - siis kun skriptin käsky on kaksoispiste" kestää nykyään myös skriptiajurissa tosiaan 0 ms eikä 2-4ms. Skripti:
Koodia: [Valitse]
read -t 1
kestää myöskin oikean ajan eli 1.000 sekuntia.
**
- skriptiajuri on myös kirjailijan unelmatyökalu sillä kaikki tehdyt muutokset tallentuvat ja kun huomaa ettei muutos ollutkaan parannus niin vanhoista versioista on helppo palauttaa se mikä oli parempaa.
**
- skriptiajurin backup:ista ei tarvitse huolehtia sillä skriptiajuri kirjoittaa välittömästi kaikki muutoksensa USB-muistitikulle jos muistitikulla on kansio OMATSKRIPTIT. Muistitikun OMATSKRIPTIT kansio voi olla tyhjäkin jolloin sille kirjoitetaan koko kansio OMATSKRIPTIT.
- ominaisuuden saa toimimaan myös SSH:n yli.
- backupin tekeminen kestää skriptiajurin kannalta 2ms.
- USB-portissa voi olla muistitikku tai ei ja sillä voi olla kansio OMATSKRIPTIT tai ei ja se saa sijaita missä USB-portissa tahansa.  Backup toimii kaikille käyttäjille, eikä backupin toiminta ei riipu muistitikun nimestä,
  tiedostomuodosta eikä mistään muustakaan, vaan jopa FAT32 toimii samoinkuin NTFS mikäli ajuri löytyy.
- niin pientä muistitikkua ei olekaan ettei se riittäisi, eikä sillä ole väliä minkätyypin USB se on. Siis on mahdollista käyttää monimutkaistakin backup-menetelmää usealle muistitikulle.
- muistitikulla olevasta OMATSKRIPTIT-kansiosta ei koskaan poisteta mitään vaan ainoastaan lisätään. Tällätavoin menetellen siellä on enemmän myös roskaa, mutta toisaalta sellaista vikaa ei voi tulla että 
  jotain katoaa edes melkoisen hölmöilyn seurauksena. Muistitikulla olevan  OMATSKRIPTIT-kansion koon kasvaminen ei aiheuta ongelmia.
**
- työskentelyä arkistossa helpotettu merkitsemällä mitkä koodeista ovat käännöskelpoisia. Muutos näkyy myös skriptejä tehdessä.
**
BASH:illa voi tehdä koodin mihintahansa tehtävään mutta on turhaa hakea kirjoista mitenkä monimutkaisemmat hommat tehdään. Vihjeitä suoritustapaan kerätään sieltätäältä kunnes jossain vaiheessa saa mielikuvan kuinka asioiden täytynee olla. Mutta jos tekee skriptinsä ilman kehitysympäristöä on mahdotonta kokeilla onko mielikuva oikea, sillä kokeilemisen aikana asiasta valmistuu lukemattomia yritelmiä ja usein kehittäminen johtaa pitkiin umpikujiin joista pitää perääntyä sinne jossa tapahtui jotain oikeinkin. Mutta koska usein välissä on useampia pitkiä umpikujia ja aikaakin on kulunut viikkotolkkua niin et enää muista edes sitä  missä se "jotenkin toimiva" on ja on vaara että se alkuperäinen hento aavistus katoaa.

Skriptiajuri tallettaa kaikki koodit, mutta mikäli tekee paljon skriptejä niin etsiessään vanhoista koodeista mikä on se oikea kuluu aikaa tolkuttumasti sillä on vaikea etsiä sellaista jota ei pysty tarkasti kuvailemaan. Mutta vaikka koodia ei muistakaan niin sen muistaa mitä se tulosti - muistaa ainakin suurinpiirtein ja jokatapauksessa sehän kertoo jo paljon että koodi ylipäätään tulosti jotakin. Koska skriptiajuri tallettaa myös kaikki tulosteet ja kun selaa vanhoja tulosteita niin voi palauttaa koodin joka on tulosteen tehnyt.
**
Skriptiajurin kaikkia viestejä (siis myös sovellusohjelmien kirjoittamaa) voi lukea avaamalla vasemman laidan pystypalkista sen pääte ja rullahiiren rullalla saa tapahtumia seurattua olipa niitä kuinka paljon vaan.
- jos skripti romahtaa niin se ei juuri koskaan vie skriptiajuria eikä päätettä mennessään joten päätteestä näkee mitkä tapahtumat skriptin romahtamisen aiheuttivat.
- seuraamisen jälkeen saa vasemman puolen pystypalkista palattua sinne mistä lähdettiin.
- tai nautiluksella voi tiedostojen sisällön muuttumista  tarkkalla reaaliaikaisesti.
**
Aloinpa taas kokeilla sed:illä ja awk:illa ja esimerkiksi tämmöistä tuli esimerkkejä soveltaaen; ei näitä kokeilla tarvinnut sillä ne toimi heti:
Koodia: [Valitse]
sed "2s/$/ $(sed -n '7p' file1)/" file2  # selitys: tulosta file2 lisäten sen rivin 2 perään file1:n rivi 7
awk '{ if ($3&&/höh/) print $3 }' file   # selitys: tulosta kenttä 3 file:n riviltä 3 jos rivillä 3 on sana jossain sana höh

ja kun nämä kaksi naitetaan saadaan:
sed "2s/$/ $(awk '{ if ($3&&/höh/)print $3 }' file1)/" file2 # selitys: tulosta file2 lisäten sen rivin 2 perään file1:stä rivin 2 kenttä 3 mikäli file1:n rivillä 2 on jossain sana höh
- /$/ on: lisää perään ja /^/ on: lisää alkuun; myös välilyönnin paikkaa voi vaihtaa tai jättää pois. Ja kaikkia "numeroita" voi muuttaa. Tai lisääminen voidaan muuttaa korvaamiseksi kirjoittamalla /$/ paikalle esimerkiksi: /[[:alpha:]]/
- sekä sed että awk ovat skripti-kielinä pätevämpiä kuin BASH. Tässäesitetyt ovat yksirivisiä sed ja awk skriptejä, mutta on niitä monirivisiäkin. Kummmallakin on vaikea saada aikaiseksi toimivia skriptejä, mutta oikealla opastuksella melkein mihin käyttöön tahansa voisi tehdä nopeastitoimivan skriptin liikoja ponnistelematta. Joku semmoisen avustamana kuin skriptiajuri.
**
Ainakin minut saa raivoon mikäli jokin tekemäni katoaa ja sen joutuu "keksimään" uudestaan - vaikka uusi viritelmä olisi sangen todennäköisesti parempi eikä sen tekemiseenkään menisi kovin pitkää aikaa. Mutta otsasuonet kyllä olisivat haljenneet ja sen kadonneen etsimiseen  kulunut kohtuuton aika. Luulin skriptiajurin automaattisen backupin tehneen katoamisista mahdottomuuden ja niinhän se on tehnytkin. Vaan pahimmat katoamiset ovatkin sellaisia että koko skriptiajuri korvautuu jollakin skriptiajurin vanhalla versiolla esimerkiksi asennettaessa Ubuntu uudestaan ja kun kopioidaan sinne skriptiajuri jota luullaan viimeiseksi. Tällöin automaattinen backup backup:paa muistitikunkin muitakin skriptejä siihen kuntoon ettei viimeistä versiota osaa etsiä oikeasta paikasta elikä muistitikun arkistosta.
- jos automaati-backuppia ei halua käyttää niin riittää kun millään koneessa kiinniolevalla muistitikulla ei ole kansiota OMATSKRIPTIT. Mutta ei sillä kannata päätään vaivata sillä ei se tuhoa mitään, lisää vaan.

Jotta skriptiajurikaan ei enää voisi korvautua vanhalla versiolla niin ihan skriptiajurin alussa tarkistetaan ovatko kovalevyn tiedot vanhempia kuin muistitikulla - ja jos on niin kehoitetaan ihan ensiksi kopioimaan OMATSKRIPTIT- kansio muistitikulta.  Koska kyseessä on varautuminen todella harvinaiseen tilanteeseen niin tarkistus ei saa kestää kuin muutaman millisekunnin. Tämän toteuttaa esimerkiksi:
Koodia: [Valitse]
function varmista_että_kovalevyn_OMATSKRIPTIT_on_uudempi_kuin_muistitikulla_oleva () {Kone liittää USB-muistitikut /media-kansioon. Liitospiste muodostetaan kun USB-porttiin laitetaan muistitikku ensimmäisen kerran jonka jälkeen sen muodostama kansio ei poistu eikä sen omistaja enää vaihdu. Siis kyse on minkälaisen tikun laitat USB-porttiin ensimmäisellä kerralla - liitoskansio saattaa siis olla juuren omistuksessa vaikka se onkin käyttäjän nimellä. Tästä ei välttämättä ole haittaa mutta sotkuja se voi aiheuttaa.

Kansio /media on tarkoitettu liitoskansioksi esimerkiksi USB-muistitikuile ja sen pitäisi olla heti boottaamisen jälkeen tyhjä. Kuitenkin kansio on normaali kansio jossa voi olla tiedostojakin ja joskus kone nyrjähtää sellaisella tavalla että liitetty kansio siirtyy fyysisesti /media-kansion sisällöksi. Ja tällöin automaatti-backup:in päiväys menisi sekaisin sillä bacup toimisi vaikka muistitikkua ei olisikaan - kyllä se silti muistitikunkin päivittää jo se löytyy.
Kone tietää koska kansiossa /media on normaalejakin tiedostoja: käskyllä ls tulostuvat kaikki mitä siellä on ja käskyllä mount tulostuvat vain liitetyt, joten jos listattuja on enemmän kuin liitettyjä niin kansiossa on silloin normaalejakin tiedostoja.
kovalevynaika=$(stat /home/$USER/OMATSKRIPTIT --printf="%Y\n")      # aika sekunneissa Linuxin luomisesta 1.1.1970
muistitikunaika=$(stat /media/$USER/*/OMATSKRIPTIT --printf="%Y\n") # tuo * käy läpi kaikkien USB-porttien muistitikut jotta löytyisi se jolla on OMATSKRIPTIT-kansio.
(( $kovalevynaika < $muistitikunaika )) && echo -e "kovalevyn OMATSKRIPTIT on vanhempi kuin muistitikulla oleva, kovalevyllä se on:\n"$(date -d@$kovalevynaika)"   ja muistitikulla:\n"$( date -d@$muistitikunaika)"  Kannataisi ehkä kopioida muistitikun OMATSKRIPTIT-kansio kovalevylle." && read && exit;}
Mutta tämä ei ihan riitä, vaan sen bacup-rutiinin perään täytyy kirtjoitaa käsky: "touch ~/OMATSKRIPTIT" elikä kirjoittaa kovalevyn OMATSKRIPTIT-kansion viimeksi muutosajaksi nykyhetki.

Automaattinen backup aiheuttaa muuten sen että kun päivitettään skriptiajuri niin aikaisemmin sillä tehdyt skriptit ja kaikki arkistot löytyvät edelleen muistitikun OMATSKRIPTIT-kansiosta joten ne saa kaikki palautettua antamalla käskyn:
Koodia: [Valitse]
for n in $(ls /media/$USER); do [[ -d /media/$USER/$n/OMATSKRIPTIT ]] && rsync -au  /media/$USER/$n/OMATSKRIPTIT ~; done
**
Kovalevyllä olevia skriptejä voi ajaa silloinkin kun on bootannut muistitikulta:
- boottaa muistitikulta.
- mene nautilukseen.
- yläpalkkiin tulee: files   files. Näpäytä hiiren oikealla oikeanpuoleista "files" ja avautuvasta alasvetovalikosta valitse "Preferences" ja sieltä "Behaviour" ja siirrä täppä valintaan: ask what to do.  Sulje tämä ikkuna.
- nautiluksella navigoi ajettavan skriptin kansioon ja näpäytä skriptiä ja avautuvasta valikosta näpäytä "run in the terminal". ( Muuten navigointi alkaa näpäyttämällä: Other locations)

Myös kovalevyllä olevaa skriptiajuria voi ajaa kun on bootannut muistitikulta.  Se ei kuitenkaan toimi noinvain sillä:
Ajettaessa skriptiajuria Live-Ubuntulla muodostaa Live-Ubuntu liitospisteen sille medialle jolla skriptiajuri on ja tähän liitospisteeseen täytyy viitata kun skriptiajuri tekee jonkun levy-operaation. Lisäksi koska skriptiajurista saattaa olla kopioita monessakin paikassa  yhtaikaa niin skriptiajurin kanta (joka on skriptiajurin koti-kansio) muodostetaan seuraavasti:
- mikäli omassa kotikansiossa on skriptiajuri niin käytetään sitä.
- ellei  omassa kotikansiossa ole skriptiajuria niin käytetään sitä skriptiajuria jonka OMATSKRIPTIT-kansio on viimeiseksi päivitetty. Koodina tämä on:
Koodia: [Valitse]
kanta=''; kanta=$([[ -d /home/$USER/OMATSKRIPTIT ]] && echo "/home/$USER" || apu=("$(find  /media -maxdepth 4  | grep -w OMATSKRIPTIT | grep -v OMATSKRIPTIT/ | grep -v \(*\) )") &&\
 for n in ${apu[*]}; do echo $(stat -t $n | awk '{print $13" "$1}'); done | sort -k1 -n | tail -1 | awk '{print $2}' | sed 's/\/OMATSKRIPTIT//')
- mutta tiedostojen ja kansioiden luku-, kirjoitus- ja poisto-oikeudet ovat erilaiset kun käyttäjä on joku ihminen tai live-Ubuntu ja tämä aiheuttaa joskus vaikeuksia ellei jyrää omistusoikeuksia. Käytännössä tämä näkyy siina että live-Ubuntua käytettäessä jotkut tiedostot ovat lukittuja. Siirry tällöin "sudo nautilukseen" ja laita kaikki omistusoikeudet avoimiksi kaikille. Mutta toisaalta Live-Ubuntulla on kokoajan päälläoleva sudo-oikeus elikä se ei koskaan kysy salasanaa - tiedoksi muuten, että joskus erittäin harvoin kysyy, ja silloin se on: ubuntu.
**
Skriptiajuri tarkastelee nyt omaa toimintaansa ja kirjoittaa alussa tapahtumia botanneen levyn tiedostoon: /tmp/skriptiajuri , jotta skriptiajurin kaatuessa syytä olisi helpompi etsiä.
Koska kirjastoja kehitetään jatkuvasti saattaa niiden koodiin lipsahtaa virhe joten niiden koodi täytyy todeta toimivaksi niiden lataamisen yhteydessä ja mikäli kirjasto ei toimi tästä ilmoitetaan ja toiminta keskeytyy.
- muuten näiden tarkastelujen tuloksia voi selata hiiren rullalla kun ollaan pääte-tilassa (silloi siis kun näytetään tiedostolistausta). Kyseessä on siis dmesq jota ei tarvitse kutsua.
**
Live-Ubuntulla ei nykyään voi olla omaa talletustilaa johon voisi sijoittaa OMATSKRIPTIT-kansion ja ajaa skriptiajuria sieltä. Kuitenkin kun on bootattu Live-Ubuntulla voi skriptiajuria ajaa toiselta muistitikulta joten kiintolevyllä ei välttämättä tarvitse olla OMATSKRIPTIT-kansiota jotta skriptiajuria voisi ajaa. Tai skriptiajurin kautta MidnightCommanderia.
**
Meni koko päivä backup-toiminnan parantamiseen. Katselin illalla päivän saavutuksia ja taas kertaalleen havaitsin ne mitättömiksi. Mutta noinhan se on aina: kun katselee valmista työtä niin ihmettelee kuka idiootti voi edes kuvitella että mikään muu onnistuisi. Pari seikkaa tuli esiin:
- kone liittää USB-muistitikut /media-kansioon. Liitospiste muodostetaan kun USB-porttiin laitetaan muistitikku ensimmäisen kerran jonka jälkeen sen muodostama kansio ei poistu eikä sen omistaja enää vaihdu. Siis kyse on minkälaisen tikun laitat USB-porttiin ensimmäisellä kerralla - liitoskansio saattaa siis olla juuren omistuksessa vaikka se onkin käyttäjän nimellä. Tästä ei välttämättä ole haittaa mutta sotkuja se voi aiheuttaa.
- kansio /media on tarkoitettu liitoskansioksi esimerkiksi USB-muistitikuile ja sen pitäisi olla heti boottaamisen jälkeen tyhjä. Kuitenkin kansio on normaali kansio jossa voi olla tiedostojakin ja joskus kone nyrjähtää sellaisella tavalla että liitetty kansio siirtyy fyysisesti /media-kansion sisällöksi. Ja tällöin automaatti-backup:in päiväys menee helposti sekaisin sillä bacup toimisi vaikka muistitikkua ei olisikaan - kyllä se silti muistitikunkin päivittää jo se löytyy.
Kone tietää koska kansiossa /media on normaalejakin tiedostoja: käskyllä ls tulostuvat kaikki mitä siellä on ja käskyllä mount tulostuvat vain liitetyt, joten jos listattuja on enemmän kuin liitettyjä niin kansiossa on silloin normaalejakin tiedostoja.
**
Kaikkien skriptien toiminnassa on yksi yhteinen piirre: vaikka yleensä onkin yhdentekevää millaisessa koneessa skripti toimii niin usein olisi mukavaa saada se helposti selville - ja joillain harvoilla skripteillä se on "pakko". Skriptiajuri hoitaa  ottaa aina selville koneen piirteitä mutta tulostaa ne sellaiseen paikkaan joka normaalisti on näkymättömissä. Esimerkiksi: laita skriptiajuri toimimaan ja heti alkuun pyöritä hiiren rullaa. Näkyviin tulee tietoja koneesta. Näyttö muuttuu normaaliksi heti kun teet jotakin muuta, esimerkiksi painat nuoli-näppäintä.
- skriptiajurin näyttöä voi aina selailla oltaessa pääte-tilassa. Siellä on muunmuassa kaikki ne viestit mitä skriptisi on tehnyt: enää ei tarvitse pähkäillä että mikä viesti siellä näytössä vilahti vaan voi mennä katsomaan. Näitä viestejä voi olla kymmeniä sivuja.
**
Kun skriptiajuria käytetään skriptien tekemiseen niin koska tekemisen muut piirteet ovat hallussa jää skriptien tekemisen tehokkuus eniten riippumaan siitä kuinka tehokasta on komentorivin käyttö. Ja komentorivin käyttämisen nopeus riippuu eniten siitä kuinka osaa käyttää historiaa - mutta bash:in omasta historiasta haku elikä käsky ctrl-r on käyttökelvoton. 
- selvitys: komentoriviä täytyy käyttää että saataisiin jokainen käskyrivi testattua yksikseen sillä rivien testaaminen valmiissa skriptissä on tosihidasta - valitettavasti niin on joskus pakko tehdä.
 
Skriptiajurissa on toiminto: etsi tiedostosta: ~/.bash_history jolloin historiatiedot esitetään kerran ja sitä samasta hakutuloksesta haetaan kunnes ollaan tyytyväisiä. Historiatiedot pysyvät kokoajan samassa järjestyksessä, eikä vähänväliä suoriteta samaa hakua uudestaan joka lisäksi sekoittaa järjestyksen. Lisäksi haku käyttää kunnon hakumoottoria kuten esimerkiksi grep:iä regex:än tukemana, haku voi alkaa etsittävän alusta, keskeltä tai lopusta, haku ei aina onnistu ensimmäisellä haulla jolloin edellisen haun hakutermin voi seuraavassa haussa palauttaa skriptiajurin historiasta ja editoida sitä ...
**
Tällätavoin tutkittavia tiedostoja on kymmeniä ja mikäli niille kaikille tekisi valintaan oman kohdan tekisi se valinnasta sotkuisen, eikä isosta joukosta ei ole mukava valita jos samassa paikassa tehdään valintoja toisentyyppisillekin asioille. Kysymys on siitä, että valinnoissa on aina hyvä olla joku arvo joka valitaan mikäli painetaan enter edes lukematta valintoja. Tämä oletusarvonhan voi muuttaa joka valinnassa siihen mikä valitaan. Nopeaa ja tosiaan toimii mikäli valintapaikassa on ainoastaan samankaltaisia asioita sillä käytännössä sama asia valitaan montakertaa uudelleen ennenkuin homma on selvä.

Täytyi siis tehdä geneerinen "mistä tiedostosta haluat valita" . Näin alkuunsa valintoja on vain muutama, mutta niitä on helppo lisätä käynnin aikana rajattomasti - ja siis tällä valinnalla on oma oletusarvo
Siis täytyi tehdä rakenteet valintalistan levyltä lukemiseksi, valintalistan dynaamisesta muuttamisesta ja muutetun valintalistan tallettamisesta levylle. Myös "oletusvalittavan" lukemisestalevyltä, muuttamisesta  ja tallettamisesta levylle tulee huolehtia. 
**
yhtaikaa voi olla käynnissä monta skriptiajuria: yksi näyttää OHJEITA, toinen on kokoajan erikoistoiminnoissa, kolmas skriptinteossa ja neljäs dokumenttia väsäämässä. Kuitenkin homma edellyttää liikaa näpräämistä jotta itsekään innostuisin - sen toimimisen olen tarkistanut jo ja käytössäkin se saattaisi olla ihan käyttökelpoinen menetelmä kun vaan viitsisi harjoitella. Mutta kunnon koneet ja 4k-näytöt muuttavat koko asetelman, sillä jokainen skriptiajuri olisi yhtaikaa näkyvissä ja niiden välillä voisi kopioida.




50
BASH:ille on maailmalla monia päteviä kirjastoja, mutta ei ole mitään helppoa tapaa saada niitä käyttöönsä. Mutta ilman kirjastoja BASH:illa tehdyt skriptit ovat kymmeniä kertoja turhan hitaita ja toimivat miten sattuu. BASH on surkea - koska siltä kehitetään olemattoman vähän, se on tulkattu kieli ja ennenkaikkia koska sillä ei ole kirjastoja. Ja vaikuttaa siltä että jossakin pelätään BASH:ia ja kirjastojen käyttöä pyritään estämään.

Nimenomaan matriisien käsittely kaipaa kirjastoja sillä matriisien käsittelemistavat ovat käytännölle vieraita. BASH:in matriiseilla on monia erikois-ominaisuuksia, mutta niitä erikoisominaisuuksia ei nykyään osata hyödyntää joten missään niitä ei käytetä. Itseasiassa ne ovat kuitenkin käyttökelpoisia, joten ne kannattaa aina huomioida - ja "kirjasto-skriptit" ottavatkin yleensä ne huomioon mutta itse ohjelmoidut eivät.

Otetaanpa esimerkki: skripti joka hakee matriisin jäsenen arvoa vastaavan osoitteen: BASH:issa matriisin jäsenten osoitteet voivat pomppia sinnetänne jättäen osoitteita väliinkin, samaa arvoa voi löytyä montakin eri osoitteissa ja ensimmäinen osoite voi olla mikähyvänsä positiivinen luku - ja assosiatiivisessa matriisissa osoite voi olla tekstiä. Näiden ominaisuuksien vuoksi eivät "normaalit" skriptit toimi hyvin etsittäessä jäsenen arvoa vastaavaa osoitetta - tai voihan se etsitty arvohan voi löytyä monestakin osoitteesta. Tässä yksi tiivis ja nopea ratkaisu jolla ei ole pahoja varjopuolia:
- mukana on testaamiseen sopivia matriisin-määrittelyjä
Koodia: [Valitse]
#!/bin/bash
function arvoa_vastaava_osoite () { apu=$( eval echo -e \${$1[@]} | sed 's/ /\n/g' | awk -v apu2=$2 '{if ($0==apu2) print NR" "}'); for n in $apu; do eval echo -e \${!$1[@]} | awk -v apu=$n '{print $apu}'; done ;}

declare -A matriisi2

matriisi1[7]=2
matriisi1[7777]=55
matriisi1[77]=12
matriisi1[888888]=eka
matriisi1[54]=12
matriisi1[17]=55
matriisi1=({1..32001}) # kokeillessa tämä lause voi olla kommentoitu tai ei

matriisi2[ykkönen]=eka
matriisi2[kakkonen]=toka
matriisi2[kolmonen]=kolmas
matriisi2[nelonen]=neljäs
matriisi2[tuntematon]=eka


time arvoa_vastaava_osoite matriisi1 1200 # kokeiltaessa on joko matriisi1 tai matriisi2. Etsittävää arvoa muutellaan myös
- BASH-loopit hidastavat aina paljon ja siksi tässä on vain yksi BASH-looppi, ja sekin käydään yleensä läpi vain kerran-muutaman kerran.
- 32000 rivisen matriisin käsittelyyn kuluu noin 85ms;  puhdasta BASH:ia olevalta skriptiltä kestää noin 220ms mutta sehän ei toimisikaan aina.
- ratkaisu, jossa on puhdasta BASH:ia sisältää viitisen kriittistä vikaa sen lisäksi että se on todella hidas.
- jos tämmöistä ei löydy kirjastosta niin ratkaisu on siirtyä käyttämään sellaista kieltä jonka kirjastosta löytyy.
**
Valtaosa muistakin tehokkaista matriisinkäsittely-menetelmistä ovat täysin käsittämättömiä. Niin on muissakin kielissä, mutta niissä ohjelmoinnin nämä osat ovat kirjastoissa. Esimerkiksi:
Koodia: [Valitse]
function matriisien_ero () { awk 'BEGIN{RS=ORS=" "} {NR==FNR?a[$0]++:a[$0]--}END{for(k in a)if(a[k])print k}' <(echo -n "${!1}") <(echo -n "${!2}") ;}
- awk on matriisien käsittelyyn ehdottomasti sopivampi kuin BASH - tosin awk:in voi ajatella kuuluvan BASH:iin. Se huono puoli awk:illa on että sen "numeromäärä" on vain noin 19 numeroa - gawk:issa tosin on rajoittamattoman tarkkuuden kytkin -M.
- tällekin voi antaa verrattaviksi assosiatiiviset matriisit.
**
Sleep-käsky on prantunut; esimerkiksi ennen yhden sekunnin viive oli ennen luokkaa 1.004 ja nykyään 1.0012. Mutta "read -t 1" on kymmenen kertaa parempi: 1.00014. Lyhyet viiveet olivat ennen varsin käyttökelvottomia, mutta nyt sata mikrosekuntia on 108 mikrosekuntia ja 10 mikrosekunnin viive on sillä 17 mikrosekuntia. Osoituksena tästä:
Koodia: [Valitse]
for n in $(seq -s " " 100000); do read -t 0.00001; done
kestää noin 1.83 sekuntia kun pitäisi kestää 1 sekuntia. Toinen virhelähde on tuo looppi joka myös aiheuttaa virhettä; luultavasti noin 0.2  sekuntia.

Jos tuommoisia 10-100 mikrosekunnin viiveitä tekee niin mihin niitä käytetään? Herra yksin tietää, mutta kyllä niille käyttöä aikanaan tulee kunhan päähän uppoaa se että homma on mahdollista.

Koska noiden pienten viiveiden kuluttama aika lasketaan karkeasti kuvattuna suorittamalla viive miljoonakertaa ja jakamalla kulunut aika miljoonalla niin ei olekaan varmuutta ettei kääntäjä oikaise ja kasvata ensin viivettä ja tee sitten yhtä mittausta tuolla lopullisella viiveen arvolla. Todetakseni ettei noin tapahdu tein skriptin - siinä pyörii yhtaikaa kaksi toisistaan riippumatonta prosessia:
Koodia: [Valitse]
#!/bin/bash
# tässä skriptissä on kaksi prosessia pyörimässä yhtäaikaisesti. Ensin omia aikojaan tiedoston lukuarvoa kasvattavava prosessi taustalla.
for (( n=0; n<=999999; n++ )); do echo $n > file1;done &

# ja sitten perään toinen looppi ottamaan tiedostosta näytteitä. Lukujen tulisi useimmiten kasvaa, mutta koska BASH on muutenkin ajallisesti horjahteleva niin eihän niin aina ole. Yleensä tämä ei edes tulosta kaikkia 30:tä; esimerkiksi
# jos ensimmäinen prosessi kirjoittaa juuri kun toinen haluaa lukea niin BASH lopettaa
apu1=0; apu2=0; for m in {0001..0030}; do read -t 0.$m apu; apu1=$apu2;apu2=$(cat file1); [[ $apu1 && $apu2 ]] && echo -n $(($apu2-$apu1))' ' ; done
kill $! # tapa viimeiseksi määrätty taustaprosessi - siis tuo jonka perässä on merkki &

tulostusrivi esimerkiksi: 14 15 24 31 45 49 50 59 52 59 61 63 65
- skripti ei yleensä tulosta näinkään montaa 30:stä puhumattakaan - esimerkiksi jos toinen prosessi kirjoittaa samaan aikaan kuin toinen haluaa lukea niin BASH lopettaa koko homman. Mutta jo vähäinenkin tulostus osoittaa sen että viive tosiaan muuttuu sillä yleensä arvot kasvavat kokoajan.
- Jos haluaa aloittaa 10mikrosekunnista niin toinen looppi muutetaan muotoon for m in {00001..00030}
**
Taas kertaalleen piti laittaa toiminnan suorittamiselle ehdoksi se että erään muuttujan arvo on nolla. Siis ihan samaa kuin jo aikoinaan piti oppia; mutta nyt vasta tuli mieleen että se tehdään aina hieman liian työläästi. Varmaankin useimmat muutkin tekevät sen väärin, sillä nopein ja yksinkertaisin tapa on:
Koodia: [Valitse]
(( $muuttuja )) || toiminta

Testi:
Koodia: [Valitse]
[[ $muuttuja ]] || toiminta
sitten puolestaan ei testaa onko muuttujan arvo 0 , vaan onko muuttuja aritmeettiselta arvoltaan määrittelemätön tai 'teksti-jono arvoltaan' tyhjä-joukko (elikä '')
**
Useissa BASH:in käskyissä on sisäänrakennettu erittäin nopea looppi. Esimerkiksi jokaisen a:n muuttaminen b:ksi tiedostossa nimeltään ohje sen jokaisella rivillä:
Koodia: [Valitse]
cat ohje | tr a b
- tr-käsky hyväksyy kuitenkin vain yksittäisten merkkien muuttamisen. Hankalinta on, että käsky:
Koodia: [Valitse]
cat ohje | tr ab cd
onnistuu, mutta se tarkoittaa: vaihda kaikki a:t c:ksi ja b:t d:ksi. Mikäli tiedostossa oleva tekstijono täytyy korvata toisella tekstijonolla niin seuraavantyyppinen pelkkää BASH:ia oleva käsky käy:
Koodia: [Valitse]
readarray matriisi < tiedoston_nimi ; echo "${matriisi[*]//mikä/miksi}"
- sed:issä, awk:issa ... ja monessa muussakin on vielä hieman nopeampi sisäinen automaattilooppi. Varsinkin awk:iin voi kyllä lisätäkin looppeja eikä se paljoakaan hidasta.
- myös regex-moottorissa on sisäiset nopeat automaattiloopit.
- erittäin harvoin BASH:iin kannattaa tehdä loopeja BASH-koodilla, ne ovat kymmeniä-satoja kertoja hitaampia kuin nuo käskyjen sisäiset loopit.

Skriptejä joissa ei ole BASH-koodisia looppeja löytyy melkeinpä mihinhyvänsä tilanteeseen, esimerkiksi: 
Alussa kirjoitettiin data-tiedosto nimeltään: 0
Sitten piti kirjoittaa uusi 0 - kuitenkin piti ensin uudelleen-nimetä olemassa-oleva 0 1:ksi.
Sitten piti taas kirjoittaa uusi 0 - kuitenkin piti ensin uudelleen-nimetä olemassaolevat 1:ksi ja 2:ksi.
Sitten piti taas kirjoittaa uusi 0 - kuitenkin piti ensin uudelleen-nimetä olemassaolevat 1:ksi, 2:ksi ja 3:ksi.
ja niin edelleen. "Normaaliskriptissä" on vilisemälla looppeja ja väliaikaistiedostoja ja se on tautisen hidas. Sellainen käsky uudelleen-nimeämiseen jossa ei ole BASH-kielisiä looppeja:
Koodia: [Valitse]
mikäli ollaan valmiiksi oikeassa kansiossa: rename 's/(\d+)/$1+1/ge' $(ls | sort -rg)
mikäli saatetaan olla väärässä kansiossa  : ( cd kansio_jossa_uudelleen_nimettävät_ovat; rename 's/(\d+)/$1+1/ge' $(ls | sort -rg ))
- 10.000 tiedoston uudelleen nimeäminen kesti 170ms. Myös awk/BASH-toteutus jossa awk tekee loopit ja BASH toteuttaa kestää 5600ms ja lisäksi "start, stop ja step" täytyy asetella.
- tätä kannattaa käyttää jos vain mahdollista sillä nuo muut ovat kovalevylle todella rasittavia ja yksikin erehdys saa koko koneen vaikeaan tilaan.
Koodia: [Valitse]
awk -v a=$(ls | tail -1) 'BEGIN { while (a-->-1) string=string "mv " a+1" " a+2"\n"; print string }' | bash
ja vastaava silkkaa BASHia oleva käsky kestää noin 10 sekuntia, mutta toisaalta se on helpoiten räätälöitävissä: esimerkiksi seuraavassa tiedostonimien edessä on tekstiä, siis tiedostonimet ovat tässä seuraavanlaisia: data>numero<
Koodia: [Valitse]
touch data10001; for n in {10000..2}; do  mv data$n data$(($n+1)); done
Mutta kyse ei ole yksinomaan hitaudesta vaan siitä että esimerkiksi prosessorin kuormitus kasvaa liialliseksi kun kestoaika kasvaa kohtuuttomasti.

Mutta BASH on paitsi helpompi räätälöidä niin sillä voi myös laittaa tehtävän suoritukseen taustalle; siis voi jatkaa muiden hommien tekemistä melkein välittömästi. Mutta vaikka yhden tiedoston arvoja voi käyttää 10ms kuluttua niin kaikki tiedostot on käsitelty vain hieman nopeammin kuin tavallisesti.
- huomaa että tiedostojen nimet ovat: data1  data2 ... data10000 eikä pelkkiä numeroita. Kokelin toimintaa antamalla käskyt:
Koodia: [Valitse]
mkdir ~/koe; cd ~/koe
for n in $(seq -s " " 10000); do echo $n > data$n; done                                                                                                         # tämä lause muodostaa uudelleen-nimettävien tiedostojen joukon
time ( touch data10001; for n in {10000..1}; do  mv data$n data$(($n+1)) ; done & ) ; sleep 7.5; cat data10001; cat data2 # uudelleen-nimeäminen ja tuloksen tarkistus   
tulostaa: 10000 ja 1 niinkuin pitääkin ja nautiluksella katsoenkin kaikki on kunnossa. Tuo vähintään 7.5sekunnin sleep tuntuu olevan pakollinen jotta kumpikin lukema tulisi oikein - koska niitä uudelleen-nimeämisiä tehdään taustalla kokoajan.

Ensimmäinen tiedosto on kylläkin selvä jo 10ms kuluttua ja yksi lisää valmistuu aina vajaassa millisekunnissa mutta koko joukko siis vasta 7.5 sekunnin kuluttua.
- skriptiajurissa tiedostoja on noin paljon editoitaessa hankalimpia skriptejä. 

51
Alkuperäisestä viestistä oli tipahtanut edestä pois IFS=$'\n' . Jotta nimissä sallittaisiin välilyönnit. Perään olisi hyvä liittää: unset IFS
Siis käsky olisi pitänyt olla:
Koodia: [Valitse]
IFS=$'\n'; rsync -rlptvzs $(find ~/OMATSKRIPTIT -name "*" -type f -mtime -500) ~/Elisa; unset IFS

- ja nopeus on tosiaan vertaansa vailla - varsinkin jos kopiointi tehdään varmuuden vuoksi: kun halutaan olla varmoja siitä että kaikki on viimeistä versiota.
- nopeus on niin suuri koska vaikka koodi on BASH:ia niin koodin suoritus tapahtuu enimmäkseen C:ssä. BASH:issa toimiminen on hidastuu hirvittävästi suoritettavan rivimäärän kasvaessa - ja loopatessa erittäinkin. Luulisinpa että Perl ja Pythonkin ovat helisemässä näiden yksirivisten kanssa - eivätkä olekaan enää ylivertaisia.
- ja soveltamalla find:in miljoonaa optiota ja kytkintä voidaan räätälöidä toiminta melkein miksi halutaan. Tai rsynkata SSH:n yli.
- mutta tehtävän suorittaminen kuvatulla tavalla saattaa johtaa väärään tulokseen riippumatta siitä käytetäänkö kopiointiin rsync:ia, mv:tä, cp:tä tai jotakin muuta: mikäli tiedostopoluilla on samannimisiä tiedostoja kopioituu niistä vain yksi. Onhan se helppolukuista, ja mikäli kaikki halutaan saada lopputulokseen on rsync:in kytkimien pikku r muutettava isoksi R:ksi mutta se johtaa vaikeasti luettavaan lopputulokseen.

Kopioinnin rajoittimia:
Koodia: [Valitse]
Kopioinnin estäminen mikäli polulla on jokin merkkiryhmä:
IFS=$'\n'; rsync -rlptvzs $(find ~/OMATSKRIPTIT ! -path "*ARKISTO*" -type f -mtime -500) ~/Elisa; unset IFS

Kopioinnin estäminen mikäli kopioitavan nimi päättyy numeroon:
IFS=$'\n'; rsync -rlptvzs $(find ~/OMATSKRIPTIT ! -iregex ".*[0-9]$"   -type f -mtime -500) ~/Elisa; unset IFS

52
rsync -avt $(find mistä_kansiosta -name nimen_rajoitteet -type f -mtime -montako_vuorokautta_taaksepäin) mihin_kansioon

- minulla esimerkiksi: rsync -avt $(find ~/OMATSKRIPTIT -name "*" -type f -mtime -10) ~/Elisa
- mutta helposti näihin pikaisesti tehtyihin "skripteihin" tulee virheitä joita ei heti tajuakaan joten kokeile ensin jossain harmittomassa
- ja yksinkertaisempi skripti löytyy varmasti aina.

Lisätty 21.9.2016:
Näin siinä käy kun yrittää väsyneenä. Ilmeisesti välilyönnit hyväksyvä on:
Koodia: [Valitse]
rsync -rlptvzs $(find mistä_kansiosta_lähtien -name nimen_tarkenne  -type f -mtime -montako_päivää_taaksepäin) mihin_kansioon
esimerkiksi:
Koodia: [Valitse]
rsync -rlptvzs $(find ~/OMATSKRIPTIT -name "*" -type f -mtime -500) ~/Elisa

- laitoin sen tänne  väliaikaiseen talteen koska osaan ilmeisesti hävittää mitähyvänsä - tuntuu toimivan; täytyy tarkistella. Sivuvaikutuksiakin on: mikäli kopioitavassa tiedostopuussa on useampia joilla on eri polku mutta sama tiedostonimi niin vain yksi kopioituu. Kyllä tällä silti käyttöä on: nopeuttaahan tämä varsinkin isojen muuttumattomien tiedostojen kopiomisessa tai kun ei tiedä missä kansiossa kopioitava on.
- varsinkin find:illä on vielä miljoona parametria joten räätälöinti onnistuu melkein millaiseen tehtävään tahansa - jopa regex saadaan mukaan.
- ja nopeutta löytyy paljon - eiköhän Perl ja Pythonkin ole vaikeuksissa.

53
Ubuntu Suomi ja yhteisöt / Vs: Ubuntu Suomi hidastunut
« : 19.08.16 - klo:15.36 »
Vähän yli päivä sitten foorumin kuormitus nousi taas hirveän piikin ja 13-päiväisen normaaliuden jälkeen ja lisäksi alkoi pieni tahmailu. Kuorma ei ole tälläkertaa ihan yhtä suuri mutta muutakin otsarypistelyn aihetta on. En ole mode eikä minulla ole pääsyä foorumin lokitietoihin joten tarkemmin en tiedä.

54
No niinpä tietty. Minä en enää vuosiin ole ladannut tuota uutta versiota. Vaikka minulla on aina uusin niin tuollatavoin en sitä enää hanki ja en tajunnut että nythän se uusi tuli ja monet muut lataavat sen välittömästi.

Lopputoteamus: kuusi päivää sitä kesti kokoajan paheten ja kuormitus loppui yhtä äkillisesti kuin alkoikin. Eikä kyse tainnut olla lataaminen mistään syystä (Windowsin anniversary-update tulee myös mieleen) vaan eiköhän syy ollut se että joku kokeili paljonko foorumi kestää - tai jonkun pelleily.

Kolmetoista päivää tilanne oli melko normaali jonka jälkeen kuormitus alkoi äkillisesti uudestaan.

55
Kuormitus on käsittääkseeni kaksikertaa suurempaa kuin foorumin kultaisena vuotena 2014 parhaimmillaan ja tällähetkellä 8 kertaa suurempaa kuin normaalisti - alkoi kasvamaan eilen ja kasvaa kokoajan. Yksi paikka josta sen käyttäjätkin näkevät helposti on päiväkohtaisten tilastojen kohta osumat.  Osumista voi väittää etteivät ne kerro mistään mitään mutta kyllä ne kertoo jotakin.

Saattaahan kuormitus olla mitä vain ja loppua yhtä nopeasti kun alkoikin, mutta silti olisi kiva tietää mitä se on?

56
Siirsin foorumille SKRIPTIAJURISTA uuden version jossa Skriptiajurista on viimeisin versio ja Skriptiajurihiirelle toimii myös. En poista tuota edellistä versiota ennenkuin totean uuden version siirtyneen moitteetta.
- en ole tullut ajatelleeksikaan että tottakai jokainen haluaa säilyttää omat ARKISTO:nsa siirtyessään käyttämään uutta skriptiajuria. Täytyy jossain vaiheessa tehdä lisäosa siihen.

OMATSKRIPTIT on normaalisti kooltaan noin 100M. Mutta kun siitä poistetaan ARKISTO:t niin sen kooksi tulee noin noin 2M. Kun tämä tiivistetään nautiluksen *.tar.gz toiminteella tulee kooksi noin 600k joka mahtuu foorumille. Siirrettyäsi foorumilla olevan OMATSKRIPTIT.tar.gz-tiedoston omalle koneellesi siirrä se koti-kansioosi ja tupla-näpäytä sen kuvaketta ja muodostuvissa ikkunoissa näpäytä: pura.

ARKISTO:jen poistaminen ei juurikaan huononna Skriptiajurin toimintaa muuten kuin että se unohtaa kaiken mitä sillä on tehty - ja siirrettäessä ohjelma toisen henkilön käyttöön onkin vanhat jorinat syytä unohtaa. Mutta se haitta tästä on, että vaikka skriptiajuri toimiikin aivan kuten käyttöohjeissa kerrotaan niin se ei muista mitään vanhaa joten "oppimiskynnys" tulee korkeammaksi - tee muutamia skriptejä niin kyllä SKRIPTIAJURI alkaa hiljokseen toimia paremmin.
- alimman tason ARKISTO:ista osa on jäljellä, joten editoimalla SKRIPTIAJURIA itseään saat kuvan siitä millaiseksi editointi-ikkuna muodostuu.

Tehtyjä dokumentteja ei voi siirtää koska siirto veisi silloin liian paljon tilaa. Sensijaan jokainen huomio BASH:ista kannattaa aina tallettaa jonnekin, esimerkiksi OHJE-kansioon.Mutta minne sen talletaakin niin hakumoottorilla se löytyy.
- tee silti tekemistäsi skripteistä ainakin muutaman rivin dokumentti jossa esimerkiksi kerrot havaintojasi - tarvitset niitä muuten joskus itse.
**
Yhä useammin olen havainnut että arjen isohkotkin ongelmat ratkeavat usein yksirivisellä skriptillä - ja nämä yksiriviset skriptit eivät nopeudeltaankaan ole ihan surkeita. Mutta tuommoista yksirivistä on melko mahdoton tehdä heti alkaessaan skriptiä tehdä vaan kyllä kaikki skriptit ovat kehityksensä alussa moniriviä ja todella hitaita. Skriptiajuria voi käyttää koko kehityksen aikana - myös silloin kun skriptissä ei ole mukana edes riviä #!/bin/bash. Ja suoritusoikeuttahan skriptiajurin hallinnoimilla skripteillä ei ole koskaan.

Jokaisen skriptin voi kirjoittaa yhdelle riville, mutta en tarkoita tässä sellaisia. Vaan lyhyitä käskysarjoja joissa ei ole turhia hidasteita kuten esimerkiksi BASH:in omia looppeja.
**
Nopeus nousi taas vaikkei sillä nousulla tee enää mitään, skripti vain kiirehtii että pääsee odottamaan. Mutta onhan se teoriassa kivaa kun koodi samalla väheni.
**
Skriptiajurin paras ominaisuus on se ettei mitään tekemistään tarvitse harkita eikä mitään tarvitse muistaa, sillä pahin seuraus paniikki-kohelluksestakin on se että äskettäin tekemänsä joutuu tekemään osittain uudelleen. Ja käydä kurkkimassa edellisistä yrityksistä kuinka homma pitikään kirjoittaa sillä eihän BASH:in merkintätapoja muista. Kannattaa kuitenkin tallettaa työnsä vähänväliä ettei joutuisi kirjoittamaan pitkää litaniaa uudelleen.
- skriptaamisen merkittävin asia on puhua kaikista asioista niin pitkillä ja kuvaavilla nimillä että ne muistaa kuolemansa jälkeenkin. BASH itse puhuu arvoituksin mutta älä sinä puhu.
- nimissä kannattaa välttää erikoismerkkejä, ääkkösia ja välilyöntejä. Kuitenkin jos selvyys vaatii niin niitä täytyy käyttää mikäli BASH:in saa ne hyväksymään; vaikeuksia ei saa vältellä.
- tietysti skriptien tekeminen on nopeampaa jos muisti pelaa eikä koskaan kohella. Mutta jos ei muista edes perusasioita ja koheltaa vähänväliä tulee työskentelystä vain hirveän hidasta mutta eteneminen on kuitenkin varmaa.

57
- tuo alussa oleva crc-virhe kyllä viittaa RAM:miin.
- mutta silti: onko asennustikkusi varmasti kunnossa? Sillä asennustikut menevät herkästi vialle; jos esimerkiksi repäisee ne irti irroittamatta niitä ensin käyttöjärjestelmässä. Gparted:issa sen näkee: muotona pitäisi olla FAT.

58
Yleistä keskustelua / Vs: Versiopäivitys
« : 30.04.16 - klo:15.02 »
Jotain tuommoista sen täytyi olla. Mutta opinpa uutta: dist-upgrade:n peruminen - no ei oikeastaan vaan ainoastaan uuden kernelin poistaminen mikä taitaakin olla syynä useimmiten kun päivityksen jälkeen ei toimi.  Toiminta: boottaa vanhaan kerneliin ja poista synapticissa uudet kernelit. Anna senjälkeen käsky: sudo update-grub .  Senjälkeen bootti onnistuu vaikkei valitsisi mitään.
- ehkä kannattaa päivittää heti bootin jälkeen.
 

59
Yleistä keskustelua / Versiopäivitys
« : 27.04.16 - klo:18.02 »
Systeri päivitti koneensa uuteen versioon eikä kone senjälkeen enää bootannut. Kasasin uuden koneen tilalle mutta koska emolevy oli viitisen vuotta sitten käytöstä poistettu ja törkeän hidas niin koetin eikö siihen boottaamattomaan saisi elämänliekkiä. "Verta, hikeä ja kyyneleitä myöhemmin" selvisi että itse kone toimi mutta näyttö ei toiminut: näyttö näytti biosin ja grubin, mutta ei näyttänyt Ubuntua; näytön kun vaihtoi niin kaikki toimi.
- ehkä näytön grafiikkapiiri oli hajonnut?
- enpä tiedäkään: bios on tyyppiä EFI-bios. Eikö se ole graafinen?

60
Tattista vaan, tulipahan ryhmityksen tarve selville ja näin kantapään kautta tulleena sen muistaakin; tunnen itseni idiootiksi. Mutta pähkäillessäni noiden erilaisten regex:ien kanssa osoittautuikin että päivämäärä onkin parasta tarkistaa kuten sivulla: http://forum.ubuntu-fi.org/index.php?topic=303.msg386774#msg386774 kerrotaan.

- muuten vaikuttaakohan näihin kaikkiinkin se että skripti-kielenä käytän aina bash:ia mutta päätehän kai toteuttaa dash:ia?

Sivuja: 1 2 [3] 4 5 ... 31