From 834ed4b3e88b578a6b1e41348dae3a855df22ef5 Mon Sep 17 00:00:00 2001 From: Marko Korhonen Date: Sun, 3 May 2020 17:20:09 +0300 Subject: [PATCH] Continue writing report --- tex/.gitignore | 2 +- tex/biblio.bib | 37 ++++++++++++++++++++ tex/chapters/2-kielet.tex | 52 +++++++++++++++++++++-------- tex/chapters/3-projekti.tex | 23 ++++++++++--- tex/chapters/4-tulokset.tex | 4 ++- tex/code/Cargo.toml | 2 -- tex/code/macro.rs | 25 ++++++++++++++ tex/code/println.rs | 4 +++ tex/illustration/login-process.pdf | Bin 0 -> 47199 bytes tex/main.rtf | 0 tex/view.sh | 2 +- 11 files changed, 128 insertions(+), 23 deletions(-) create mode 100644 tex/code/macro.rs create mode 100644 tex/code/println.rs create mode 100644 tex/illustration/login-process.pdf create mode 100644 tex/main.rtf diff --git a/tex/.gitignore b/tex/.gitignore index 4d00985..a9c8245 100644 --- a/tex/.gitignore +++ b/tex/.gitignore @@ -17,4 +17,4 @@ *.ist *.out _minted-* -*.pdf +main.pdf diff --git a/tex/biblio.bib b/tex/biblio.bib index 2c2cecc..c671283 100644 --- a/tex/biblio.bib +++ b/tex/biblio.bib @@ -35,6 +35,15 @@ lastchecked = {24. Huhtikuuta, 2020} } +@article{rust:println, + title = {Macro std::println}, + journal = {}, + author = {Rust Team}, + year = 2020, + url = {https://doc.rust-lang.org/std/macro.println.html}, + lastchecked = {3. Toukokuuta, 2020} +} + @article{wiki:garbagecollection, title = {Automaattinen roskienkeräys}, journal = {}, @@ -53,6 +62,15 @@ lastchecked = {1. Toukokuuta 2020}, } +@misc{rust:macro-lisp, + title = {Lisp-like DSL for Rust language}, + url = {https://github.com/JunSuzukiJapan/macro-lisp}, + publisher = {}, + author = {JunSuzukiJapan}, + year = 2020, + lastchecked = {1. Toukokuuta 2020}, +} + @misc{rust:cratesio, title = {The Rust community's crate registry}, url = {https://crates.io}, @@ -80,6 +98,15 @@ lastchecked = {1. Toukokuuta 2020}, } +@misc{yew:router-problem, + title ={How to use the Router}, + url = {https://yew.rs/docs/concepts/router#how-to-use-the-router}, + publisher = {}, + author = {Yew Team}, + year = 2020, + lastchecked = {3. Toukokuuta 2020}, +} + @misc{webassembly:stdweb, title = {stdweb}, url = "https://docs.rs/stdweb/0.4.20/stdweb", @@ -124,3 +151,13 @@ year = 2019, lastchecked = {2. Toukokuuta 2020}, } + +@article{wiki:metaprogramming, + title ={Understanding WebAssembly text format}, + url = {https://en.wikipedia.org/wiki/Metaprogramming}, + journal = {}, + author = {Wikipedia contributors}, + year = 2020, + lastchecked = {3. Toukokuuta 2020}, +} + diff --git a/tex/chapters/2-kielet.tex b/tex/chapters/2-kielet.tex index cb05c37..af157ab 100644 --- a/tex/chapters/2-kielet.tex +++ b/tex/chapters/2-kielet.tex @@ -11,9 +11,11 @@ Automaattiselle roskienkeruulle on aikaisemmin ollut vaihtoehtona vain manuaalin Rustin yhtenä pääominaisuutena on mainostettu sen uudenlaista näkökulmaa muistinhallintaan: omistajuutta \cite{rust:ownership}. Siinä jokaisella arvolla on omistaja, ja kun omistaja menee näkyvyysalueen ulkopuolelle, niin menevät myös sen omistamat arvotkin, eli ne vapautetaan muistista. Arvojen omistajuutta voi siirtää joko pysyvästi tai väliaikaisesti lainaamalla. +\clearpage + \begin{code} \inputminted{Rust}{code/ownership.rs} - \captionof{listing}{Omistajuus} + \captionof{listing}{Omistajuus Rustissa} \label{code:rust:ownership} \end{code} @@ -87,7 +89,7 @@ Edellä mainittu tyyppi u8 on niin kutsuttu allekirjoittamaton kokonaisluku (eng \caption{Rustin kokonaislukutyypit ja niiden vaihteluvälit} \end{table} -Toisin kuin C- ja C++ -kielissä, Rustissa on oletuksena allekirjoittamattomien kokonaislukujen ylivuoto pois päältä. Tämä tarkoittaa sitä, että jos 8-bittisen allekirjoittamattoman kokonaisluvun (u8) arvo on esimerkiksi 256, siitä tulee 0. Rustin kääntäjä siis ei anna tällaisen tapahtua vaan kääntämisen yhteydessä tulee virheviesti: +\clearpage \begin{code} \inputminted{shell}{code/integer-overflow} @@ -95,6 +97,8 @@ Toisin kuin C- ja C++ -kielissä, Rustissa on oletuksena allekirjoittamattomien \label{code:rust:integer-overflow} \end{code} +Toisin kuin C- ja C++ -kielissä, Rustissa on oletuksena allekirjoittamattomien kokonaislukujen ylivuoto pois päältä. Tämä tarkoittaa sitä, että jos 8-bittisen allekirjoittamattoman kokonaisluvun (u8) arvo on esimerkiksi 256, siitä tulee 0. Rustin kääntäjä siis ei anna tällaisen tapahtua vaan kääntämisen yhteydessä tulee virheviesti, jonka voi nähdä koodiesimerkissä \ref{code:rust:integer-overflow}. + \subsection{Muuttumaton data} Rustissa kaikki arvot ovat oletuksena muuttumattomia (engl.\ immutable). Jos muuttumattoman datan sijasta tarvitsee muuttujia (engl. mutable), voi käyttää avainsanaa ''mut'', esimerkiksi \mintinline{Rust}{let mut name = "Marko"}. Myös lainaukset suoritetaan oletuksena muuttumattomasti ja muutettavan lainauksen voi tehdä samalla avainsanalla, esimerkiksi \mintinline{Rust}{say_hello(&mut name)} @@ -106,9 +110,7 @@ Rustia kehitettäessä on aina ollut tavoitteena luotettavuus. Tämä tarkoittaa Myös Rustin kääntäjään on panostettu paljon, ja virheiden sattuessa se on todella hyvä työkalu ohjelmoijalle. Se alleviivaa ongelmakohdat ja selittää lyhyesti, mistä ongelma johtuu. Jossain tapauksissa kääntäjä jopa antaa pieniä koodin pätkiä mistä voi olla apua ongelman ratkaisemisessa. \subsection{Paketinhallinta} -Rustin paketinhallinta on toteutettu Cargo-nimisellä ohjelmalla. Sitä voi käyttää koko ohjelmiston elinkaaren ajan aina projektin luomisesta sen julkaisemiseen. Cargon käsittelemiä paketteja kutsutaan laatikoiksi (eng. crate), jotka julkaistaan crates.io \cite{rust:cratesio} pakettirekisterissä. Laatikot voivat myös olla riippuvaisia toisista laatikoista. - -Laatikon tiedot ja riippuvuudet määritetään Cargo.toml tiedostossa. +Rustin paketinhallinta on toteutettu Cargo-nimisellä ohjelmalla. Sitä voi käyttää koko ohjelmiston elinkaaren ajan aina projektin luomisesta sen julkaisemiseen. Cargon käsittelemiä paketteja kutsutaan laatikoiksi (eng. crate), jotka julkaistaan crates.io \cite{rust:cratesio} pakettirekisterissä. Laatikot voivat myös olla riippuvaisia toisista laatikoista. Laatikon tiedot ja riippuvuudet määritetään Cargo.toml tiedostossa. \begin{code} \inputminted{TOML}{code/Cargo.toml} @@ -118,27 +120,51 @@ Laatikon tiedot ja riippuvuudet määritetään Cargo.toml tiedostossa. Cargoon on saatavilla myös useita liitännäisiä, esimerkiksi cargo-watch, joka suorittaa halutun toiminnon aina kun projektin sisällä tapahtuu muutoksia ja tässäkin projektissa käytetty cargo-web, joka helpottaa WebAssembly-ohjelmien kehittämistä. +\subsection{Makrot} +Yksi todella mielenkiintoinen ominaisuus Rustissa on makrot. Se on toiminnallisuus mikä mahdollistaa metaohjelmoinnin \cite{wiki:metaprogramming}. Metaohjelmoinnissa koodia voi generoida kääntämisen aikana, mikä on erityisen hyödyllistä esimerkiksi silloin, kun ohjelmoija tarvitsee useita toiminnalisuudeltaan samankaltaisia funktioita. + +\begin{code} + \inputminted{Rust}{code/macro.rs} + \captionof{listing}{Runsassanainen laskin toteutettuna Rustin makrona} + \label{code:rust:macro} +\end{code} + +Makron sisällä suluissa olevat lauseet ovat verrattavissa Rustin \mintinline{Rust}{match} -lauseeseen. Kun makron syöte vastaa jotakin näistä lauseista, hakasulkujen sisällä oleva koodi generoidaan. Makrossa käytetty \mintinline{Rust}{println!()} on myös itsessään makro, joka tulee Rustin ''std'' -kirjaston mukana. + +\clearpage + +\begin{code} + \inputminted{Rust}{code/println.rs} + \captionof{listing}{Rustin sisäänrakennettu println!() makro \cite{rust:println}} + \label{code:rust:println} +\end{code} + +Metaohjelmointi avaa aivan uudenlaisia mahdollisuuksia sille, mitä ohjelmointikielellä voi tehdä. Makroilla voi toteuttaa vaikka kokonaisen ohjelmointikielen \cite{rust:macro-lisp}. + \subsection{Dokumentaatio ja yhteisö} Rust on tunnettu todella laajasta dokumentaatiostaan ja vahvasta yhteisöstään. Molemmista on paljon apua varsinkin aloittejioille. -Aloitin itsekin opiskelemaan Rustia vain hieman ennen tämän opinnäytetyön alkua ja vahvasta yhteisöstä oli monesti apua. +Aloitin itsekin opiskelemaan Rustia vain hieman ennen tämän opinnäytetyön alkua ja yhteisöstä oli monesti apua projektin aikana vastaan tulleissa ongelmissa. \section{WebAssembly} WebAssembly \cite{webassembly:home} on kehitteillä oleva asiakaspuolen ohjelmointikieli. Sitä on suunniteltu JavaScriptin seuraajaksi ja sen suurimpana etuna JavaScriptiin verrattuna on huomattavasti matalamman tason esitysmuoto, minkä ansiosta se on suorituskykyisempi. Kehittäjän ei ole tarkoitus kirjoittaa WebAssemblya itse, vaan käyttää työkaluja, joilla olemassa olevia ohjelmointikieliä voi kääntää WebAssemblyksi. Rust on tästä hyvä esimerkki, sillä WebAssembly on yksi sen kääntäjän natiiveista ''targeteista'', samalla tavalla kuin vaikka x86-prosessorit. -WebAssembly on siis ensisijaisesti binääriformaatti, mutta sen voi muuntaa myös tekstiformaatiksi, jonka nimi on WebAssembly text \cite{webassembly:text}. WebAssembly text käyttää S-lauseita, joten se muistuttaa syntaxiltaan hyvin paljon Lisp-ohjelmointikieltä. +WebAssembly on siis ensisijaisesti binääriformaatti, mutta sen voi muuntaa myös tekstiformaatiksi, jonka nimi on WebAssembly text \cite{webassembly:text}. WebAssembly text käyttää S-lauseita, joten se muistuttaa syntaksiltaan hyvin paljon Lisp-ohjelmointikieltä. -\begin{code} - \inputminted{Lisp}{code/plus.wat} - \captionof{listing}{Lukujen yhteenlasku WebAssembly text -formaatissa} - \label{code:webassembly:plus} -\end{code} \clearpage +\begin{code} + \inputminted{Lisp}{code/plus.wat} + \captionof{listing}{Lukujen yhteenlaskufunktio WebAssembly text -formaatissa} + \label{code:webassembly:plus} +\end{code} + \begin{code} \inputminted{Rust}{code/plus.rs} - \captionof{listing}{Lukujen yhteenlasku Rustilla} + \captionof{listing}{Lukujen yhteenlaskufunktio Rustilla} \label{code:rust:plus} \end{code} + +WebAssembly textiä käytetään esimerkiksi debuggereissa. diff --git a/tex/chapters/3-projekti.tex b/tex/chapters/3-projekti.tex index 289d0c2..3351245 100644 --- a/tex/chapters/3-projekti.tex +++ b/tex/chapters/3-projekti.tex @@ -7,6 +7,8 @@ Palvelinpuolen kehykseksi valikoitui Actix web. Se on käytännössä vastine Ja Actix web on puolestaan rakennettu hyödyntämällä Actix -sovelluskehystä, mikä on rakennettu löyhästi actor-mallin pohjalta. Actor-malli\cite{wiki:actor} on Carl Hewittin vuonna 1973 luoma matemaattinen ja tietotekninen malli rinnakkaisajosta. Tämän ansiosta Actix web on hyvin suorituskykyinen ja helposti skaalautuva ratkaisu rajapintoja rakennettaessa. +\clearpage + Actix web on myös hyvin integroitu Rustin vahvaan tyypitykseen. Erityisen vaikuttavaa oli se, että esimerkiksi tietyn rajapinnan päätepisteen POST-pyyntöön pystyy määrittämään parametriksi tietyn rakenteen (eng. structure). \begin{code} @@ -23,7 +25,7 @@ Tällöin varmistutaan automaattisesti siitä, että kun asiakkaan POST-pyyntö \label{code:json:registeruser} \end{code} -Kun koodiesimerkin 7 funktioon ''register'' saapuu koodiesimerkin 8 mukainen JSON objekti, Actix huomaa väärän tyypin ja vastaa statuskoodilla ''400 Bad Request'', koska objektin parametri \mintinline{JSON}{"admin"} ei ole tyyppiä \mintinline{Rust}{bool}. +Kun koodiesimerkin \ref{code:rust:registeruser} funktioon ''register'' saapuu koodiesimerkin \ref{code:json:registeruser} mukainen JSON objekti, Actix huomaa väärän tyypin ja vastaa statuskoodilla ''400 Bad Request'', koska objektin parametri \mintinline{JSON}{"admin"} ei ole tyyppiä \mintinline{Rust}{bool}. \subsection{Todentaminen} @@ -37,9 +39,9 @@ Todentamiseen päätin käyttää JSON Web Tokeneita. JSON Web Tokenit ovat stan \label{code:json:jwt} \end{code} -Tämä tokenin sisältö on kaikkien sen hallussapitäjien nähtävissä. Turvallisuus tulee siitä, että token on allekirjoitettu palvelinpuolella vain palvelimen tiedossa olevalla salasanalla niin, että jos tokenin sisältö muuttuu yhtään, palvelin näkee että se ei ole enää validi. +Tämä tokenin sisältö on kaikkien sen hallussapitäjien nähtävissä. Tokenin turvallisuus tulee siitä, että token on allekirjoitettu palvelinpuolella vain palvelimen tiedossa olevalla salasanalla niin, että jos tokenin sisältö muuttuu yhtään, palvelin näkee että se ei ole enää validi. -Eli esimerkiksi jos joku tämän sovelluksen käyttäjä, joka ei ole ylläpitäjä, koittaa tehdä itsestään ylläpitäjän muuttamalla tokenista parametrin \mintinline{JSON}{"admin"}: \mintinline{JSON}{false} arvoksi \mintinline{JSON}{true}, palvelimella suoritettava JWT validointifunktio, joka tietää oikean salasanan, näkee että tämä tunniste ei ole validi. +Eli esimerkiksi jos joku tämän sovelluksen käyttäjä, joka ei ole ylläpitäjä, koittaa tehdä itsestään ylläpitäjän muuttamalla tokenista parametrin \mintinline{JSON}{"admin": false} arvoksi \mintinline{JSON}{true}, palvelimella suoritettava JWT validointifunktio, joka tietää oikean salasanan, näkee että tämä tunniste ei ole enää validi. Tokenin sisällön voi päättää kokonaan itse, vaikkakin joitakin standardeja kenttiä on määritetty, esimerkiksi iss (issuer), sub (subject) ja exp (expiration time). Päätin sisällyttää tiedon siitä, että onko käyttäjä ylläpitäjä, koska tätä tietoa voi sitten käyttää asiakaspuolella esimerkiksi käyttöliittymän muokkaamiseen käyttäjän roolin perusteella. Usein myös käyttäjän nimi sisällytetään tokeniin. Tokenin sisältöä suunnitellessa kannattaa pitää mielessä että sen sisältö on nähtävissä kaikille, joten se ei ole oikea paikka tallettaa salaista tietoa, kuten vaikka käyttäjän salasana. @@ -75,11 +77,22 @@ Olen JavaScript-maailmassa tottunut siihen, että käyttöliittymäkehyksiin lö \label{fig:login} \end{figure} +\subsection{Reititys} +Reititykseen käytin Yew:n liitännäistä, yew\char`_routeria. Reititys asiakaspuolen ohjelmassa tarkoittaa sitä, että selaimen osoitepalkissa olevan polun mukaan käyttäjä reititetään oikeaan ohjelman osaan. Tämä liittyy käsitykseen yhden sivun ohjelmista (eng. single page application), joissa selain suorittaa yhden ohjelman, jonka jälkeen perinteisiä sivujen latauksia ei enää tapahtu. Ohjelma muokkaa osoitepalkissa näkyvää osoitetta, jonka pohjalta sitten reititys oikeaan komponenttiin tapahtuu. + +Asiakaspuolen reititys vaatii myös palvelinpuolelta sen, että kaikki mahdolliset asiakaspuolen reitit palauttavat ohjelman. Toinen edellytys on se, että palvelin ei palauta uudelleenohjausta (HTTP 302), koska silloin myös osoitepalkissa oleva osoite muuttuu eikä sitä voida välittää asiakaspuolen ohjelmalle. + +Yritin pitkään toteuttaa tällaista logiikkaa palvelinpuolelle siinä onnistumatta, mutta onnekseni yew\char`_routerin esimerkeistä löytyi esimerkkikoodia tämän saavuttamiseksi käyttämäni palvelinkehyksen kanssa. Päädyin laittamaan kaikki palvelimen omat reitit polun \mintinline{shell}{/api/} alle, ja asiakaspuolen ohjelman juureen (\mintinline{shell}{/}). Sitten määritin ns. ''catch-all'' reitin, joka palauttaa asiakaspuolen ohjelman ilman uudelleenohjausta. Tämä on Actixissa nimeltään \mintinline{shell}{default_service}. + +\clearpage + +Myös yew\char`_routerin kanssa oli omat haasteensa. Alkuun en saanut sitä toimimaan ollenkaan, vaan kaikki kutsut ohjattiin ensimmäisenä määritettyyn reittiin, mikä oli tässä tapauksessa ''/''. Ongelman syyksi paljastui yew\char`_routerin Switch-komponentin kokoava ''to'' makro. Ratkaisuna oli reitin ''/'' makron \mintinline{Rust}{#[to = "/"]} siirtäminen viimeiseksi listassa. Tarkempaa tietoa tästä ongelmasta voi lukea Yew:n dokumentaatiosta \cite{yew:router-problem}. + \section{Ongelmat} Projektin loppuvaiheilla ilmeni muutamia ongelmia, mitä en ehtinyt enää ajan puutteen takia korjaamaan. -Palvelinpuolella keksin kokoava kirjasto, Actixin liitännäinen ''actix-identity'', kirjoittaa oletuksena keksiin parametrin \mintinline{JSON}{"HttpOnly": true}, mikä tarkoittaa sitä, että selain ei anna sen sisällä suoritettaville ohjelmille pääsyä tähän keksiin. Tämä on todella hyvä turvallisuusominaisuus, mikä estää haitallisia ohjelmia varastamaan käyttäjän kirjautumistietoja. +Palvelinpuolella keksin kokoava kirjasto, Actixin liitännäinen actix\char`_identity, kirjoittaa oletuksena keksiin parametrin \mintinline{JSON}{"HttpOnly": true}, mikä tarkoittaa sitä, että selain ei anna sen sisällä suoritettaville ohjelmille pääsyä tähän keksiin. Tämä on todella hyvä turvallisuusominaisuus, mikä estää haitallisia ohjelmia varastamasta käyttäjän kirjautumistietoja. -Suunnittelmana oli käyttää keksin tietoja asiakaspuolella reititykseen. Esimerkiksi jos keksiä ei ole olemassa, käyttäjä tulee reitittää sisäänkirjautumiskomponenttiin, missä keksi voidaan noutaa palvelimelta. Koska keksissä on tämä HttpOnly-parametri, tähän ei ole mahdollisuutta. Tämän parametrin voisi tietysti laittaa pois päältä, mutta ''actix-identity'' ei tarjoa tähän mitään mahdollisuutta. +Suunnittelmana oli käyttää keksin tietoja asiakaspuolella reititykseen. Esimerkiksi jos keksiä ei ole olemassa, käyttäjä tulee reitittää sisäänkirjautumiskomponenttiin, missä keksi voidaan noutaa palvelimelta. Koska keksissä on tämä HttpOnly-parametri, tähän ei ole mahdollisuutta. Tämän parametrin voisi tietysti laittaa pois päältä, mutta actix\char`_identity ei tarjoa tähän mitään mahdollisuutta. Yhtenä ratkaisuna tähän ongelmaan olisi käyttää JSON Web Tokenin tallettamiseen keksien sijasta selaimen LocalStoragea. Tämä vaatisi lisää työtä sekä asiakaspuolella että palvelinpuolella ja valitettavasti tähän ei jäänyt enää aikaa. diff --git a/tex/chapters/4-tulokset.tex b/tex/chapters/4-tulokset.tex index 9bc89e4..0bab5fb 100644 --- a/tex/chapters/4-tulokset.tex +++ b/tex/chapters/4-tulokset.tex @@ -1,3 +1,4 @@ +\clearpage \chapter{Tulokset} \begin{figure}[h] @@ -7,4 +8,5 @@ \label{fig:login} \end{figure} -Tuloksena syntyi yksinkertainen web-applikaatio, missä sekä asiakaspuoli että palvelinpuoli on toteutettu Rustilla. +Tuloksena syntyi yksinkertainen web-applikaatio, missä sekä palvelinpuoli, että asiakaspuoli oli toteutettu Rustilla. Kuvassa \ref{fig:login} on kuvattu kaikki kirjautumisprosessin vaiheet tässä projektissa. + diff --git a/tex/code/Cargo.toml b/tex/code/Cargo.toml index ea24dab..4bf0b73 100644 --- a/tex/code/Cargo.toml +++ b/tex/code/Cargo.toml @@ -4,8 +4,6 @@ version = "0.1.0" authors = ["Marko Korhonen "] edition = "2018" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] actix-web = "2.0.0" actix-rt = "1.0.0" diff --git a/tex/code/macro.rs b/tex/code/macro.rs new file mode 100644 index 0000000..8ce43f4 --- /dev/null +++ b/tex/code/macro.rs @@ -0,0 +1,25 @@ +macro_rules! laske { + (lisää $num1:literal ja $num2:literal) => { + println!("{} plus {} on {}", $num1, $num2, $num1 + $num2); + }; + (vähennä $num1:literal ja $num2:literal) => { + println!("{} miinus {} on {}", $num1, $num2, $num1 - $num2); + }; + (kerro $num1:literal ja $num2:literal) => { + println!("{} kertaa {} on {}", $num1, $num2, $num1 * $num2); + }; + (jaa $num1:literal ja $num2:literal) => { + println!("{} jaettuna {} on {}", $num1, $num2, $num1 / $num2); + }; +} + +laske!(lisää 10 ja 269); +laske!(vähennä 652 ja 3); +laske!(kerro 256 ja 2); +laske!(jaa 100 ja 50); + +// Tuloste: +// 10 plus 269 on 279 +// 652 miinus 3 on 649 +// 256 kertaa 2 on 512 +// 100 jaettuna 50 on 2 diff --git a/tex/code/println.rs b/tex/code/println.rs new file mode 100644 index 0000000..98b084b --- /dev/null +++ b/tex/code/println.rs @@ -0,0 +1,4 @@ +macro_rules! println { + () => { ... }; + ($($arg:tt)*) => { ... }; +} diff --git a/tex/illustration/login-process.pdf b/tex/illustration/login-process.pdf new file mode 100644 index 0000000000000000000000000000000000000000..95eb3379c2a4d55130375815d339a1d97e7a8ed8 GIT binary patch literal 47199 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 z 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/dev/null 2>&1 main.pdf trap finish EXIT