Áramkörtervezés az absztrakciótól a realizációig
BMEVIEEM371
Budapesti Műszaki és Gazdaságtudományi Egyetem
Bevezetés a Linux operációs rendszer alapjaiba Nagy Gergely Elektronikus Eszközök Tanszéke (BME)
2012. október 8.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
1 / 37
A Linux története
A Linux története
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
2 / 37
A Linux története
A UNIX
A UNIX A UNIX operációs rendszert az AT&T vállalat Bell laboratóriumában készítette el Ken Thompson és Brian Kernighan 1969-ben. Az első operációs rendszer volt, amit nem egy konkrét gép assembly nyelvén fejlesztették, hanem egy magas szintű nyelven, így lehetővé vált a rendszer egyszerű portolása más architektúrákra. A felhasznált magas szintű nyelv a C nyelv volt és ehhez a projekthez hozta létre Dennis Ritchie.
Thompson és Ritchie Nagy Gergely (BME EET)
Brian Kernighan A Linux alapjai
A trösztellenes törvény értelmében az AT&T nem forgalmazhatott szoftvereket, ezért a nyelvet és az operációs rendszert ingyenessé tették. 2012. 10. 08.
3 / 37
A Linux története
A GNU-mozgalom
A GNU-mozgalom Amikor az AT&T-t felosztották kisebb vállalokra, azok már értékesíthettek szoftvert és így zárttá tették a UNIX-ot. Richard Matthew Stallman (rms) a GNU-kiáltványban (GNU is Not Unix) 1983-ban meghirdetett egy szabad szoftver mozgalmat és ennek keretében megalakult a Free Software Foundation (FSF) és elkezdték kifejleszteni egy ingyenes környezet programcsomagjait.
Ehhez tartozik például az egyik legelterjedtebb fordítóprogramcsomag: a GCC (GNU Compiler Collection). Richard Stallman Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
4 / 37
A Linux története
A Linux születése
A Linux születése A GNU-mozgalom nagyon sok ingyenes programot készített el, de magát az operációs rendszermagot (kernel) nem sikerült befejezni. 1991-ben Linus Torvalds a helsinki egyetem diákjaként készített el egy UNIX-klónt az IBM 386-os gépére és ezt megosztotta az interneten, bár nem gondolta, hogy bárkit is érdekelne.
A nevet barátja, Ari Lemmke adta, így nevezte el Linus FTP könyvtárát. A Linux tulajdonképpen magát a kernelt és egy sor ahhoz közeli (részben FSF-fejlesztésű) programot jelent. Linus Torvalds Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
5 / 37
A Linux felépítése
A Linux felépítése
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
6 / 37
A Linux felépítése
A Linux kernel
A Linux kernel A Linux monolitikus kernellel rendelkezik, amelynek feladatai: folyamatkezelés (process), fájlrendszer kezelése, perifériák elérése, hálózatkezelés.
Az eszközkezelők (device driver) beépülhetnek a kernelbe, de modulárisan is kapcsolódhatnak ahhoz. A kernel számozásának alakja: A.B.C(.D): A: főverzió – kernel version B: fő átdolgozás – major revision C: kisebb átdolgozás – minor revision D: hibajavítás, biztonsági frissítés – bug-fixes, security patches
A kernelt Linus felügyeletével folyamatosan fejlesztik – 2012. októberében a legfrisebb verzió: 3.6 (kibocsátás: 2012. 09. 30.) Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
7 / 37
A Linux felépítése
A kernel feletti komponensek
A kernel feletti komponensek
A kernel fölött számos alacsony szintű komponens fut, amelyek a rendszer legalapvetőbb funkcióit látják el: bootloader: az első program, ami a gép bekapcsolásakor betöltődik, ez végzi a kernel betöltését a memóriába (pl. GRUB, LILO), init: a legelső folyamat (process), amit a kernel indít el – ő indítja a rendszer szolgáltatásait és minden további folyamat rajta keresztül indul el, dinamikus könyvtárak: a Linux lehetőséget ad dinamikusan csatolt könyvtárak használatára (SO – shared object), amelyek formátuma: ELF (Executable and Linkable Format), különböző felhasználói felületek: léteznek szöveges és grafikus felületek is.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
8 / 37
A Linux felépítése
Az X11
Az X11 A Linuxokon használt grafikus felületek alapja az X Window System, amelyet röviden, a jelenlegi verziószám alapján X11-nek is hívnak. A rendszert 1984-ben az MIT-n kezdték el fejleszteni. Számítógép-hálózatokon működtetett, távoli grafikus felületek létrehozását biztosítja architektúra-független módon. Alacsony szintű hálózati protokollja segítségével egy keretrendszert biztosít grafikus programok létrehozására. Manapság általában az X-re épülő, komplexebb grafikus könyvtárakat (Desktop Environment) használnak (GNOME, KDE, XFCE, stb). A GNOME Shell 3.2 Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
9 / 37
A Linux felépítése
A csomagkezelők
A csomagkezelők I.
A Linuxokra elérhető programok kezelésének egy központosított módja a csomagkezelő (package manager) használata. Egy csomagkezelő: képes egy program függőségeit (a futtatáshoz szükséges könyvtárak, egyéb programok) nyilvántartani, elvégzi egy program telepítését az azt tartalmaző csomagból, képes a hiányzó függőségek automatikus telepítésére vagy az azokat tartalmazó csomagok listázására, automatikusan kezeli a csomagok frissítéseit, képes a rendszer karbantartására – pl. nem használt, elavult csomagok eltávolítására.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
10 / 37
A Linux felépítése
A csomagkezelők
A csomagkezelők II. A csomagkezelők az interneten szabadon hozzáférhető adatbázisok segítségével dolgoznak. Segítségükkel egy program telepítése egy parancs kiadását jelenti (grafikus felületen egy klikkelés). Pl. sudo apt-get install build-essential feltelepít egy sor fejlesztő-programot (pl. a GCC C++ fordítóját). A csomagkezelők előnyei: nem kell egy program telepítésekor a függőségeket „kézzel” megkeresni és telepíteni, automatikus, egységes és biztonságos frissítési mechanizmust biztosítanak, a feltelepített csomagok listája elmentésével egyszerűen és automatikusan reprodukálható egy működő rendszer. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
11 / 37
A Linux felépítése
A csomagkezelők
A csomagkezelők III.
Sokféle csomagkezelő-rendszer létezik: dpkg: Debian Package Management System, RPM: eredetileg Red Hat Package Manager (ma: RPM Package Manager), Pacman: az ArchLinux része. stb.
Léteznek olyan segédprogramok, amelyek ezeknek a csomagkezelőknek a használatát egyszerűsítik le, kényelmes felhasználói felületet adva a csomagok kezeléséhez. Ilyen a dpkg-alapú apt, vagy az RPM-en alapuló YUM és ZYpp.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
12 / 37
A Linux felépítése
A disztribúciók
A disztribúciók Sok cég állít össze teljes felhasználói élményt adó ún. disztribúciókat (distribution), amelyek általános felépítése a következő: friss Linux kernel, GNU programok, ablakozó környezet(ek) (GNOME, KDE, stb.), egyéb ingyenes programok, csomagkezelő.
Néhány híresebb disztribúció: Ubuntu, Suse, Debian, Red Hat, Fedora, CentOS, Gentoo, UHU-linux (magyar). Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
13 / 37
A Linux működése és használata
A Linux működése és használata
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
14 / 37
A Linux működése és használata
Elérési út
Elérési út I. A teljes fájl-szerkezet egy fa. Nincsenek meghajtók, mint Windowsban – a fizikai meghajtók a fába vannak „felcsatolva” (mount). A fa gyökere a gyökérkönyvtár, amelynek neve: /. A könyvtárak egymástól is a / jellel vannak elválasztva – pl. /usr/include/c++/4.6.3/ Abszolút elérési útvonal: / jellel kezdődik, tehát a gyökértől elindulva megadja egy könyvtár/fájl teljes elérését. Relatív elérési útvonal: az aktuális könyvtártól kiindulva adja meg az elérést (nem kezdődhet / jellel). Fontos: a Linuxok mindenhol megkülönböztetik a kis- és nagybetűket!
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
15 / 37
A Linux működése és használata
Elérési út
Elérési út II. A relatív elérési útak megadásában segít két speciális „könyvtárnév”: .: a mindenkori aktuális könyvtárra hivatkozik, ..: az aktuális könyvtár „szülőjére” hivatkozik.
Pl. ./amoba az aktuális könyvtárban lévő amoba nevű fájlra/könyvtárra hivatkozik. Az ../obj/utils/string.o a szülőkönyvtárban lévő obj könyvtáron belüli utils könyvtárban lévő string.o fájlra hivatkozik. Az aktuális könyvtárra való hivatkozás általában elhagyható, tehát a ./-rel kezdődő útvonalnevek e két karakter nélkül is ugyanazt jelentik – kivéve programok futtatásakor (ld. később).
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
16 / 37
A Linux működése és használata
Elérési út
Elérési út III. Amikor a parancssorban egy elérési útvonalat adunk meg (pl. egy parancs argumentumaként), akkor ha néhány betű beírása után megnyomjuk a TAB billentyűt, a környezet megpróbálja befejezni a nevet: ha ez csak egyféleképp tehető meg, akkor megteszi, ha több lehetőség is van, akkor kiírja ezeket majd folytathatjuk a gépelést.
Pl. ha a könyvtárunk tartalmaz egy abc.txt és egy ablak.doc nevű fájlt, akkor a ./ab útvonalrészlet után TAB-ot nyomva kiíródik a fenti két fájl neve és folytathatjuk a gépelést, a ./abl után TAB-ot nyomva a környezet kiegészíti az útvonalat ./ablak.doc-ra.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
17 / 37
A Linux működése és használata
Hozzáférési jogok
Hozzáférési jogok I. A Linux többfelhasználós rendszer, így kritikus, hogy az egyes fájlokhoz való hozzáférés szabályozott módon történjen. Egy fájllal végezhető műveletek: olvasás (r), írás (w), futtatás (x).
Az egyes műveletkhez való jog aszerint definiált, hogy „mennyire állunk közel a fájlhoz” – a Linux három csoportba osztja a felhasználókat az egyes fájlokhoz való hozzáférés szerint: tulajdonos (u), tulajdonoscsoport (g), más (o).
A tulajdonoscsoportok létrehozása leegyszerűsíti a felhasználók és a nekik adott jogosultságok admininsztrálását egy nagy rendszerben. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
18 / 37
A Linux működése és használata
Hozzáférési jogok
Hozzáférési jogok II.
A fájlok esetén egyértelmű, hogy a fenti három művelet mit jelent. Könyvtárak esetén a hozzáférési jogok: olvasás: a benne található állományok listázása, írás: fájlok létrehozása, létező fájlok törlése, futtatás: a könyvtárba való belépés (munkakönyvtárrá tétel).
Ha például egy könyvtárra van írási jogunk, de nincs olvasási, akkor létrehozhatunk ott fájlokat, vagy törölhetünk a már létezők közül anélkül, hogy ki tudnánk listázni a könyvtár tartalmát.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
19 / 37
A Linux működése és használata
Hozzáférési jogok
Hozzáférési jogok III. Egy fájl teljes hozzáférési táblázata egy kilencbites érték, ami a következőképpen alakul ki: r 0 22
u w 1 21
x 2 20
r 3 22
g w 4 21
x 5 20
r 6 22
o w 7 21
x 8 20
Egy hárombites szám pontosan egy oktális számjeggyel írható le – így három oktális számjeggyel szokták jellemezni a hozzáférési jogokat. Pl. a 764 azt jelenti, hogy a tulajdonos olvashat, írhat, futtathat, a tulajdonoscsoport többi tagjai olvashatnak, írhatnak, de nem futtathatnak, a többi felhasználó pedig csak olvashat. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
20 / 37
A Linux működése és használata
Hozzáférési jogok
Hozzáférési jogok IV. A hozzáférési jogokat a chmod paranccsal tudjuk megváltoztatni. Pl. chmod 731 valami.sh hatására a valami.sh futtatási jogai a 731 oktális számmal kódolt értékre változnak. A chmod parancsnak van egy sokkal olvashatóbb, inkrementális verziója is, ahol jogokat tudunk hozzáadni, illetve elvenni az egyes csoportok és jogok betűjelei segítségével: chmod u+x valami.sh A fenti utasítással a valami.sh futtatását engedélyezzük a tulajdonosának, míg a chmod g-rw valami.sh utasítással a tulajdonoscsoporttól elvettük az olvasási és írási jogokat. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
21 / 37
A Linux működése és használata
Hozzáférési jogok
Hozzáférési jogok V.
A chmod további alakjai: minden adat megadása felhasználócsoportonként: chmod u+r-w-x,g+r+w-x,o-r+w-x valami.sh összes felhasználó jogainak megadása egyszerre: chmod +x valami.sh egy felhasználó jogainak megadása abszolút módon (nem inkrementálisan): chmod u=rw valami.sh
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
22 / 37
A Linux működése és használata
Felhasználók azonosítása
Felhasználók azonosítása A Linuxokon a felhasználókat egy felhasználónév és egy jelszó azonosítja. A jelszó a passwd utasítással változtatható meg. Minden felhasználónak van egy saját könyvtára (home), ahol a személyes dokumentumai találhatóak. A felhasználói könyvtárak elérési útjai: /home/timi/ /home/jozsi/ ahol timi és jozsi felhasználónevek. A felhasználó saját könyvtárának van rövid neve: ∼, míg egy másik felhasználó „home-jára” így hivatkozhatunk: ∼jozsi. Tehát pl. a ~/Music/listen.pls a saját home könyvtárunkon belül lévő Music könyvtárban lévő listen.pls fájl elérési útvonala. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
23 / 37
A Linux működése és használata
A „szuper felhasználók”
A „szuper felhasználók” A felhasználók között megkülönböztetett szerepe van az adminisztrátoroknak, akik a rendszer telepítésétés és karbantartását végzik. Csak nekik van joguk: a rendszer működését érintő beállítások módosításához, a rendszer belső leírófájljainak írásához, programok telepítéséhez, felhasználók adatainak kezeléséhez.
Az adminisztrátor neve super user vagy root. Bizonyos normál felhasználóknak is lehetnek adminisztrátor kiváltságai – ilyenkor a parancsok elé oda kell írni, hogy sudo (super user do): sudo apt-get install build-essential majd meg kell adniuk a jelszavukat. Linux alatt egy programnak ugyanazok a jogosultságai, mint annak a felhasználónak, aki indította őket. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
24 / 37
A Linux működése és használata
Műveletek könyvtárakkal
Műveletek könyvtárakkal Aktuális könyvtár elérési útvonala: pwd (present working directory). Könyvtárváltás: cd ~/Music/mp3 Könyvtár létrehozása: mkdir src Könyvtár törlése: rm src (csak üres könyvtár törölhető). Könyvtár tartalmának listázása: Egyszerű lista: ls (vagy l) Részletes lista (típus, hozzáférési jogok, tulajdonos, létrehozási idő, ...): ls -l (vagy ll) Titkos fájlok (nevük .-tal kezdődik) mutatása: ls -a (vagy la) Bizonyos fájlok listázása: ls *.mp3 A listázás szűkítése az ún. szabályos kifejezésekkel (regular expression) történik. Ezek segítségével különböző operátorok felhasználásával általános adhatóak meg karakterminták, amiknek megfelelő fájlnevek kerülnek listázásra. Ennek részleteivel itt nem foglalkozunk. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
25 / 37
A Linux működése és használata
Műveletek fájlokkal
Műveletek fájlokkal
Fájl létrehozása: touch fajl (létező fájl esetén a legutóbbi hozzáférés ideje (timestamp) frissül. Fájl törlése: rm fajl Fájl tartalmának kiírása: cat fajl Hosszú fájl olvasása: less fajl A fájlt tartalmát oldalakra törve nézegethetjük. Az oldalak közt pl. Up-Dn, PgUp-PgDn segítségével mozoghatunk. Kilépni a q paranccsal lehet. Keresni előrefelé a /keresett szöveg kifejezéssel lehet és az n-nel lehet továbbkerestetni. Ugyanez visszafelé a ?keresett szöveg kifejezéssel történik.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
26 / 37
A Linux működése és használata
Programok futtatása
Programok futtatása Ahhoz, hogy futtatni tudjunk egy fájlt, szükséges, hogy legyen futtatási jogunk rá. Ha beírjuk egy program nevét, akkor a Linux a $PATH nevű környezeti változóban felsorolt útvonalakon keresi a programot, amelynek alapértelmezett tartalma pl. /usr/local/sbin:/usr/local/bin:/usr/bin:/bin ahol az egyes elérési utak kettősponttal vannak elválasztva. Az aktuális könyvtár nincs benne ebben a felsorolásban, ezért ha az aktuális könyvtárban található programot akarjuk futtatni, akkor teljes elérési útvonallal kell megadni a nevet: /home/nagger/bin/amoba Természetesen használhatjuk a rövid neveket, ezért ha a /home/nagger/bin könyvtárban vagyunk, akkor az itt található amoba programot így is futtathatjuk: ./amoba Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
27 / 37
A Linux programozása
A Linux programozása
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
28 / 37
A Linux programozása
Az I/O átirányítása
Az I/O átirányítása I.
A programok a bemenetüket alapértelmezetten a billentyűzetről kapják, a kimenetük pedig a képernyő. Megtehetjük azt, hogy a kimenet a képernyő helyett egy fájl legyen: ls > lista.txt Ez a fájl létrejön, ha nem létezett és a tartalma felülíródik, ha már létezik.
Fordítva is működik: a bemenet a billentyűzet helyett egy fájl: cat < szoveg.txt A cat paraméterek nélkül indítva az alapértelmezett bemeneten érkező karaktereket írja ki az alapértelmezett kimenetre.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
29 / 37
A Linux programozása
Az I/O átirányítása
Az I/O átirányítása II.
Programok összeköthetőek oly módon, hogy az egyik kimenete a másik bemenete legyen. Ehhez az ún. csővezeték (pipe) karaktert használjuk: | ls | grep ab A grep parancs a bemenetén értkező sorok közül azokat írja ki, amelyekben megtalálja a paraméterként kapott szövegmintát.
Tetszőlegesen hosszú csővezeték kialakítható, tehát akármennyi programot összekapcsolhatunk egymás után.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
30 / 37
A Linux programozása
A bash fájlok
A bash fájlok Ha ugyanazt a parancs-sorozatot sokszor kell kiadnunk, felmerül az ötlet, hogy írjuk egy fájlba és azt a rendszer automatikusan hajtsa végre. Ez a Linuxokon használt legelterjedtebb parancs-környezetben, a Bourne Again Shell (BASH) alatt a következőképpen történik: # !/ bin / bash ls | grep ab
Az első sor kötelezően: #!/bin/bash Az első két karakter (nevük: hash bang) azt mondja meg a futtató környezetnek, hogy egy szkriptfájlról van szó, az utánuk következő elérési útvonal pedig annak a programnak a neve, ami képes értelmezni a fájl tartalmát.
Ezt követően tetszőleges UNIX programot futtathatunk, illetve léteznek vezérlési szerkezetek is. Ahhoz, hogy futtatni is tudjunk egy ilyen fájlt, rendelkeznünk kell futtatási jogokkal. Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
31 / 37
A Linux programozása
Változók
Változók I.
Bevezethetünk változókat egy értékadás segítségével: felirat = " ␣ ␣ Menu : ␣ " szoveg = nincsszokoz
Fontos, hogy az értékadás operátorának két oldalára nem kerülhet szóköz!
Amikor változók értékére hivatkozunk, a nevük elé egy $ jelet kell írni: echo $szoveg
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
32 / 37
A Linux programozása
Változók
Változók II.
Az echo utasítás segítségével tetszőleges szöveget kiírathatunk és a váltzókat ezekbe is behelyezhetjük: echo " Hell ó ␣ vil á g : ␣ $szoveg "
Ha azt szeretnénk, hogy egy $-jeles szövegrészlet ne értékelődjön ki változónévként az echo után, akkor aposztrófot kell használnunk: echo ’ Hell ó vil á g : $szoveg ’
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
33 / 37
A Linux programozása
Változók
Változók III.
Vannak ún. környezeti változók, amelyeknek az értékét bármikor felhasználhatjuk a programjainkban: Név $HOME $HOSTNAME $LANG $PATH $PWD $USER $USERNAME
Nagy Gergely (BME EET)
Jelentés a felhasználó saját könyvtára (∼) a gép neve a felhasználó (op.rsz.) nyelve és szövegkódolása parancsok keresési útja aktuális munkakönyvtár a felhasználó bejelentkezési neve a felhasználó teljes neve
A Linux alapjai
2012. 10. 08.
34 / 37
A Linux programozása
A for ciklus
A for ciklus
A for ciklussal listák elemein tudunk végigmenni: for v in lista ; do ciklusmag ( hivatkoz á s ciklusv á ltoz ó ra : $v ) done
Lista bármilyen szóközzel elválasztott lista is lehet: for v in ‘ls ‘; do echo " Egy ␣ f á jl : ␣ $v " done
A ‘‘ szerepe: a ‘‘ közé tett utasítás eredménye helyettesítődik a kifejezés helyére.
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
35 / 37
A Linux programozása
A feltételes elágazás
A feltételes elágazás I. A feltételes elágazás általános alakja: if [ felt é tel ]; then igen á g else nem á g fi done
Az if után bármilyen UNIX-parancs kerülhet – ezeknek ugyanis van visszatérési értékük, ami hagyományosan 0, ha nincs hiba, különben egy hibakód. Ez alapján a 0 felel meg a logikai IGAZ értéknek, minden más HAMIS: # !/ bin / bash if ls | grep alma ; then echo " alma ␣ l é tezik " fi
Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
36 / 37
A Linux programozása
A feltételes elágazás
A feltételes elágazás II. A feltételes elágazáshoz adott tesztelő kifejezések is léteznek: Név -d fájlnév -e fájlnév -f fájlnév -r fájlnév -w fájlnév -x fájlnév
Jelentés könyvtár-e? létezik? szabványos fájl? olvasható? írható? futtatható?
# !/ bin / bash if [ -e $file ]; then echo " $file ␣ l é tezik " else echo " $file ␣ nem ␣ l é tezik " fi Nagy Gergely (BME EET)
A Linux alapjai
2012. 10. 08.
37 / 37