RAII

Resource acquisition is initialization (RAII, česky osvojení prostředku je inicializace)[1] je způsob programování[2] používaný v několika objektově orientovaných, staticky typovaných programovacích jazycích. RAII je správa prostředku spjatá s životním cyklem objektu; získání prostředku (anglicky acquire) je spojené s inicializací objektu, a uvolnění prostředku s likvidací objektu. V RAII je držení prostředku invariantem třídy, a je svázané s životností objektu. Přidělování prostředků (nebo osvojování) se provádí při vytváření objektu (konkrétně při jeho inicializaci), konstruktorem, zatímco vracení (uvolnění) prostředku se provádí při ničení objektu (konkrétně při jeho finalizaci) destruktorem. Jinými slovy, aby inicializace byla úspěšná, osvojení prostředku musí uspět. Je tedy zaručené, že prostředek bude držen mezi ukončením inicializace a začátkem finalizace (držení prostředků je invariantem třídy), a že bude držen pouze v době, kdy je objekt naživu. Pokud tedy nedochází k úniku objektu, nedochází ani k úniku prostředků.

RAII je nejvíc spojován s jazykem C++, kde vznikl, ale také s programovacími jazyky Ada,[3] Vala[4] a Rust.[5] Techniku pro správu prostředků bezpečnou pro výjimky vyvinul v C++ Bjarne Stroustrup a Andrew Koenig[6] v letech 1984–89[7] a termín samotný poprvé použil Stroustrup.[8]

Pro tuto techniku se používají i jiné názvy, jako Constructor Acquires, Destructor Releases, CADRe (konstruktor získává, destruktor uvolňuje),[9] a jeden ze stylů použití se nazývá Scope-based Resource Management (SBRM (Správa prostředků založená na rozsahu platnosti),[10] což je název pro speciální případ použití automatických proměnných. RAII svazuje prostředky s životností objektu, který vždy nemusí odpovídat vstupu do rozsahu platnosti a jeho opuštění. (Zejména dynamicky alokované proměnné mají dobu života nezávislou na určitém rozsahu platnosti.) Použití RAII pro automatické proměnné (SBRM) je však nejobvyklejším případem použití.

Příklad v C++11

Následující příklad v C++11 ukazuje použití RAII pro přístup k souboru a zamykání mutexu:

#include <fstream>
#include <iostream>
#include <mutex>
#include <stdexcept>
#include <string>

void WriteToSouboru(const std::string& message) {
  // |mutex| chrání přístup k |souboru| (sdílenému více thready).
  static std::mutex mutex;

  // Před přístupem k |souboru| zamknout |mutex|.
  std::lock_guard<std::mutex> lock(mutex);

  // Zkus otevřít soubor.
  std::ofstream soubor("example.txt");
  if (!soubor.is_open()) {
    throw std::runtime_error("nelze otevřít soubor");
  }

  // Zápis do |souboru|:
  soubor << message << std::endl;

  // Při opuštění rozsahu platnosti bude nejdříve zavřen |soubor| (i v případě výjimky),
  // pak bude odemčen |mutex| (z jeho destruktoru) (i v případě výjimky).
}

Tento kód je bezpečný vůči výjimkám, protože C++ zaručuje, že všechny objekty s automatickým trváním (tj. proměnné lokální ve funkcích) budou zničeny při opuštění jejich rozsahu platnosti v opačném pořadí, než byly vytvořeny.[11] Je tedy zaručené, že při návratu z funkce budou zavolány destruktory objektů zámku i souboru, bez ohledu na to, zda došlo k výjimce nebo ne.[12]

Lokální proměnné umožňují snadnou správu více prostředků v rámci jedné funkce: jsou zničeny v opačném pořadí, než v jakém byly vytvořeny, a objekt je zničen pouze tehdy, když byl plně zkonstruován – tj. pokud pokud se z jeho konstruktoru nešíří žádná výjimka.[13]

Použití RAII značně zjednodušuje správu prostředků, snižuje rozsah kódu a pomáhá zajistit korektnost programu. RAII je proto doporučován standardními průmyslovými směrnicemi,[14] a většina standardní knihovny C++ se jím řídí.[15]

Výhody

Výhodou RAII jako techniky správy prostředků je zapouzdření, bezpečnost při výskytu výjimek (při použití objektů na zásobníku) a lokálnost (logika získání a vrácení může být napsána na jednom místě).

Zapouzdření je zajištěno tím, že logika správy prostředků je definována ve třídě pouze na jednom místě, nikoli v každém místě volání. Bezpečnost pro výjimky pro prostředky spjaté s objekty na zásobníku (tj. prostředky, které jsou uvolňovány ve stejném rozsahu platnosti tím, že prostředek je vázán na životnost proměnné na zásobníku (lokální proměnné deklarované v daném rozsahu platnosti): pokud je vyhozena výjimka, a je dedonováno správné zpracování výjimek, jediným kódem, který se provede při opouštění aktuálního rozsahu platnosti jsou destruktory objektů deklarovaných v tomto rozsahu platnosti. A konečně, lokálnost definice je zajištěna tím, že definice konstruktoru a destruktoru jsou na jednom místě v definici třídy.

Správa prostředků proto musí být svázána s dobou životnosti vhodných objektů, aby se dosáhlo automatického přidělování a uvolňování. Prostředky jsou získány během inicializace, když není šance, že by byly použity dříve, než jsou dostupné, a uvolněny při zničení stejných objektů, která zaručeně proběhne i při výskytu chyb (výjimek).

Při porovnávání RAII s konstrukcí finally používanou v Javě Stroustrup napsal, že „V reálných systémech existuje mnohem více získání prostředků než druhů prostředků, takže technika RAII vede k menšímu rozsahu kódu než použití konstrukce finally.“[1]

Typické použití

Přístup RAII se často používá pro řízení zámků mutexů ve vícevláknových aplikacích. Při takovém použití objekt uvolní zámek, při svém zničení. Bez RAII by v tomto scénáři bylo vysoké nebezpečí deadlocku a logika pro uzamčení mutexu by byla daleko od logiky pro jeho odemčení. S použitím RAII, kód, které zamyká mutex v zásadě obsahuje logiku, že zámek bude uvolněn, když program opustí rozsah platnosti RAII objektu.

Dalším typickým příkladem je práce se soubory: Mohli bychom mít objekt, který reprezentuje soubor otevřený pro zápis, přičemž soubor je otevřen v konstruktoru a zavřen, když program opustí rozsah platnosti objektu. V obou případech RAII zajišťuje pouze to, aby byl daný prostředek vhodně uvolněn; přesto je třeba dbát na zachování bezpečnosti při zpracování výjimek. Pokud kód modifikující datovou strukturu nebo soubor není bezpečný vůči výjimkám, mohlo by dojít k otevření mutexu nebo k uzavření souboru s poškozením datové struktury nebo souboru.

Vlastnictví dynamicky alokovaných objektů (paměť alokovaná pomocí new v C++) lze také řídit pomocí RAII tak, že objekt je uvolněn, když objekt RAII (umístěný na zásobníku) zaniká. K tomuto účelu standardní knihovna C++11 definuje třídy Smart pointerů std::unique_ptr pro objekty s jedním vlastníkem a std::shared_ptr pro objekty se sdíleným vlastnictvím. Podobné třídy jsou také dostupné prostřednictvím std::auto_ptr v C++98, a boost::shared_ptr v knihovnách Boost.

Pomocí RAII lze také posílat zprávy do sítě. V tomto případě by RAII objekt odeslal zprávu na síťový soket na konci konstruktoru, když je dokončena jeho inicializace. Také by odeslal zprávu na začátku destruktoru, než bude objekt zničen. Takový konstrukt by mohl být používán v klientském objektu na vytvoření spojení se serverem běžícím v jiném procesu.

Překladač „cleanup“ rozšíření

Clang i GCC implementují nestandardní rozšíření jazyka C pro podporu RAII: atribut cleanup proměnné.[16] Následující příklad anotuje proměnná daným destruktorem, který se zavolá, když program opouští rozsah platnosti proměnné:

void example_usage() {
  __attribute__((cleanup(fclosep))) FILE *logfile = fopen("logfile.txt", "w+");
  fputs("hello logfile!", logfile);
}

V tomto příkladě překladač zařídí, aby byla funkce fclosep zavolaná na souboru logfile před návratem z funkce example_usage.

Omezení

RAII funguje pouze pro prostředky získané a uvolněné (přímo nebo nepřímo) pomocí objektů na zásobníku, kde je dobře definovaná statická životnost objektu. Objekty umístěné na haldě, které samy získávají a uvolňují prostředky, jsou běžné v mnoha jazycích včetně C++. RAII vyžaduje, aby objekty na haldě byly implicitně nebo explicitně zrušeny na všech možných trajektoriích provádění, aby se provedl destruktor pro uvolnění přiřazených prostředků (nebo ekvivalent).[17]:s.8:27 Toho lze dosáhnout pomocí smart pointeru pro řízení všech objektů na haldě, přičemž pro cyklicky odkazované objekty se používají slabé ukazatele.

V C++ je zaručeno, že při výskytu výjimky dojde k postupnému uvolnění zásobníku pouze v případě, když je výjimka někde zachycena. Důvodem je, že „Pokud není v programu nalezen vyhovující handler, je zavolána funkce terminate(); zda je zásobník uvolněn před zavoláním terminate(), je implementačně závislé (15.5.1).“ (norma C++03, §15.3/9).[18] Toto chování je obvykle přijatelné, protože zbývající prostředky jako paměť, soubory, sokety, atd., uvolní při ukončení programu operační systém.[zdroj?]

Jonathan Blow na konferenci Gamelab v roce 2018 ukázal, že používání RAII může vést fragmentaci paměti, která může způsobit výpadky cache a stonásobné i větší zhoršení výkonu.[19]

Počítání odkazů

V Perlu, Pythonu (v implementaci CPython)[20] a v PHP[21] je životnost objektu řízena počítáním odkazů, což umožňuje použít RAII. Objekty, které už nejsou referencované, jsou okamžitě zničeny nebo finalizovány a uvolněny, takže destruktor nebo finalizátor může také prostředek uvolnit. V těchto jazycích to však není vždy idiomatické a v jazyce Python se to výslovně nedoporučuje (ve prospěch kontextových manažerů a finalizátorů z balíčku weakref).[zdroj?]

Doba života objektu nemusí být vždy vázána na nějaký rozsah platnosti, a objekty mohou být likvidovány nedeterministicky nebo vůbec. To může způsobovat náhodné úniky prostředků, které měly být uvolněny na konci nějakého rozsahu platnosti. Objekty uložené ve statických proměnných (především v globálních proměnných) nemusí být finalizovány při skončení programu, a případné s nimi spjaté prostředky tak nebudou uvolněny; například CPython finalizaci takových objektů nezaručuje. Také objekty s kruhovými odkazy nebudou při použití jednoduchého čítače referencí uvolněny, a budou žít do skončení programu; i kdyby byly uvolňovány (sofistikovanějším garbage kolektorem), doba a pořadí jejich ničení budou nedeterministické. V CPython existuje detektor cyklů, který detekuje cykly a finalizuje objekty v cyklu, i když CPython před verzí 3.4, cyklické struktury nejsou sbírány, pokud některý objekt v cyklu má finalizátor.[22]

Odkazy

Reference

V tomto článku byl použit překlad textu z článku Resource acquisition is initialization na anglické Wikipedii.

  1. a b STROUSTRUP, Bjarne. Why doesn't C++ provide a "finally" construct? [online]. 2017-09-30 [cit. 2019-03-09]. Dostupné online. 
  2. SUTTER, Herb; ALEXANDRESCU, Andrei, 2005. C++ Coding Standards. [s.l.]: Addison-Wesley. (C++ In-Depth Series). Dostupné online. ISBN 978-0-321-11358-0. S. 24. 
  3. Gem #70: The Scope Locks Idiom [online]. AdaCore [cit. 2021-05-21]. Dostupné online. (anglicky) 
  4. The Valadate Project. Destruction [online]. The Vala Tutorial version 0.30 [cit. 2021-05-21]. Dostupné online. 
  5. RAII - Rust By Example [online]. doc.rust-lang.org [cit. 2020-11-22]. Dostupné online. 
  6. Stroustrup 1994, 16.5 Resource Management, pp. 388–89.
  7. Stroustrup 1994, 16.1 Exception Handling: Introduction, pp. 383–84.
  8. Stroustrup 1994, s. 389. I called this technique "resource acquisition is initialization."
  9. Arthur Tchaikovsky. Change official RAII to CADRe [online]. Google Groups, 2012-11-06 [cit. 2019-03-09]. Dostupné online. 
  10. CHOU, Allen. Scope-Based Resource Management (RAII) [online]. 2014-10-01 [cit. 2019-03-09]. Dostupné online. 
  11. Richard Smith. Working Draft, Standard for Programming Language C++ [online]. 2017-03-21 [cit. 2023-09-07]. S. 151, section §9.6. Dostupné online. 
  12. How can I handle a destructor that fails? [online]. Standard C++ Foundation [cit. 2019-03-09]. Dostupné online. 
  13. Richard Smith. Working Draft, Standard for Programming Language C++ [online]. 2017-03-21 [cit. 2019-03-09]. Dostupné online. 
  14. STROUSTRUP, Bjarne; SUTTER, Herb. C++ Core Guidelines [online]. 2020-08-03 [cit. 2020-08-15]. Dostupné online. 
  15. I have too many try blocks; what can I do about it? [online]. Standard C++ Foundation [cit. 2019-03-09]. Dostupné online. 
  16. Specifying Attributes of Variables [online]. Projekt GNU [cit. 2019-03-09]. Dostupné online. 
  17. WEIMER, Westley; NECULA, George C., 2008. Exceptional Situations and Program Reliability. ACM Transactions on Programming Languages and Systems. Roč. 30, čís. 2. Dostupné online. 
  18. ildjarn. RAII and Stack unwinding [online]. Stack Overflow, 2011-04-05 [cit. 2019-03-09]. Dostupné online. 
  19. RAII na YouTube
  20. Extending Python with C or C++: Reference Counts [online]. Python Software Foundation [cit. 2019-03-09]. Dostupné online. 
  21. hobbs. Does PHP support the RAII pattern? How? [online]. 2011-02-08 [cit. 2019-03-09]. Dostupné online. 
  22. gc — Garbage Collector interface [online]. Python Software Foundation [cit. 2019-03-09]. Dostupné online. 

Literatura

Externí odkazy

  • DEWHURST, Stephen C. Gotcha #67: Failure to Employ Resource Acquisition Is Initialization [online]. [cit. 2024-09-15]. Dostupné online. 
  • VENNERS, Bill. A Conversation with Bjarne Stroustrup [online]. [cit. 2024-09-15]. Dostupné online. 
  • KARLSSON, Bjorn; WILSON, Matthew. The Law of The Big Two [online]. [cit. 2024-09-15]. Dostupné online. 
  • KALEV, Danny. Implementing the 'Resource Acquisition is Initialization' Idiom [online]. [cit. 2024-09-15]. Dostupné v archivu pořízeném z originálu dne 2009-08-15. 
  • PIBINGER, Roland. RAII, Dynamic Objects, and Factories in C++ [online]. [cit. 2024-09-15]. Dostupné online. 
  • RAII v Delphi: KELLY, Barry. One-liner RAII in Delphi [online]. [cit. 2024-09-15]. Dostupné online. 
  • W3computing. RAII in C++ [online]. [cit. 2024-09-15]. Dostupné online. 

Read other articles:

Kan'onji 観音寺市Kota BenderaLambangLokasi Kan'onji di Prefektur KagawaNegara JepangWilayahShikokuPrefektur KagawaPemerintahan • WalikotaSeiji ShirakawaLuas • Total118 km2 (46 sq mi)Populasi (Oktober 1, 2015) • Total59.409 • Kepadatan503,5/km2 (13,040/sq mi)Zona waktuUTC+9 (Waktu Standar Jepang)Kode pos768-8601Nomor telepon0875-23-3900Alamat1-1-1 Sakamotochō, Kan'onji-shi, Kagawa-kenSitus webSitus web...

 

Astrid dari SwediaAstrid sebagai istri Adipati Brabant pada tahun 1926Permaisuri BelgiaPeriode17 Februari 1934 – 29 Agustus 1935Informasi pribadiKelahiran(1905-11-17)17 November 1905Arvfurstens Palats, Stockholm, SwediaKematian29 Agustus 1935(1935-08-29) (umur 29)Küssnacht am Rigi, Schwyz, SwissPemakaman3 September 1935Gereja Laeken, Laeken, Brussel, BelgiaWangsaBernadotteNama lengkapAstrid Sofia Lovisa ThyraAyahPangeran Carl dari Swedia, Adipati VästergötlandIbuPutri Ingeborg dari ...

 

22°26′45″N 114°10′14″E / 22.445706°N 114.170622°E / 22.445706; 114.170622 Old District Office North Old District Office NorthTraditional Chinese舊北區理民府TranscriptionsYue: CantoneseYale RomanizationGauh bāk kēui léih màhn fúJyutpingGau6 bak1 koei1 lei5 man4 fu2Law Ting Pong Scout CentreTraditional Chinese羅定邦童軍中心TranscriptionsYue: CantoneseYale RomanizationLòh dihng bōng tùhng gwān jūng sāmJyutpingLo4 ding6 bong1 t...

1958 New Orleans mayoral election← 19541962 →   Candidate deLesseps Morrison Claude W. Duke Party Democratic Democratic Popular vote 90,802 43,231 Percentage 57.7% 27.5% Mayor before election deLesseps Morrison Democratic Elected Mayor deLesseps Morrison Democratic Elections in Louisiana Federal government Presidential elections 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 191...

 

American scientific journal on neurology Academic journalNeurologyDisciplineNeurologyLanguageEnglishEdited byJosé G. Merino, MD, MPhil, FAAN (neurologist)Publication detailsHistory1951–presentPublisherWolters Kluwer on behalf of the American Academy of Neurology (United States)FrequencyWeekly, 48 issues/yearImpact factor9.901 (2020)Standard abbreviationsISO 4 (alt) · Bluebook (alt1 · alt2)NLM (alt) · MathSciNet (alt )ISO 4NeurologyIndexin...

 

Anti-Cuba organization run by Cuban exiles in Florida Brothers to the RescueHermanos al RescatePurposeAid balseros and dissidents in CubaLocationMiami, United StatesMethods Rescue rafters spotted in the Florida straits by aircraft Airdropping dissident leaflets over Cuba Websitehermanos.org Brothers to the Rescue (Spanish: Hermanos al Rescate) is a Miami-based activist nonprofit organization headed by José Basulto. Formed by Cuban exiles, the group is widely known for its opposition to the C...

† Человек прямоходящий Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:Синапсиды�...

 

Lower house of the French Parliament under the Fifth Republic Assemblée Nationale redirects here. For other uses, see Assemblée Nationale (disambiguation). National Assembly Assemblée nationale16th legislature of the Fifth French RepublicTypeTypeLower house HistoryFounded4 October 1958; 65 years ago (1958-10-04)Preceded byNational Assembly(French Fourth Republic)LeadershipPresidentYaël Braun-Pivet, RE since 28 June 2022 StructureSeats577Political groupsGovernmen...

 

此條目可参照英語維基百科相應條目来扩充。 (2021年5月6日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 约翰斯顿环礁Kalama Atoll 美國本土外小島嶼 Johnston Atoll 旗幟颂歌:《星條旗》The Star-Spangled Banner約翰斯頓環礁�...

Kualifikasi sepak bola pada Pekan Olahraga Daerah Sulawesi Selatan 2014Kualifikasi sepak bola pada Porda Sulsel 2014Kualifikasi sepak bola pada Porda Sulsel XVNegara IndonesiaTanggal penyelenggaraanOktober – Desember 2013Jumlah peserta23 tim sepak bolaJumlah pertandingan32← 2010 2018 → Kualifikasi untuk sepak bola pada Pekan Olahraga Daerah Sulawesi Selatan 2014 berlangsung untuk menentukan tim yang berhak tampil pada Porda Sulsel 2014 dalam cabang sepak bola di Kabupaten Bantaeng. Kual...

 

Keuskupan Ciudad del EsteDioecesis Urbis OrientalisLokasiNegara ParaguayMetropolitAsunciónStatistikLuas27.451 km2 (10.599 sq mi)Populasi- Total- Katolik(per 2004)600.100590,000 (98.3%)InformasiGereja sui iurisGereja LatinRitusRitus RomaKatedralCatedral San BlasKepemimpinan kiniPausFransiskusUskupHeinz Wilhelm (Guillermo) Steckling, O.M.I.Peta Keuskupan Ciudad del Este (bahasa Latin: Dioecesis Urbis Orientalis) adalah sebuah keuskupan Gereja Katolik...

 

Metro IndiaCover of Metro India on 6 February 2016TypeDaily newspaperFormatBroadsheetOwner(s)C. L. RajamFounded2013Political alignmentCentristLanguageEnglishHeadquartersHyderabadIndiaCirculationTelanganaWebsitewww.metroindia.com Metro India is an English-language daily newspaper being published in Hyderabad, Telangana. It is available in the Indian State of Telangana.[1] History The newspaper was founded in 2013 by CL Rajam who previously launched a Telugu daily newspaper, Namasthe T...

Gettin' Tighter redirects here. For the song by Tom Robinson & the Voice Squad, see Getting Tighter. 1975 studio album by Deep PurpleCome Taste the BandStudio album by Deep PurpleReleased7 November 1975 (1975-11-07)[1][2]Recorded3 August – 1 September 1975StudioMusicland (Munich)Genre Hard rock funk rock[3] Length37:16LabelPurpleProducerMartin BirchDeep PurpleDeep Purple chronology Stormbringer(1974) Come Taste the Band(1975) Perfect Strang...

 

Estonian astronomer and astrophysicist (1893–1985) Ernst ÖpikErnst ÖpikBorn(1893-10-22)22 October 1893Kunda, Kreis Wierland, governorate of Estonia Russian Empire (current Estonia)Died10 September 1985(1985-09-10) (aged 91)Bangor, Northern Ireland, United KingdomNationalityEstonianAlma mater University of Moscow University of Tartu Awards Gold Medal of the Royal Astronomical Society in 1975 Bruce Medal in 1976 Scientific careerFieldsAstronomyInstitutionsArmagh Observatory Ernst ...

 

Not to be confused with Mosaic evolution. Elephants forage In a forest-savanna mosaic in Lopé National Park. Forest–savanna mosaic is a transitory ecotone between the tropical moist broadleaf forests of Equatorial Africa and the drier savannas and open woodlands to the north and south of the forest belt. The forest–savanna mosaic consists of drier forests, often gallery forest, interspersed with savannas and open grasslands. Flora This band of marginal savannas bordering the dense dry fo...

Swedish footballer (born 1981) Ibrahimović redirects here. For the surname, see Ibrahimović (surname). Zlatan Ibrahimović Ibrahimović in 2018Personal informationFull name Zlatan Ibrahimović[1]Date of birth (1981-10-03) 3 October 1981 (age 42)[1]Place of birth Malmö, SwedenHeight 1.95 m (6 ft 5 in)[2]Position(s) StrikerYouth career1989–1991 Malmö BI1991–1995 FBK Balkan1995–1999 Malmö FFSenior career*Years Team Apps (Gls)1999–2001 Malm...

 

Jules Humbert-DrozHumbert-Droz in 1926Born(1891-09-23)September 23, 1891La Chaux-de-Fonds, SwitzerlandDiedOctober 16, 1971(1971-10-16) (aged 80)La Chaux-de-Fonds, SwitzerlandPolitical partySocial Democratic Party of Switzerland (1911-1921; 1943-unknown)Communist Party of Switzerland (1921-1943)SpouseEugénie Perret Jules-Frédéric Humbert-Droz (23 September 1891, La Chaux-de-Fonds – 16 October 1971) was a Swiss pastor, journalist, socialist and communist. A founding member of the Comm...

 

1924 film by James Cruze The Fighting CowardDirected byJames CruzeWritten byWalter Woods (scenario)Based onMagnoliaby Booth TarkingtonProduced byAdolph ZukorJesse LaskyStarringErnest TorrenceMary AstorNoah Beery, Sr.Cullen LandisCinematographyKarl BrownDistributed byParamount PicturesRelease date March 30, 1924 (1924-03-30) Running time7 reels (6,501 feet)CountryUnited StatesLanguageSilent (English intertitles) Full feature The Fighting Coward is a 1924 American silent comedy f...

Group of four islands in Indonesian Archipelago Greater Sunda IslandsNative name: Kepulauan Sunda BesarThe Greater Sunda Islands in blueGeographyLocationIndonesian ArchipelagoCoordinates0°00′N 110°00′E / 0.000°N 110.000°E / 0.000; 110.000ArchipelagoGreater Sunda IslandsTotal islands4Major islandsSumatra, Sulawesi, Borneo, Java (sometimes the smaller islands of Madura, Bangka, Belitung, Banggai Islands, and Riau Islands are also included administratively)Highest...

 

Oniscus asellus Klasifikasi ilmiah Kerajaan: Animalia Filum: Arthropoda Subfilum: Crustacea Kelas: Malacostraca Ordo: Isopoda Famili: Oniscidae Genus: Oniscus Spesies: O. asellus Nama binomial Oniscus asellusLinnaeus, 1758 Sinonim Oniscus affinis Oniscus fossor Oniscus lamperti Oniscus languidus Oniscus lineatus Oniscus murarius Oniscus nodulosus Oniscus taeniola Oniscus vicarius Porcellio lineatus Porcellio taeniola Referensi:[1] Oniscus asellus (bahasa Inggris: common wood...