lt.geologyidea.com
Daugiau

Kaip priversti modelį su „Iterate“ pasirinkta funkcija veikti greičiau?

Kaip priversti modelį su „Iterate“ pasirinkta funkcija veikti greičiau?


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Šis klausimas yra susijęs su modelio taisymu su pasirinkta „Iterate“ funkcija?

Pateiktas atsakymas pasiteisino puikiai, tačiau jis tikrai lėtas. Bet koks būdas priversti jį veikti greičiau?

„My Points Shapefile“ yra 6707 ypatybių, o „Flow direction“ rastras apskaičiuojamas pagal SRTM (250 m skiriamoji geba). Mano duomenys yra GCS, WGS84 atskaitos taške.


Modelio pasirinkimas pirmyn atgal: koks yra pradinis modelis?

Bandau suprasti logiką, slypinčią atrankos pirmyn atgal (nors žinau, kad yra geresnių modelių pasirinkimo metodų). Pasirenkant pirmyn modelį, atrankos procesas pradedamas tuščiu modeliu ir kintamieji pridedami nuosekliai. Pasirenkant atgal, atrankos procesas pradedamas taikant visą modelį, o kintamieji iš eilės neįtraukiami.

Klausimas: Su kokiu modeliu pradedama atranka pirmyn atgal?

Ar tai visas modelis? Tuščias modelis? Kažkas tarpo? Vikipedija ir Hastie ir kt. (2009) - Statistinio mokymosi elementai, 60 psl. Paaiškina metodą, bet man nepavyko nieko rasti apie pradinį modelį. Savo analizei naudoju R paketo MASS funkcijos stepAIC funkciją.

Žemiau galite rasti pavyzdį R. „StepAIC“ funkcija automatiškai atspausdina kiekvieną pasirinkimo proceso žingsnį konsolėje ir atrodo, kad pasirinkimas prasideda nuo viso modelio. Tačiau, remdamasis „jjet“ atsakymu, nesu tikras, ar padariau ką nors blogo.

x1 + x2 + x3 + x4 + x5, kryptis = & quot; abu & quot). Nežinau, ar yra autoritetingas atsakymas, ar „atgal“ atgal reiškia konkretų pradinį modelį, ar kuris, bet net jei ir yra, būtų protinga nemanyti, kad kiti žmonės žino apie tai, kai naudoja frazę . $ endgroup $ & ndash Scortchi - atkurkite Moniką ir # 9830 gegužės 3 d., 17:28


Kaip automatizuoti prognozes naudojant apmokytą modelį „Google“ debesyje

Dalį šių duomenų įterpiau į „Google BigQuery“, kad galėčiau paleisti mašininio mokymosi modelį.

Turiu patirties mokant mašininio mokymosi modelių, tačiau neturiu patirties gauti naujų duomenų prognozes, kai šis modelis bus apmokytas.

Aš perskaičiau, kad galiu įkelti šį apmokytą modelį į „Google“ debesies saugyklą ir įdėti jį į „AI Platform“, bet aš nežinau proceso, kurio turiu laikytis, nes nauji duomenys bus įterpti į „Bigquery“ su šiuo nauju duomenis, kuriuos noriu padaryti, tada pasirinkti šias prognozes ir vėl įdėti į „Firstore“.

Manau, kad tai būtų galima padaryti naudojant „Dataflow“ („Apache Beam“) arba „Data composer“ („Airflow“), kur galiu automatizuoti šį procesą ir suplanuoti jį vykdyti kiekvieną savaitę, tačiau neturiu patirties naudojant šias technologijas, ar kas nors gali rekomenduokite man, kokia technologija bus geresnė šiuo konkrečiu atveju, jei norite ieškoti informacijos, kaip ją naudoti?

Viena iš galimybių galėtų būti išsaugoti modelį dirbtinio intelekto platformoje arba „Google“ debesies saugykloje, o naudojant debesies funkcijas paskambinti šiam išsaugotam modeliui ir numatyti, kaip juos išsaugoti „firestore“?


7 Atsakymai 7

Savo programoje turėtumėte naudoti maksimalų paklaidų skaičių, kuris yra toleruojamas, atsižvelgiant į našumą. Apskritimų skaičius yra sulėtėjimo faktorius, kurį naudojate remdamiesi tuo, kad įprastomis naudojimo sąlygomis toks sulėtėjimas jums daro nereikšmingą įtaką (vartotojas to nematys, papildomos procesoriaus išlaidos nereiškia, kad perkate didesnį serverį ir taip toliau). Tai labai priklauso nuo operacinio konteksto: kokios mašinos yra susijusios, kiek vartotojo autentifikavimo per sekundę. taigi nėra visiems tinkamo atsakymo.

Platus vaizdas yra toks:

  • Laikas patikrinti vieną slaptažodį yra v jūsų sistemoje. Šį laiką galite koreguoti pasirinkdami raundų skaičių PBKDF2.
  • Galimas užpuolikas gali susirinkti f kartų daugiau procesoriaus energijos nei jūs (pvz., turite vieną serverį, o užpuolikas turi 100 didelių kompiuterių, kurių kiekvienas yra dvigubai greitesnis nei jūsų serveris: f = 200).
  • Paprastas vartotojas turi entropijos slaptažodį n bitų (tai reiškia, kad bandant atspėti vartotojo slaptažodį su „patikimų slaptažodžių“ žodynu vidutiniškai reikės 2 n-1 bando).
  • Užpuolikas ras jūsų sistemą, dėl kurios verta pulti, jei vidutinį slaptažodį galima įtrūkti laiku mažiau nei p (tai užpuoliko „kantrybė“).

Jūsų tikslas yra priversti vidutines vieno slaptažodžio sulaužymo išlaidas viršyti užpuoliko kantrybę, kad jis net nebandytų, o toliau koncentruojasi į kitą, lengvesnį taikinį. Atsižvelgiant į aukščiau pateiktas žymes, tai reiškia, kad norite:

p negalite kontroliuoti, tai galima įvertinti atsižvelgiant į vertė duomenų ir sistemų, apsaugotų vartotojo slaptažodžiais. Sakykime taip p yra vienas mėnuo (jei tai užtruks ilgiau nei mėnesį, užpuolikas nesivargins bandydamas). Tu gali padaryti f Kita vertus, užpuolikas bandys padaryti mažesnį, nusipirkdamas didesnį serverį f didesnis perkant didesnes mašinas. Sunkinantis dalykas yra tai, kad slaptažodžių nulaužimas yra gėdingai lygiagreti užduotis, todėl užpuolikas gaus didelį impulsą naudodamas GPU, kuris palaiko bendrą programavimą. f vis tiek svyruos apie kelis šimtus.

n susijęs su slaptažodžių kokybe, kuriai galite kažkaip įtakoti laikydamiesi griežtos slaptažodžių pasirinkimo politikos, tačiau realiai jums bus sunku įvertinti n viršija, tarkime, 32 bitus. Jei bandysite įdiegti griežtesnius slaptažodžius, vartotojai pradės aktyviai kovoti su jumis, spręsdami, pavyzdžiui, pakartotinai naudodami slaptažodžius iš kitur, rašydami slaptažodžius ant lipnių užrašų ir pan.

Taigi likęs parametras yra v. Su f = 200 (užpuolikas, turintis keliolika gerų GPU), vieno mėnesio kantrybė ir n = 32, Tau reikia v kad būtų bent 241 milisekundė (pastaba: iš pradžių čia rašiau „8 milisekundes“, o tai neteisinga - tai yra kantrybės, kuri trunka vieną dieną, o ne mėnesį, skaičius). Taigi turėtumėte nustatyti PBKDF2 raundų skaičių taip, kad jo apskaičiavimas per vieną slaptažodį jūsų serveryje užtruks bent tiek laiko. Jūs vis tiek galėsite patikrinti keturis slaptažodžius per sekundę vienu branduoliu, todėl procesoriaus poveikis tikriausiai yra nereikšmingas (*). Tiesą sakant, saugiau naudoti daugiau raundų, nes, pripažinkime tai, kad iš vidutinio vartotojo slaptažodžio gauti 32 bitų vertės entropiją yra šiek tiek optimistiškai, kita vertus, nedaug atakų skirs dešimtis kompiuterių vienam pilnam. mėnesį užduotis nulaužti vieną slaptažodį, todėl galbūt vienos dienos „užpuoliko kantrybė“ yra realesnė, todėl slaptažodžio patvirtinimas kainuoja 8 milisekundes.

Taigi jums reikia padaryti keletą etalonų. Be to, aukščiau išvardinti veiksmai atliekami tol, kol jūsų PBKDF2 / SHA-256 diegimas yra greitas. Pvz., Jei naudojate visiškai C # / Java pagrįstą diegimą, aukščiau nurodytose žymose gausite tipišką 2–3 sulėtėjimo koeficientą (palyginti su C ar surinkimu) daug procesoriaus reikalaujančioms užduotims atlikti. Tai tolygu dauginimui f 2 arba 3. Kaip palyginimo bazę, 2,4 GHz „Core2“ procesorius gali atlikti apie 2,3 milijono elementarių SHA-256 skaičiavimų per sekundę (su vienu branduoliu), taigi tame procesoriuje tai reikštų apie 20000 ratų, kad būtų pasiektas „8 milisekundžių“ tikslas.

(*) Pasirūpinkite, kad branginant slaptažodžio patvirtinimą jūsų serveris būtų labiau pažeidžiamas dėl paslaugų atsisakymo atakų. Turėtumėte taikyti keletą pagrindinių atsakomųjų priemonių, pavyzdžiui, laikinai įtraukite kliento IP adresus į juodąjį sąrašą, kurie per sekundę siunčia per daug užklausų. Jūs vis tiek turite tai padaryti, kad sužlugdytumėte prisijungęs žodynų išpuoliai.


Suderinamumo priemonės

Pažvelkime greitai į įvairias darnos priemones ir į tai, kaip jos apskaičiuojamos:

  1. C_v matas pagrįstas slenkančiu langu, vieno nustatyto viršutinių žodžių segmentavimu ir netiesioginiu patvirtinimo matu, kuriame naudojama normalizuota taškinė abipusė informacija (NPMI) ir kosinuso panašumas
  2. C_pgrindžiamas slenkančiu langu, vienu ankstesniu viršutinių žodžių segmentavimu ir Fitelsono darnos patvirtinimo matu
  3. C_ucimatas grindžiamas slenkančiu langu ir visų nurodytų viršutinių žodžių porų abipuse informacija (PMI)
  4. C_umassyra pagrįstas dokumentų sutapimo skaičiavimu, prieš tai einančiu segmentavimu ir logaritmine sąlygine tikimybe, kaip patvirtinimo priemone
  5. C_npmiyra patobulinta C_uci darnos versija, naudojant normalizuotą taškinę abipusę informaciją (NPMI)
  6. C_ayra pagrįstas kontekstiniu langu, porų aukščiausių žodžių palyginimu ir netiesiogine patvirtinimo priemone, kuriai naudojama normalizuota taškinė abipusė informacija (NPMI) ir kosinuso panašumas

Žinoma, yra daug daugiau temos modelio vertinimo sampratos ir darnos mato. Tačiau turėdami omenyje šio straipsnio trukmę ir tikslą, pritaikykime šias sąvokas kurdami modelį, kuris yra bent jau geresnis nei naudojant numatytuosius parametrus. Be to, užuot išradę ratą, pakartosime jau turimus internetinius kodo elementus, kad palaikytume šį pratimą.


Mašininio mokymosi vamzdynas

Šiame sprendime naudojami du duomenų perdavimo vamzdynai:
a) „Spark Pipeline“, skirtas duomenims įgyti, išvalyti, išgauti funkcijas ir ištirti duomenis. Šio vamzdyno įvestis yra neapdorotų duomenų rinkmena, o išvestis yra struktūrinių funkcijų duomenų rinkiniai, kuriuos galima naudoti įvairiems pasroviui, įskaitant informacijos suvestines ir modelių mokymą, intervenciją ir A / B testavimą (rankraščio II dalis).

b) „Scikit-Learn Pipeline“, skirta konkretiems modeliams skirtoms užduotims atlikti. Įvestis yra ypatybių duomenys (kibirkštinio vamzdyno išvestis), o išvestis yra apmokytas modelis / numatymas. Šis vamzdynas tiekia funkciją ir atlieka papildomą duomenų išankstinį apdorojimą, priskyrimą, funkcijų pasirinkimą (tiek vienkamienį, tiek daugialypį) ir modelio perkėlimą.


Žvaigždžių schema

Žvaigždžių schema yra kitoks jūsų duomenų tvarkymo būdas. Tai puikus dizaino būdas saugoti ir analizuoti didžiulius duomenų kiekius ir remiasi „faktų“ ir „matmenų“ naudojimu. „Faktas“ yra skaitmeninis duomenų taškas, vedantis verslo procesus, o „aspektas“ yra šio fakto aprašymas. Grįžtant prie mūsų automobilių pardavimo numerių pavyzdžio: „faktų“ lentelėje būtų informacija apie pardavimo skaičių, o atitinkamoje „matmenų“ lentelėje būtų tų automobilių spalva.

Integruokite savo duomenis jau šiandien!

Išbandykite „Xplenty free“ 14 dienų. Kredito kortelės nereikia.

Šauniausias žvaigždžių schemų dalykas yra tas, kad jie paprasčiausiai yra abstrakcijos ir tradicinės reliacinės duomenų bazės. Tai yra, jei turite RDBMS, galite ją naudoti, jei norite susisteminti duomenis į žvaigždžių schemą.


Kaip priversti modelį su „Iterate“ pasirinkta funkcija veikti greičiau? - Geografinės informacinės sistemos

Galite paimti iš anksto parengtą vaizdų klasifikavimo tinklą, kuris jau išmoko išgauti iš natūralių vaizdų galingas ir informatyvias ypatybes ir naudoti jį kaip atspirties tašką mokantis naujos užduoties. Dauguma iš anksto paruoštų tinklų yra apmokyti „ImageNet“ duomenų bazės pogrupyje [1], kuris naudojamas „ImageNet“ didelio masto vizualinio atpažinimo iššūkyje (ILSVRC) [2]. Šie tinklai buvo išmokyti naudoti daugiau nei milijoną vaizdų ir gali suskirstyti vaizdus į 1000 objektų kategorijų, tokių kaip klaviatūra, kavos puodelis, pieštukas ir daugelis gyvūnų. Iš anksto paruošto tinklo naudojimas mokantis perkėlimo paprastai yra daug greitesnis ir lengvesnis nei tinklo treniravimas nuo nulio.

Anksčiau apmokytus tinklus galite naudoti šioms užduotims atlikti:

Iš anksto apmokytus tinklus tiesiogiai pritaikykite klasifikavimo problemoms spręsti. Norėdami klasifikuoti naują vaizdą, naudokite klasifikuoti. Pavyzdį, parodantį, kaip klasifikavimui naudoti iš anksto parengtą tinklą, žr. Vaizdo klasifikavimas naudojant „GoogleLeNet“.

Iš anksto paruoštą tinklą naudokite kaip funkcijų ištraukėją, naudodami sluoksnio aktyvavimą kaip funkcijas. Šiuos aktyvinimus galite naudoti kaip funkcijas mokydami kitą mašinų mokymosi modelį, pvz., Palaikomojo vektoriaus mašiną (SVM). Norėdami gauti daugiau informacijos, žr. Funkcijų išskyrimas. Pavyzdį žr. Vaizdo funkcijų ištraukimas naudojant iš anksto parengtą tinklą.

Paimkite sluoksnius iš tinklo, mokomo naudoti didelį duomenų rinkinį, ir sureguliuokite naują duomenų rinkinį. Norėdami gauti daugiau informacijos, žr. Mokymosi perkėlimas. Paprastą pavyzdį ieškokite Pradėti mokytis perkėlimo. Norėdami išbandyti daugiau iš anksto parengtų tinklų, žr. „Traukinio gilaus mokymosi tinklas naujų vaizdų klasifikavimui“.

Palyginkite iš anksto parengtus tinklus

Iš anksto paruošti tinklai turi skirtingas charakteristikas, kurios yra svarbios renkantis tinklą, pritaikytą jūsų problemai. Svarbiausios charakteristikos yra tinklo tikslumas, greitis ir dydis. Tinklo pasirinkimas paprastai yra kompromisas tarp šių savybių. Norėdami palyginti „ImageNet“ tikrinimo tikslumą su laiku, kurio reikia norint prognozuoti naudojant tinklą, naudokite toliau pateiktą diagramą.

Norėdami pradėti mokytis perkėlimo, pabandykite pasirinkti vieną iš greitesnių tinklų, pvz., „SqueezeNet“ arba „GoogLeNet“. Tada galite greitai pakartoti ir išbandyti įvairius nustatymus, pvz., Duomenų išankstinio apdorojimo veiksmus ir mokymo galimybes. Kai jaučiatės, kurie nustatymai veikia gerai, išbandykite tikslesnį tinklą, pvz., „Inception-v3“ ar „ResNet“, ir patikrinkite, ar tai pagerina jūsų rezultatus.

Aukščiau pateiktoje schemoje rodomas tik santykinis skirtingų tinklų greitis. Tikslus numatymas ir treniruočių kartojimo laikas priklauso nuo jūsų naudojamos aparatinės įrangos ir mažos partijos dydžio.

Geras tinklas yra labai tikslus ir greitas. Diagramoje rodomas klasifikavimo tikslumas, palyginti su prognozavimo laiku, kai naudojamas modernus GPU („NVIDIA & # x00AE Tesla & # x00AE P100“) ir mini partijos dydis - 128. Prognozavimo laikas matuojamas palyginti su greičiausiu tinklu. Kiekvieno žymeklio plotas yra proporcingas disko tinklo dydžiui.

„ImageNet“ tikrinimo rinkinio klasifikavimo tikslumas yra labiausiai paplitęs būdas matuoti „ImageNet“ mokomų tinklų tikslumą. Tinklai, kurie yra tikslūs „ImageNet“ tinkle, taip pat dažnai būna tikslūs, kai juos pritaikote kitiems natūralių vaizdų duomenų rinkiniams, naudodami perkėlimo mokymąsi arba funkcijų išskyrimą. Šis apibendrinimas yra įmanomas, nes tinklai išmoko išgauti galingas ir informatyvias savybes iš natūralių vaizdų, kurie apibendrina kitus panašius duomenų rinkinius. Tačiau didelis „ImageNet“ tikslumas ne visada tiesiogiai perkeliamas į kitas užduotis, todėl verta išbandyti kelis tinklus.

Jei norite atlikti numatymą naudodamiesi ribota aparatine įranga arba platinti tinklus internete, taip pat atsižvelkite į tinklo dydį diske ir atmintyje.

Tinklo tikslumas

Yra keli būdai apskaičiuoti klasifikavimo tikslumą „ImageNet“ patvirtinimo rinkinyje, o skirtingi šaltiniai naudoja skirtingus metodus. Kartais naudojamas kelių modelių ansamblis, o kartais kiekvienas vaizdas vertinamas kelis kartus, naudojant kelis pasėlius. Kartais nurodomas tikslumas „top-5“, o ne standartinis („top-1“) tikslumas. Dėl šių skirtumų dažnai neįmanoma tiesiogiai palyginti tikslumo iš skirtingų šaltinių. Iš anksto apmokytų tinklų tikslumas „Deep Learning Toolbox & # x2122“ yra standartinis (viršutinis 1) tikslumas naudojant vieną modelį ir vieną centrinį vaizdo apkarpymą.

Įkelkite iš anksto parengtus tinklus

Norėdami įkelti „SqueezeNet“ tinklą, komandinėje eilutėje įveskite „squeezenet“.

Kituose tinkluose naudokite tokias funkcijas kaip „googlenet“, kad gautumėte nuorodas iš anksto paruoštiems tinklams atsisiųsti iš „Add-On Explorer“.

Šioje lentelėje pateikiami galimi iš anksto paruošti tinklai, mokomi „ImageNet“, ir kai kurios jų ypatybės. Tinklo gylis apibrėžiamas kaip didžiausias nuoseklių konvoliucinių arba visiškai sujungtų sluoksnių skaičius kelyje nuo įvesties sluoksnio iki išvesties sluoksnio. Visų tinklų įvestys yra RGB vaizdai.


Turinys

„For-loop“ sakinys yra prieinamas daugeliu būtinų programavimo kalbų. Net ignoruojant nedidelius sintaksės skirtumus, yra daug skirtumų tarp šių teiginių veikimo ir jų palaikomo išraiškingumo lygio. Paprastai „ciklai“ priskiriami vienai iš šių kategorijų:

Tradicinis ciklo redagavimas

Kalbų, tokių kaip ALGOL, Simula, BASIC, Pascal, Modula, Oberon, Ada, Matlab, Ocaml, F # ir kt. Ciklas, reikalingas valdymo kintamasis su pradžios ir pabaigos reikšmėmis ir atrodo maždaug taip:

Priklausomai nuo kalbos, vietoj lygybės ženklo gali būti naudojamas aiškus priskyrimo ženklas (o kai kurioms kalboms reikalingas žodis int net skaitiniu atveju). Taip pat gali būti įtraukta pasirinktinė žingsnio vertė (prieaugis ar sumažinimas ≠ 1), nors tikslios tam naudojamos sintaksės skirtingose ​​kalbose šiek tiek skiriasi. Kai kurioms kalboms reikia atskirai deklaruoti valdymo kintamąjį, kai kurioms nereikia.

Kita forma buvo išpopuliarinta C programavimo kalba. Tam reikalingos 3 dalys: inicijavimas (ciklo variantas), sąlyga ir perėjimas į kitą kartojimą. Visos šios trys dalys yra neprivalomos. [1] Šio tipo „kabliataškių kilpos“ atsirado iš B programavimo kalbos ir iš pradžių ją išrado Stephenas Johnsonas. [2]

Inicializavimo dalyje deklaruojami visi reikalingi kintamieji (ir paprastai jiems priskiriamos vertės). Jei deklaruojami keli kintamieji, visi jie turėtų būti to paties tipo. Sąlygos dalis patikrina tam tikrą sąlygą ir išeina iš ciklo, jei klaidinga. Kelionė į kitą kartojimo dalį atliekama tiksliai vieną kartą kiekvieną kartą, kai baigiasi ciklas. Tada kilpa kartojama, jei sąlyga vertinama kaip teisinga.

Čia pateikiamas tradicinio „C“ stiliaus „Java“ pavyzdys.

Šios kilpos taip pat kartais vadinamos skaitinis už kilpų kai prieštarauja foreach kilpos(žr. toliau).

Iteratorių pagrindu sukurtos kilpos Redaguoti

Šis „loop“ tipas yra skaitinio diapazono „for-loop“ tipo apibendrinimas, nes jis leidžia išvardyti elementų rinkinius, išskyrus skaičių sekas. Paprastai jam būdingas implicitinio arba aiškaus iteratoriaus naudojimas, kai ciklo kintamasis įgauna kiekvieną iš sekos ar kitokio duomenų rinkinio reikšmių. Tipiškas „Python“ pavyzdys yra:

Kai „some_iterable_object“ yra duomenų rinkinys, palaikantis numanomą kartojimą (pvz., Darbuotojų vardų sąrašas), arba iš tikrųjų gali būti pats iteratorius. Kai kuriose kalbose tai yra be kitos „for-loop“ sintaksės, visų pirma, PHP turi tokio tipo kilpas kiekvienos pavadinime, taip pat trijų išraiškų „for-loop“ (žr. Toliau) po pavadinimu.

Vectorized for-loops Redaguoti

Kai kurios kalbos siūlo „for-loop“, kuris veikia lygiagrečiai apdorodamas visas iteracijas, pavyzdžiui, FORTRAN 95 raktinis žodis „all all“, kuris aiškina, kad visi dešinės pusės posakiai vertinami anksčiau bet koks atliekamos užduotys, kurios skiriasi nuo aiškios iteracijos formos. Pavyzdžiui, šiame pseudokodo fragmente esančiame for sakinyje, apskaičiuojant naują A (i) vertę, išskyrus pirmąją (su i = 2) nuoroda į A (i - 1) gaus naują reikšmę, kuri buvo buvo įdėti ten į ankstesnį žingsnį. Visų versijų versijose kiekvienas skaičiavimas nurodo tik originalų, nepakeistą A.

Skirtumas gali būti reikšmingas.

Kai kurios kalbos (pvz., FORTRAN 95, PL / I) taip pat siūlo masyvo priskyrimo sakinius, kurie leidžia praleisti daugelį „for-loop“. Taigi pseudokodas, pvz., A: = 0, nustatys visus masyvo A elementus į nulį, neatsižvelgiant į jo dydį ar matmenį. Kilpos pavyzdys gali būti pateiktas kaip

Ar kompiliatoriaus vadove nebus aiškiai aprašyta, ar tai bus teikiama pagal „for-loop“, ar „for all-loop“, ar dar ką nors.

Sudėtinis kilpų redagavimas

Įvedus su ALGOL 68 ir po PL / I, tai leidžia sujungti testą su ciklo iteracija, kaip

Tai yra, ciklo kintamajam priskiriama vertė i ir tik tuo atveju, jei o išraiška yra tiesa bus vykdomas kilpos kūnas. Jei rezultatas būtų melagingas „for-loop“ vykdymas sustoja trumpai. Suteikta ciklo kintamojo vertė yra apibrėžta po ciklo nutraukimo, tada aukščiau pateiktame sakinyje bus surastas pirmasis nepagrįstas masyvo elementas A (o jei tokio nėra, jo vertė bus N + 1), arba, esant tinkamoms variacijoms, pirmasis ne tuščias simbolis eilutėje ir pan.

Programuodami kompiuterį a kilpos skaitiklis yra kintamasis, valdantis kilpos iteracijas (kompiuterio programavimo kalbos konstrukcija). Jis taip pavadintas, nes dėl daugelio šio konstrukto panaudojimų kintamasis įgyja sveikųjų skaičių reikšmių diapazoną kai kuriose tvarkingose ​​sekose (pvz., Pradedant nuo 0 ir baigiant 10 po žingsnį po 1)

Ciklo skaitikliai keičiasi su kiekviena kilpos iteracija, suteikiant kiekvienai atskirai iteracijai unikalią vertę. Ciklo skaitiklis naudojamas nuspręsti, kada kilpa turėtų baigtis, o programos srautas tęsiamas kitoje instrukcijoje po ciklo.

Bendra identifikatoriaus pavadinimo tvarka yra ta, kad ciklo skaitiklis naudoja kintamųjų pavadinimus i, jir k (ir taip, jei reikia), kur i būtų labiausiai išorinė kilpa, j kita vidinė kilpa ir tt Atvirkštinę tvarką taip pat naudoja kai kurie programuotojai. Paprastai manoma, kad šis stilius atsirado dėl ankstyvo FORTRAN programavimo [ reikalinga citata ], kur šie kintamųjų pavadinimai, prasidedantys šiomis raidėmis, buvo netiesiogiai deklaruojami kaip sveikojo tipo, ir taip pat akivaizdūs kilpų skaitiklių pasirinkimai, kurie buvo reikalingi tik laikinai. Praktika tęsiasi nuo matematinės žymėjimo, kai dažnai yra sumų ir daugybos indeksai i, jir tt Konvencijos variantas yra pasikartojančių raidžių naudojimas indeksui, ii, jjir kk, nes tai leidžia lengviau ieškoti ir pakeisti paiešką nei naudojant vieną raidę. [3]

Redagavimo pavyzdys

C kodo, susijusio su įdėtomis kilpomis, pavyzdys, kur yra kilpų skaitiklio kintamieji i ir j:

Įrodyta, kad įdėta kilpa, kaip ir aukščiau pateiktame pavyzdyje, per laiko vienetą atlieka daugiau skaičiavimų nei ciklas be jos. Šis nuo mašinos nepriklausomas optimizavimas reiškia, kad įdėta ciklo linija bus baigta greičiau, atsižvelgiant į tą patį skaičiavimų skaičių. Tai yra pranašumas, į kurį įdėta kilpa, o ne ciklas, kuris elgiasi skirtingai. [4]

Dėl kilpų C taip pat galima spausdinti žodžio atvirkštinę dalį. Kaip:

Čia, jei įvestis yra „Apple“, išvestis bus „elppa“.

Naudoti kaip begalines kilpas Redaguoti

Šis „C“ stiliaus ciklas paprastai yra begalinės kilpos šaltinis, nes pagrindinius iteracijos etapus visiškai valdo programuotojas. Tiesą sakant, kai yra numatytos begalinės kilpos, galima naudoti tokio tipo „loop“ (su tuščiomis išraiškomis), pavyzdžiui:

Šis stilius naudojamas vietoj begalinio, o (1) ciklo, kad būtų išvengta tipo konversijos įspėjimo kai kuriuose C / C ++ kompiliatoriuose. [5] Kai kurie programuotojai teikia pirmenybę trumpesnei () formai, o ne semantiškai ekvivalentiškai, bet verbiškesnei, o (teisingai) formai.

Ankstyvas išėjimas ir tęsimas Redaguoti

Kai kurios kalbos taip pat gali pateikti kitus patvirtinamuosius teiginius, kurie, jei yra, gali pakeisti ciklo iteracijos eigą. Tarp jų yra lūžio ir tęsinio teiginiai, rasti C ir jo dariniuose. Pertraukos sakinys sukelia vidinės dalies ciklo nutraukimą nedelsiant. Tęstinis sakinys iškart pereis į kitą kartojimą be tolesnės pažangos per dabartinės iteracijos ciklo kūną. „A for“ pareiškimas taip pat baigiasi, kai įvykdomas pertraukos, „goto“ ar „return“ sakinys pareiškimo turinyje. [Wells] Kitos kalbos gali turėti panašius teiginius arba kitaip suteikti būdų pakeisti pažangą cikle, pvz., FORTRAN 95:

Kai kurios kalbos siūlo papildomas galimybes, pavyzdžiui, įvardyti įvairius kilpų sakinius, kad naudojant kelias įdėtas kilpas neabejotų, kuri kilpa yra susijusi. Pavyzdžiui, „Fortran 95“:

Taigi, kai vidinėje kilpoje aptinkama „bėda“, CIKLAS X1 (ne X2) reiškia, kad bus praleistas kitas I kartojimas, ne J. Kompiliatorius taip pat tikrins, ar kiekvienas END DO turi savo etiketę atitinkančią etiketę: tai nėra tik dokumentavimo pagalba. Programuotojas vis tiek turi teisingai užkoduoti problemą, tačiau kai kurios galimos klaidos bus užblokuotos.

Ciklo kintamojo apimtis ir semantika Redaguoti

Skirtingos kalbos nurodo skirtingas taisykles, kokią vertę kilpos kintamasis turės nutraukdamas savo kilpą, ir kai kurios mano, kad ji „tampa neapibrėžta“. Tai leidžia kompiliatoriui generuoti kodą, kuris palieka bet kokią reikšmę kilpos kintamajame, o gal net palieka nepakitusią, nes kilpos reikšmė buvo laikoma registre ir niekada nebuvo saugoma atmintyje. Faktinis elgesys gali skirtis net atsižvelgiant į kompiliatoriaus optimizavimo parametrus, kaip ir kompiliatoriuje „Honywell Fortran66“.

Kai kuriomis kalbomis (ne C ar C ++) ciklo kintamasis yra nekintamas ciklo kūno srityje, o bet koks bandymas pakeisti jo vertę laikomas semantine klaida. Tokios modifikacijos kartais yra programuotojo klaidos pasekmė, kurią, atlikus, gali būti labai sunku nustatyti. Tačiau tikriausiai kompiliatorius aptiks tik akivaizdžius pokyčius. Situacijas, kai ciklo kintamojo adresas perduodamas kaip argumentas paprogramei, labai sunku patikrinti, nes įprastas elgesys kompiliatoriui apskritai yra nežinomas. Keletas „Fortran“ stiliaus pavyzdžių:

Ribų koregavimas Redaguoti

Kaip indekso kintamasis gali būti modifikuojamas „for-loop“, taip pat gali keistis jo ribos ir kryptis. Bet neaišku. Kompiliatorius gali užkirsti kelią tokiems bandymams, jie gali neturėti jokio poveikio arba netgi tinkamai veikti - nors daugelis pareišktų, kad tai padaryti būtų neteisinga. Apsvarstykite tokį teiginį kaip

Vertių diapazonų sąrašas Redaguoti

PL / I ir Algol 68 leidžia naudoti kilpas, kuriose kilpos kintamasis kartojamas vertybių diapazonų sąraše, o ne viename diapazone. Šis PL / I pavyzdys atliks kilpą naudodamas šešias i reikšmes: 1, 7, 12, 13, 14, 15:

„For-loop“ paprastai prilygsta „while-loop“:

kaip rodo kintamųjų išvestis.

Atsižvelgiant į veiksmą, kurį reikia pakartoti, pavyzdžiui, penkis kartus, skirtingų kalbų ciklai bus parašyti skirtingai. Trijų išraiškų for-loop sintaksė yra beveik identiška visomis ją vartojančiomis kalbomis, įvertinus skirtingus blokų nutraukimo stilius ir pan.

1957: FORTRAN Redaguoti

Šie du pavyzdžiai elgiasi lygiaverčiai trijų argumentų „loop“ kitoms kalboms atveju, inicijuodami skaitiklio kintamąjį į 1, padidindami po 1 kiekvieną kilpos iteraciją ir sustodami ties penki (imtinai).

„Fortran 77“ (arba naujesnėje versijoje) tai taip pat gali būti parašyta taip:

Žingsnio dalis gali būti praleista, jei žingsnis yra vienas. Pavyzdys:

1958: Algol Edit

Pirmą kartą „Algol“ buvo įformintas ataskaitoje „Algol58“.

1960: COBOL Redaguoti

COBOL buvo įformintas 1959 m. Pabaigoje ir buvo daug išplėtotas. Jis naudoja veiksmažodį PERFORM, kuris turi daug variantų. Iš pradžių visos kilpos turėjo būti iš eilės, o iteruotas kodas užima atskirą pastraipą. Nepaisant kintamųjų deklaravimo ir inicializavimo poreikio, COBOL atitikmuo a dėl-lai būtų.

Devintajame dešimtmetyje pridėjus eilutes ir „struktūrizuotus“ teiginius, tokius kaip „END-PERFORM“, dėl-apvaliau su labiau pažįstama struktūra.

Jei veiksmažodyje PERFORM yra pasirinktinis sakinys TEST AFTER, gaunama kilpa yra šiek tiek kitokia: kilpos korpusas vykdomas bent kartą, prieš bet kokį bandymą.

1964: PAGRINDINIS redagavimas

BASIC kilpos kartais vadinamos kitomis kilpomis.

Atkreipkite dėmesį, kad pabaigos ciklo žymeklis nurodo indekso kintamojo pavadinimą, kuris turi atitikti indekso kintamojo pavadinimą for-loop pradžioje. Kai kurios kalbos (PL / I, FORTRAN 95 ir vėlesnės) leidžia „for-loop“ pradžioje sakinį, kurį kompiliatorius gali suderinti su tuo pačiu tekstu atitinkamame pabaigos ciklo sakinyje. „Fortran“ taip pat leidžia „EXIT“ ir „CYCLE“ sakiniams įvardyti šį tekstą kilpų lizde, todėl paaiškėja, kuri kilpa yra skirta. Tačiau šiomis kalbomis etiketės turi būti unikalios, todėl iš eilės einančios kilpos, kuriose naudojamas tas pats indekso kintamasis, negali naudoti to paties teksto ir etiketė negali būti tokia pati kaip kintamojo pavadinimas, pavyzdžiui, kilpos indekso kintamasis.

1964: PL / I Redaguoti

1968: Algol 68 Redaguoti

Algol68 turi tai, kas buvo laikoma universali kilpa, visa sintaksė yra:

Be to, vieną iteracijos diapazoną galima pakeisti tokių diapazonų sąrašu. Yra keletas neįprastų konstrukcijos aspektų

Vėlesnis pratęsimai pagal standartą Algol68 leido sintaksinį elementą pakeisti aukštyn ir žemyn, kad būtų pasiekta nedidelė optimizacija. Tie patys kompiliatoriai taip pat įtraukė:

iki vėluojančio ciklo nutraukimo. foreach dirbti lygiagrečiai.

1970: Pascal Edit

Sumažinus (skaičiuojant atgal), vietoj to, naudojamas „downto“ raktinis žodis, kaip:

Skaitmeninis ciklo diapazonas skiriasi kiek labiau.

1972: C / C ++ Redaguoti

Leidinys ISO / IEC 9899: 1999 (paprastai žinomas kaip C99) taip pat leidžia pradines deklaracijas apie kilpas. Visi trys „loop“ skyriai yra neprivalomi.

1972 m .: „Smalltalk“ redagavimas

Priešingai nei kitomis kalbomis, „Smalltalk“ programoje „for-loop“ nėra kalbos konstrukcija, bet klasėje „Numeris“ apibrėžta kaip metodas, turintis du parametrus - galutinę vertę ir uždarymą, kaip pradinę vertę naudojant save.

1980 m .: Ada Edit

The išėjimas sakinys gali būti naudojamas norint išeiti iš ciklo. Kilpos gali būti paženklintos etiketėmis ir išėjimas gali palikti specialiai pažymėtą kilpą įdėtų kilpų grupėje:

1980: Klevo redagavimas

Klevas turi dvi for-loop formas: viena verčių diapazono kartojimui, kita - konteinerio turinio kartojimui. Vertių diapazono forma yra tokia:

Visos dalys, išskyrus padaryti ir od yra neprivalomi. The dėl i dalis, jei yra, turi būti pirmoji. Likusios dalys ( nuo f , pateikė b , į t , kol w ) gali būti rodomi bet kokia tvarka.

Kartojimas per konteinerį atliekamas naudojant šią kilpos formą:

The į c sąlygoje nurodomas sudėtinis rodinys, kuris gali būti sąrašas, rinkinys, suma, produktas, neįvertinta funkcija, masyvas arba objektas, įgyvendinantis iteratorių.

„For-loop“ gali būti nutraukta od , galas arba pabaigos padaryti .

1982 m .: „Maxima CAS“ redagavimas

„Maxima CAS“ taip pat galima naudoti ne sveikojo skaičiaus reikšmes:

1982 m .: „PostScript“ redagavimas

„For-loop“, parašyta kaip [pradinis] [prieaugis] [riba] <. > inicijuojant vidinį kintamąjį, vykdomas kūnas tol, kol vidinis kintamasis yra ne didesnis kaip ribinis (arba ne mažesnis, jei prieaugis yra neigiamas) ir kiekvienos iteracijos pabaigoje padidina vidinį kintamąjį. Prieš kiekvieną iteraciją vidinio kintamojo vertė stumiama ant kamino. [6]

Taip pat yra paprastas pakartotinis ciklas. Pakartojimo ciklas, parašytas kaip X <. > pakartoti, tiksliai pakartoti kūną X kartus. [7]

1983: Ada 83 ir naujesni redaguoti

1984 m .: „MATLAB“ redagavimas

Po ciklo šiame pavyzdyje n būtų 5.

Kadangi i naudojamas įsivaizduojamam vienetui, jo naudoti kaip ciklo kintamąjį nerekomenduojama.

1987: Perl Edit

(Atkreipkite dėmesį, kad „yra daugiau nei vienas būdas tai padaryti“ yra Perlo programavimo šūkis.)

1988 m .: „Mathematica Edit“

Konstrukcija, atitinkanti daugumos kitų kalbų „for-loop“, „Mathematica“ vadinama „Do“

„Mathematica“ taip pat turi „For“ konstrukciją, kuri imituoja „C“ tipo kalbų for-loop

1989: Bashas Redaguoti

Atkreipkite dėmesį, kad tuščia kilpa (t. Y. Be jokių komandų tarp do ir done) yra sintaksės klaida. Jei pirmiau nurodytose kilpose buvo tik komentarai, vykdant gautų pranešimą „sintaksės klaida šalia netikėtos žetonos„ padaryta ““.

1990: Haskell Edit

Integruotas imperatyvas forM_ priskiria monadinę išraišką į sąrašą, kaip

arba gauti kiekvieno iteracijos rezultatą kaip sąrašą

Bet, jei norite išsaugoti [1..5] sąrašo vietą, autentiškesnis monadikas forLoop_ statybą galima apibrėžti kaip

1991 m .: „Oberon-2“, „Oberon-07“ arba „Component Pascal Edit“

Atkreipkite dėmesį, kad originalo „Oberon“ kalba „for-loop“ buvo praleista bendresnės „Oberon“ kilpos konstrukcijos naudai. For-loop buvo vėl įvestas Oberon-2.

1991: „Python“ redagavimas

„Python“ nėra klasikinės ciklo, o „foreach“ kilpa naudojama kartojant „builtin range“ () funkcijos išvestį, kuri grąžina kartojamą sveikųjų skaičių sąrašą.

Naudojant diapazoną (6), ciklas bus vykdomas nuo 0 iki 5.

1993: AppleScript Edit

You can also iterate through a list of items, similar to what you can do with arrays in other languages:

You may also use exit repeat to exit a loop at any time. Unlike other languages, AppleScript does not currently have any command to continue to the next iteration of a loop.

1993: Lua Edit

For-loops can also loop through a table using

to iterate numerically through arrays and

to iterate randomly through dictionaries.

Generic for-loop making use of closures:

1995: CFML Edit

Script syntax Edit

Using a list of string values:

The above list example is only available in the dialect of CFML used by Lucee and Railo.

Tag syntax Edit

Using a "list" of string values:

1995: Java Edit

For the extended for-loop, see Foreach loop

1995: JavaScript Edit

JavaScript supports C-style "three-expression" loops. The break and continue statements are supported inside loops.

Alternatively, it is possible to iterate over all keys of an array.

1995: PHP Edit

This prints out a triangle of *

1995: Ruby Edit

Ruby has several possible syntaxes, including the above samples.

1996: OCaml Edit

1998: ActionScript 3 Edit

2008: Small Basic Edit

2008: Nim Edit

Nim has a foreach -type loop and various operations for creating iterators. [9]


3 Building NFC JavaScript Actions

To build NFC JavaScript actions, you will do the following:

  1. Create a Mendix app.
  2. Build a native mobile app.
  3. Add a native dependency.
  4. Make two NFC JavaScript actions.
  5. Implement the NFC Scanner in your app.

This tutorial&rsquos commands assume your software is installed in the following places:

  • GitHub working folder: *C:github*
  • Native Builder: *C: ative-builder*
  • Studio Pro: *C:Program FilesMendix8.6.0.715*
  • Mendix app: *C:MendixApps*

3.1 Creating a Mendix App

Follow these instructions to set up your NFC app:

  1. Open Mendix Studio Pro.
  2. Pasirinkite Failas & gt New App.
  3. Select the Native Mobile Quickstart app (also available online here).
  4. Spustelėkite Use this starting point.
  5. Name your app NativeNFC and click Create App to close the dialog box.
  6. Rename module NativeMobile į NativeNFC. You will add your implementation In this module.
  7. Right-click the module and select Add other & gt JavaScript action. Name the new JavaScript action HasNFCSupport. You will create the implementation later.
  8. Atidaryk Home_Native page and add some welcome text for you test app.
  9. Add an action button with caption Scan NFC Tag on your home page.
    a. Right-click your home page and click Add widget.
    b. Pasirinkite Call nanoflow button.
    c. Spustelėkite naujas.
    d. Nustatyti vardas į ACT_ReadNFCTag.
    e. Change the button&rsquos caption to Read NFC Tag.
    f. Save the page.
    g. Atviras ACT_ReadNFCTag.
    h. Drag and drop the HasNFCSupport JavaScript action onto this nanoflow.
    i. Save your nanoflow.
  10. Spustelėkite Publish to deploy to the sandbox.

Your Mendix app should looks something like this:

3.2 Building a Native Custom Developer App

When developing a native mobile app, you can use the Make it Native app to quickly get started. However, this app is bundled with a limited number of functionalities. This tutorial&rsquos app requires an NFC module in order to access the native NFC capabilities. This can only be achieved by using the Native Builder. The Native Builder can create a custom developer app which you use to see and test your app.

In this section, you will create a normal custom developer app to learn the process. In the subsequent section Installing a Dependency in Your Custom Developer App you will create a tailored custom developer app suited for NFC tasks.

Now you will build a native custom developer app and install it on your phone:

    If you do not have your GitHub and App Center keys, follow the Getting Your Tokens section of Deploy Your First Mendix Native Mobile App with the Native Builder CLI to get your authentication codes.

Complete the Preparing Your App section of How to Deploy Your First Mendix Native Mobile App using these parameters:

As a result of the prepare command your app is created in App Center:

A new repository is created in your GitHub account:

To build the app for the first time, complete the Build Your Developer App section of Create a Custom Developer App using this build command:

The project name should match the app names from your prepare command.

Your apps are now available in the *C: ative-builderuilds* folder, where you will find Native-NFC-App-Android-1.zip for an Android app and Native-NFC-App-iOS-1.zip for an iOS app.

  1. During a build, the free version of the App Center will time out if the build exceeds 30 minutes.
  2. By default, Native Builder builds both an iOS and Android apps. To build faster, for one platform specifically, add the parameter --platform android or --platform ios to the build command.
  1. Install the app on your device. For more information on app installation, see the Distributing section of How to Deploy Your First Mendix Native Mobile App.
  2. Open your app on your testing device.
  3. Tap your NFC button. You will incur this error: JavaScript action was not implemented. You will implement your action later.

3.3 Installing a Dependency in Your Custom Developer App

In this section you will install the external library react-native-nfc-manager which makes adding NFC functionality easier. Mendix Studio Pro 8.6 is based on React Native version 0.59, which will influence the selected version of the library. You will make all changes to the master branch, because with each build a new branch is created ( build/ ) from master with your latest changes.

The dependency is split into two parts: the native operating system part and the client JavaScript part. To add the dependency for the app, do the following:

  1. Open a command line interface (CLI) and change directory to your GitHub project folder: cd C:/github/ .
  2. Use your repository URL to clone the files on your machine with the command git clone https://github.com/user-name/native-nfc-app .
  3. Open the folder containing your cloned code: cd native-nfc-app .
  4. To install all its current dependencies, use the command npm install .
  5. Install the required library as a dependency with the command npm install --save [email protected] . Note the version after the @ sign. Versions 2 and higher are not supported on Mendix Studio Pro 8.6.

Next you will use the react-native link command to link your module. This command works for React Native versions below 0.60. It is replaced in versions 0.60 and higher with auto-linking. Auto-linking does not require any linking or code changes. However, both processes have downsides and not every module supports them.

To integrate the module into the template, you will need to make a few code changes. Using link you can do most changes automatically with the React Native CLI. If you wish to link automatically, follow the Setting Up Automatic Linking section below. If you wish to link manually, see the Setting Up Manual Linking section below.

Regardless of which linking method you choose, complete the following steps first:

  1. Install the React Native CLI using the command npm install -g [email protected] (note that the versions should match the React Native version of your Mendix version).
  2. Link the new module with the command react-native link react-native-nfc-manager .

3.3.1 Setting Up Automatic Linking

You should see successes from the previous linking commands. Even when your linking shows successes in your CLI, linking problems may have occurred with your linked apps. To truly validate success, complete the following steps:

  1. Atviras C:github ative-nfc-appandroidappsrcmainjavacommendix ativetemplateMainApplication.java.
  2. Make sure the following is included in the list of imports: import community.revteltech.nfc.NfcManagerPackage .

You can skip the Manual Linking section and move on to the Using the Modules section now.

3.3.2 Setting Up Manual Linking

This section shows how to link manually. This method replaces the linking steps in the Installing a Dependency in Your App section above and could be used for validating if the react-native link command succeeded.

To link for Android devices, do the following:

To expose the library to the template, you must link it using Gradle. Atviras C:github ative-nfc-appandroidsettings.gradle, then add this line of code before include ':app' , ':mendixnative-release' :

To use the new gradle module in C:github ative-nfc-appandroidappuild.gradle, add this to your list of dependencies:

Now the main application needs to initialize the NFC manager. Į C:github ative-nfc-appandroidappsrcmainjavacommendix ativetemplateMainApplication.java add an item to the Arrays.<ReactPackage>asList , add a comma after the other dependency, and add the new NfcManagerPackage() :

When you add this file in Android Studio, the import is automatically added. If you use a plain text editor, add this import to your other imports: import community.revteltech.nfc.NfcManagerPackage .

To link for iOS devices, do the following:

  1. Atviras C:github ative-nfc-appiosPodfile.
  2. In the abstract_target section before end , add a new line with pod 'react-native-nfc-manager', :path => '../node_modules/react-native-nfc-manager' .

For more information about linking, see the following resources:

  • Facebook&rsquos React Native Linking Documentation
  • The Medium post Demystifying React Native Modules Linking
  • The GitHub React Native community post Autolinking

3.3.3 Using the Modules

For Android devices, you must add code which checks if a user permits the module. Do this by adding uses permission in the android/app/src/main/AndroidManifest.xml file (specifically in the section above the <application line):

For iOS you have to add permission to use NFC capabilities:

Į Signing & Capabilities, spustelėkite Capability and select Near Field Communication Tag Reading

Add a usage description so the user can give their permission to use the NFC reader.
a. Į ios/nativeTemplate/Info.plist right-click.
b. Pasirinkite Add Row.
c. Title the key NFCReaderUsageDescription with the description: To be able to read NFC tags, please accept.

3.3.4 Committing to the Template

For both platforms, you need to store your changes in the template. Push your changes to GitHub (where the Native Builder can use them later):

  1. To stage the changes, use the command git add . while in C:github ative-nfc-app. You can check the staged files with the command git status .
  2. Commit the files with the command git commit -m "Add NFC Manager dependency" .
  3. Now the files are committed, but they are only stored locally on your machine. Push them to your repository with the command git push . This will make the changes available so that the Native Builder can create a new app with NFC support.

3.4 Installing a Dependency in Your App

The dependency is split into two parts: the native device part, and the client JavaScript part. In this section we will add the dependency JavaScript for the client bundle. For the bundling we need add the dependency builder can add the react-native-nfc-manager JavaScript code.

In your CLI, open the module folder which contains your JavaScript action:

Make sure HasNFCSupport.js is in this folder so you know you are in the right place.

Install the dependency with the command npm install [email protected] .

This will create a node_module folder inside your actions aplanką. There is a known issue that when you try to commit the node_modules folder using Apache Subversion, there could be problems if your commit contains a large number of files. To solve this, try removing unnecessary files before committing.

3.4.1 Declaring Native Dependencies

To make Mendix install and link native dependencies automatically while creating production-like builds of a native app, create JSON files next to your JavaScript actions: HasNFCSupport.json and ReadNFCTag.json . Define the same native dependencies in each of them:

3.5 Creating NFC JavaScript Actions

JavaScript actions for web and native platforms are similar. However, they have their own set of dependencies which they can build on.

Build an action to check if a device supports NFC:

  1. Atidaryk HasNFCSupport JavaScript action.
  2. Change the Return type į Boolean.

Add this import above the EXTRA CODE block:

Replace the content of the USER CODE block with the following:

  • The NativeModules contains all loaded modules. This allows you to check if the app has the module installed. This will throw an error when the action is used in the Make it Native app.
  • The NfcManager is imported from your newly added module. The isSupported functions check if NFC is supported by the hardware. They return a Promise that will resolved to a Boolean value to indicate if NFC is supported.

When finished, your code will look like this:

Optionally, click the Expose as nanoflow action tab, select Expose as nanoflow actionir Pasirinkite an icon for your JavaScript action.

Now make an JavaScript action to read the NFC tag information:

  1. Create a JavaScript action named ReadNFCTag.
  2. Pasirinkite Return type & gt String.

Spustelėkite Code tab, and add the import above the EXTRA CODE block:

Add the following code to the USER CODE block:

Here you return a promise that resolves a string value. The nanoflow will wait until the resolve function is called. The registration listens for tags that are picked up by the reader. When the callback function is executed as a tag is found, un-register the listener to stop listening for other tags. The payload is decoded from a byte array into text. When the resolve function is called with the text parameter, that nanoflow will receive this value as the return parameter.

When finished, your code will look like this:

Optionally, click the Expose as nanoflow action tab, select Expose as nanoflow actionir Pasirinkite an icon for your JavaScript action.

3.6 Using NFC JavaScript Actions

Make a nanoflow to use your new actions:

To make the nanoflow shown above, do the following:

  1. Atviras ATC_ReadNFCTag.
  2. Double-click the Has NFC Support action, set the Variable name kaip HasNFCSupport, and click Gerai.
  3. Right-click the Has NFC Support action, select Set error handling, and set the type to Custom without rollback.
  4. Create a Show message action, set the type as Error, and set the template as: Error occurred while checking NFC support: . Add a parameter containing $latestError.
  5. Connect the Has NFC Support activity to the Show message veikla. Right-click the connection and select Set as error handler.
  6. Add an end event under your error message, then connect the message to the end event.
  7. Add a Decision action. In its Expression check for the return variable with the expression $HasNFCSupport, write Has NFC support? į Caption, then click Gerai. Add an end event under this show message activity.
  8. If a device is not supported, show a message of type warning. Create a Show message action with template text Sorry, your device does not support NFC. and then connect this error message to the decision.
  9. If a device is supported, add the Read NFC Tag action and store the response in the variable TagValue .
  10. Set the sequence flows from the decision to True (going left) and False (going down).
  11. Right-click the Read NFC Tag action and select Set error handling. Set the type to Custom without rollback.
  12. Create a Show message action, set the type as error, and set the template text to Error occurred while reading an NFC tag: . Naudokite $lastError as the single parameter.
  13. Connect the Read NFC Tag activity with a Show message veikla. Right-click it, and select Set as error handler.
  14. Connect this Show message action to an end point.
  15. Create a Show message action, set the type as information, and set the template as Your NFC tags says: . Naudokite $TagValue as a parameter.
  16. Optionally you can add Show progress ir Hide progress activities to give your user more information while using the NFC reader. This action can be found in the Nanoflow Commons module.
  17. Deploy your app to the sandbox.

3.7 Writing an NFC Tag

Now you have a way to read NFC NDEF tags. Next you will write some text for your tag. You can create a JavaScript action for this yourself or use an existing tool. If you use an existing tool, we recommend NFC Tools Android or NFC Tools iOS.

To write your own NFC tag, do the following:

  1. Install the NFC Tools app on your device.
  2. Open the NFC Tools app.
  3. Scan your tag. The Technologies available section should state it supports Ndef. The Writeable section should show Taip.
  4. Tap WRITE, tap Add a record, and tap Tekstas.
  5. Enter the text Hello Mendix Developer! and tap Gerai.
  6. Tap Write / 30 Bytes.

Scan your tag. You will see a Write complete dialog box:

This dialog box is your phone&rsquos operating system recognizing the NFC tag. On Android devices, you will see a success message anytime you touch an NFC tag to your device. What you truly need to test is your app&rsquos NFC scanning after tapping its button. You will be able to do this on all platforms: on iOS things work as expected, and on Android an app scanning NFC takes priority over the operating systems&rsquo scanning.

3.8 Rebuilding Your Native Mobile App

Now that you added NFC capability to your app&rsquos source code, you must rebuild your native mobile app and reinstall it on your device to use the new JavaScript actions.

Making software is an iterative process. If you integrate your own module or build your own actions, it is highly recommended to set up a system which allows you to iterate quickly. For more information on setting up a local development environment, see the Advanced Usage section of the Native Builder Reference Guide. This will require an Apple Mac with XCode for iOS and Android Studio for Android devices.

Run the following command to rebuild your NFC app:

This builder will use the configuration you set during the Install a Dependency in Your App section above.

After the build has successfully finished, the build file will be available in C: ative-builderuilds.

Uninstall the previous version of the app on your device.

Install the app on your device. For more information on installing an app on your device, see the Distributing section of Deploy Your First Mendix Native Mobile App.

Open the app, tap Scan tag, and scan your NFC tag. You should see a dialog box with the text you assigned to your tag:

Congratulations for completing this NFC tutorial! To go beyond the lessons you have learned, see the sections below.

3.9 Hardening the Code

Now you have a working NFC scanner. However, you can improve it for both Android and iOS.

On Android — NFC scanning can be switched off. Also, scanning should be canceled if the back button is clicked.

On iOS — Scanning can be canceled when the Ready to Scan dialog box is up.

To implement these capabilities, replace all the USER CODE in the ReadNFCTag JavaScript action with the following code, then repeat the steps in the Rebuilding Your App section above to build and install the updated app on your device:

At the beginning of the action on Android, the code checks if the NFC tag reader is switched off and throws an error if so. It creates a Promise with resolve and reject parameters. Note the async keyword before the function. This allows await to be used with an asynchronous function and lets them execute together while respecting their order in the code. The start will initialize the module and register a callback for iOS. This callback will be called when the NFC NDEF reader session becomes invalid, either because of the OS or because the Cancel button was tapped.

For Android, a listener for the hardware back button is included. When you tap it, you will stop listening for tags, and cancel the execution by calling the reject function. This way the nanoflow will receive an error that is caught by the error handler.

When the app is listening for a tag, you can switch off the NFC function in Android. This causes a state change that you will catch, and causes a rejection to the promise.

The second parameter of the registerTagEvent function is the instruction text which appears in the iOS Ready to Scan dialog box. After the tag is found by the reader, you have to stop the NFC manager. This way you stop listening for state changes on Android, and you stop listening for the session to close in iOS.

Congratulations on making your own native JavaScript action! Please use your own creativity to extend the NFC functionality or implement other modules with the lessons you have learned.