google map sdk ios swift / Unity 3D İçin Entegrasyonlar | Blog | Mobilist

Google Map Sdk Ios Swift

google map sdk ios swift

format!("write error: {}", err))}fnmain(){let args:Vec<String> = env::args().collect();let program = args[0].clone();if args.len() < 3{eprintln!("usage: {} <from> <to>", program);return;}ifletErr(err) = process(&args[1],&args[2]){eprintln!("{}", err)}}

kaynak

Kodumuzu build alıyoruz. İlk satır bağımlılığımız (paketi) yüklüyor ikinci satırda build alıyor.

rustup target add wasm32-wasi $ cargo build --target wasm32-wasi

kodumuzu wasmtime runtime ile çalıştırmayı deneyelim. Rust kodumuzdaki main fonksiyonu içindeki if bloğuna takıldık. Yani diyorki bana doya isimlerini ver.

wasmtime demo.wasm usage: demo.wasm <from><to>

Input doyamızı oluştuarlım argüment olarak uygulamıza geçelim. test.txt dosyanına hello world yazıp kaydtiikten sonra bunu input doayası olarak kullaıyoruz. Output olarak /tmp/somewhere.txt dosyasını kullanıyoruz.

Fakat bu sefer hata aldık. Busefer capability'nin yetersiz olduğunu söylüyor. Yani daha açık bir şekilde bir kullanıcı olarak test.txt dosyasını okuma ve yazma yetkimiz bile olsa bu dosyaya WebAssembly yazamayacağını söylüyor.

echo hello world > test.txt wasmtime demo.wasm test.txt /tmp/somewhere.txt error opening input test.txt: Capabilities insufficient

Bu sefer wasmtime'ın dir ve mapdir flag'lerini kullanarak modülün işlem yapabilceği dizinleri vermiş olacağız.

wasmtime --dir=. --mapdir=/tmp::/var/tmp demo.wasm test.txt /tmp/somewhere.txt cat /var/tmp/somewhere.txt hello world

Nokta (.) verdiğimiz dizin halihazırda host üzerinde çalıştığımız klasör, mapdir flag'inde ise host üzerindeki /var/tmp klasçrünü WebAssembly uygulamamızdaki /tmp klasörüne map ediliyor. Uygulama host üerindeki /var/tmp içini aslında göremiyor ancak oraya "somewhere.txt" dosyasını yazabiliyor. Eğer container teknolojileri ile ilgileniyorsanız dir ile belirttiğimiz dockerfile build ederken verdiğiniz context dizinine benzer, mapdir ise bind mount daki gibi bir dizini bağlamamızı sağlar.

Şimdi birde buna benzer bir uygulamayı NodeJS ile yapmaya çalışalım. Version 12 ile birlikte NodeJS WASI'yi destekliyor.

Yukarıda bahsetmiştik WASM yazmak için programlma dillerinden faydalanabilceğimiz gibi WebAssembly'nin sunmuş olduğu human readable text formatında da faydalanabiliriz. Örneğin alttaki wat kodunda standart output'a hello yazıyoruz.

İlk satırda fd_write modülü file descriptor oluşturmak için kullanılıyor.

(module (import"wasi_unstable""fd_write" (func$fd_write (parami32i32i32i32) (resulti32))) (memory1) (export"memory" (memory0)) (data (i32.const8) "hello\n") (func$main (export"_start") ;; io vector within memory (i32.store (i32.const0) (i32.const8)) (i32.store (i32.const4) (i32.const6)) (call$fd_write (i32.const1) ;; file_descriptor (i32.const0) ;; *iovs (i32.const1) ;; iovs_len (i32.const14) ;; nwritten ) drop;; drop the result from the stack ) )

Şimdi bu kodu NodeJS WASI kütüphanesini kullanarak çalıştıralım. Build alamk için wat2wasm programını (derleyisini de diyebiliriz) kullanabiliriz.

constfs=require('fs');const{WASI}=require('wasi');constwasi=newWASI({args: process.argv,env: process.env,preopens: {'/sandbox': '.'}});constimportObject={wasi_unstable: wasi.wasiImport};(async()=>{constwasm=awaitWebAssembly.compile(fs.readFileSync('hello.wasm'));constinstance=awaitWebAssembly.instantiate(wasm,importObject);wasi.start(instance);})();

Kodumuzu çalıştıralım.

node--experimental-wasi-unstable-preview1wasi-node.jshello

Ekrana hello geldiğini görebiliriz.

Burada NodeJs'in doğrudan WASI desteği var. Ancak WASI destei olmayan dillerde de runtime'ların desteği ile buna benzer kodlar yamzak mümkün.

Örneğin Wasmer runtime'ın javascript desteği mevcut. Alttaki kodda helloworld.wasm uygulamsının browser içinde nasıl çalıştırıldığını görebilirsiniz.

Örnekte sandbox file system için Wasmer'ın file system modülünün kullanıldığı görebilirsiniz.

import{WASI}from'@wasmer/wasi'importbrowserBindingsfrom'@wasmer/wasi/lib/bindings/browser'import{WasmFs}from'@wasmer/wasmfs'constwasmFilePath='/helloworld.wasm'// Path to our WASI moduleconstechoStr='Hello World!'// Text string to echoconstwasmFs=newWasmFs()letwasi=newWASI({args: [wasmFilePath,echoStr],// Environment variables that are accesible to the WASI moduleenv: {},// Bindings that are used by the WASI Instance (fs, path, etc...)bindings: { ...browserBindings,fs: wasmFs.fs}})// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// Async function to run our WASI module/instanceconststartWasiTask=asyncpathToWasmFile=>{// Fetch our Wasm Fileletresponse=awaitfetch(pathToWasmFile)letwasmBytes=newUint8Array(awaitresponse.arrayBuffer())// Instantiate the WebAssembly fileletwasmModule=awaitWebAssembly.compile(wasmBytes);letinstance=awaitWebAssembly.instantiate(wasmModule,{ ...wasi.getImports(wasmModule)});wasi.start(instance)// Start the WASI instanceletstdout=awaitwasmFs.getStdOut()// Get the contents of stdoutdocument.write(`Standard Output: ${stdout}`)// Write stdout data to the DOM}// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// Everything starts herestartWasiTask(wasmFilePath)

kaynak

Zannediyorum konunun anlaşılması için örnekler yeterli olmuştur.

Container Dünyasında WebAssembly

Konuya Docker'ın da kurucusu olan Solomon Hykes'ın tweet'leri ile başlayalım.

sh1.pngsh2.pngsh3.png

Özetle Solomon "Eğer 2008 yılında WASM ve WASI olsaydı bizim Docker'ı icat etmemize gerek kalmayabilirdi. WebAssembly sunucu taraflı Computation'ın geleceğidir." diyor. Devamında ise şuan için WebAssembly'nin Docker'ın yerine geçmeyeceğini ancak Linux ve Windows konteynerler ile birlikte çalışabileceğini hatta ileride belki de WASM tipindeki konteynerler'in en çok talep gören container tipi olabileceğini söylemiş.

Bildiğiniz üzere container'lar sadece oluşturuldukları işletim sisteminde çalışabilir. Örneğin image Windows base image kullanılarak oluşturulduysa sadece Windows üzerinden çalıştırılabilir. Ancak WebAssembly'in böyle bir sınırı yok. Ayrıca WebAssembly sağlam bir security izolasyona sahip. WebAssembly modülleri host runtime'ından izole kendi kapalı (sandboxed) ortamında çalışır. Browser runtime üzerinde tamamen browser'ın security policy'lerine uygun çalışırken browser dışında capability-based-security ile çalışır. En basit haliyle bu sistemde WASM modüllerinin her birine ne kadar yetki vereceğini modülü çağıranın kendisi karar verir.

sb.png

Bununla birlikte container'lardan farklı olarak, bir WebAssembly modülü önceden paketlenmiş bir dosya sistemi birlikte gelmez. Bunun yerine dosyalar, dizinler, ortam değişkenleri, saat ve diğer sistem kaynakları başlatma sırasında doğrudan WebAssembly modülüne eklenebilir. Bu da WebAssembly standartlarından biri olan WebAssembly System Interface'in (WASI) temel bir özelliğidir. Daha büyük bir orkestrasyon (Docker, Kubernetes vb) sisteminin parçası değil, bir çalışma zamanının parçasıdır. Yani doğası gereği izole olarak çalışır.

container-wa.pngresim kanak

WebAssembly'nin çok daha light weight bir yapı sunduğunu görebiliyoruz. İzolasyonun runtime üzerinde bir sandbox ile sağlanabiliyor olması hem daha hafif hem daha hızlı hem de kontrol edilebilir yapı sağladığını söyleyebiliriz. Her ne kadar Solomon WebAssembly'nin Docker'ın dolayısıyla container'ların yerini alamayacağını söylemiş olsa da gelecekte WebAssembly'nin gelişimiyle container teknolojilerinde de bir çok değişimi görebiliriz.

Alttaki resimde altta sağdaki kuruda wasm container'ının nasıl çalıştırldığını görebiliriz. Eğer buraya kadar bütün makaleyi okuduysanız buradaki wasmedge'ın runtime olduğunu tahmin etmişsinizdir.

docker-wasm.png

Eğer docker desktop kullanıyorsanız alttaki örneği çalıştırabilirsiniz.

docker run -dp 8080:8080 \ --name=wasm-example \ --runtime=io.containerd.wasmedge.v1 \ --platform=wasi/wasm32 \ michaelirwin244/wasm-example

Image oluturmak için dozkerfile örneği

FROM scratch COPY ./target/wasm32-wasi/release/wasm-docker.wasm /wasm-docker.wasm ENTRYPOINT [ "wasm-docker.wasm" ]

Daha sonra build alıp çalıştırabiliriz.

# build al docker buildx build --platform wasi/wasm -t wasm-docker:0.1 .# çalıştır docker container run --rm --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 wasm-docker:0.1

Container tarafındaki tek çalışma Docker ile sınırlı değil. Örneğin Kubernetes için bir service mesh çözümü olan Istio da kendi tarafında production'a çıkarttığı WebAssembly'ye dayalı çalışmaları var. Envoy proxy'yi extend edebilmek için WebAssembly'yi kullanarak bir önceki birincik extension mekanizması olan Mixer'i Proxy-Wasm ile değiştirmiş. Konu ile ilgili detayları resmi sayfasından takip edebilirsiniz.

istio.pngkaynak

Diğer taraftan doğrudan Kubernetes tarafında da çeşitli çalışmalar yapılıyor. Bunlardan bana en iddialı ve yaratıcı olanı Kruslet geldi. Kruslet WebAssembly çalıştırmak için Rust ile geliştirilmiş tam olarka Kubelet'in işini yapmak için gelişirilmiş bir araç. Container runtime yerine daha önce bahsettiğimiz wasmtime runtime'ını kullanarak WebAssembly pod'larını yönetir.

EKS, GKE, AKS, DigitalOcean, onprem ve diğer platformlar için kurulum dokümanları mevcut. Test etmek isterseniz alttaki linkleri takip edebilirsiniz.

Mobil Dünya

Daha önce bahsettiğimiz Blazor Framwork'ü ve Uno Platform WebAssembly ile nasıl cross platform uygulama geliştirilebileceğini gösteren çok iyi iki örnek. Bunlara benzer WebAssembly daha bir çok framework ve uygulama bulabilirsiniz.

Ancak asıl önemli olan WebAsembly'nin yeterli desteği görmesi şartıyla app store kültürünü değiştirebilcek potansiyelinin olması. Yazılan kodun her platformda çalışması ve WASI ve runtime'lar yardımıyla güvenlik ve sistem kaynalarını kullanabilme yeteneği cihazlarda uygun yapıların sağlanması ile daha zengin uygulamların ve oyunların yazılmasını sağlayabilir. Üstelik bunu bütün programlama dilleriyle yapmak mümkün olabilir.

Zaten cross platform uygulama geliştirilebildiğinden bahsetmiştik bu örnek oyunlar da aslında bu dünyada da birşey yapılabilceğinin kanıtı diyebiliriz.

Blockchain, Web3 ve Diğer Diğer Teknolojiler

WebAssembly ile ilgili diğer bir proje deFermyon firmasının geliştirmiş olduğu microservice framework'ü. Framework (spin) hakkında detaylı bilgi almak için quickstart sayfasını ziyaret edebilirsiniz.

Blockchain'e geçmeden önce mobil dünya için WebAssembly ne ifade ediyor onun hakkında da konuşalım biraz. IPhone ilk çıktığı yıllada Steve Jobs'ın app store yerine SPA/PWA gibi yapılarla yani HTML, CSS ve JavaScript ile geliştirme yapılması taraftarı olduğunu duymuşsunuzdur. Duymadıysanızda Google'da yapacağınız ufak bir arama ile bulabilirsiniz. Forbes dergisi konuyu bşr başlığında tartışmış. Ancak buradaki bakış açısı Steve Jobes'ın hatalı düşündüğü yönünde çünkü app store sayesinden Apple çok para kazandı. Ancak Mevzuya teknolojik gelişim yönünden bakacak olursak Steve Jobs'ın ne kadar doğru düşündüğünü anlayabiliyoruz. Belki o da fikrini ileride değiştirmişti onu bilmiyorum. Bugün web ve mobil düyansına bakacak olursak Apple ve Google app store'lara sıkışmış durumdayız. Standartları ve limitleri belirleyen koca dünyaqda sadece iki firma. En Basit haliyle bir push notificaiton göndermek istediğimizde bunu marketlerden bağımsız yapamıyoruz. Halbuki bu ekosistem SPA/WPA veya alternatif birşey geliştirilerek store bağımsız da yapılabilirdi. Şimdi bu fikre kaşı olanların "ama ama" diyecekelrini tahmin ediyorum. Ancak teknoloji bu tarafdan ilerleseydi yerşeye çare bulunabilirdi. Güvenilir onlarca, yüzlerce market kurulabilirdi. Browser'ları yetenekleri bu yönde geliştirlebilirdi. Ancak para tatlı geldi ve haklıda çıktılar. Son 10 yıla bakacak olursak zaten sadece store'lar dan kazanılan parlar milyar dolarları buluyor.

Ancak bütün bunlara rağmen ekosistem kendi yolunu çizmeye çalışıyor. Yaşanan bir çok olay, kişisel veri hakkında insanlarıvn ve ülkelerin bilinçlenmesi vb nedenlerden dolayı merkeziyetsiz yapılar hızla gelişiyor. Sadece Elon Musk'ın Twitter'ı satın almasında sonra gelişen olaylarla merkeziyetsiz sosyal medya plaformlarının kullanım oranları ciddi şekilde arttı. Bazı örnekleri aşağıdaki listede bulabilirsiniz. decentralization.png

Liste Kaynağı

Ayrıca bütün bu uygulamaları sadece kendi içinde değil örneğin sadece Mastadon kendi içinde değil diğerleri arasında da bilgi paylaşabilir. Yani Mastadon hesabınızı Fixefed üzerinden de paylaşabilir veya takip edebilirsiniz.

Bunu sağlayanda W3C tarafından standartları belirlenmiş olan ActivityPub protokolüdür. ActivityPub protokolü, ActivityStreams 2.0 veri formatına dayalı merkezi olmayan bir sosyal ağ protokolüdür. İçerik oluşturmak, güncellemek ve silmek için bir istemciden sunucuya API'nin yanı sıra bildirimler ve içerik iletmek için birleşik bir sunucudan sunucuya API sağlar.

Mevzu sadece sosyal medya ile sınırlı değil. Tabiri caizse tüm web ekosistemi web3 ile birlikte kendi kabuğunu kırmaya, bağımsız olmaya çalışıyor. Tabi burada web3 geldi iddiasında bulunmuyoruz. Daha uzun bir yolu olduğu gerçek ancak oraya giden yolda ekosistem bir değişim yaşıyor. Bu yolda bir çok teknoloji çıkacak bazıları yok olacak bazıları hayatta kalacak.

Tabii ki buradaki uygulamalar WebAssembly ile geliştirilmedi. Ancak merkeziyetsiz yapıların gereleceği hakkında bir fikir veriyor. Böyle bir dünyada uygulamaların dağıtımı, uzak makinelere uygun olan yüklerin dağıtımı, hızl ıve güvenli çalıltırma gibi konuların çözümğnde WebAssembly'nin önemli bir bileşen olacağı görülebiliyor.

Evet bu girişten sonra WebAssembly bu dünyaya neler sunabilir onu inceleyelim.

Blockchain Dünyası

Blockchain tarafında WebAssembly ile ilişkili en ilginç uygulamalardan biri Monero adlı kripto parayı oluşturmak için kullanılan Coinhive adlı browser eklentisidir. Dikkatsiz kullanıcılardan onay alıp kullanıcı bilgisayarında WebAssembly'yi kullanarak kripto para oluşturan bu eklenti 2019 yılında kapatılmış ancak halen farklı versiyonları farklı kripto paralar için var. Tabi bunlar kötü amaçla geliştirilmiş uygulamalar ancak mevzunun nereye gidebeleceği konusunda bir fikir veriyor.

Bir uygulamayı client tarafına yükleyerek sunucu yükünü azaltmak tek fayda olmayabilir. Yani yazacağımız uygumayı dağınık mimaride çalışacak şekilde tasarlayabilmek, client'lar dan veri toplamak (IOT), çok büyük hesaplamalrın bir kısmını dağıtarak yapmak (distributed computing), merkeziyetsiz (decentralized) uygulamalar geliştirmek vb sistemleri kurmak da mümkün. Şimdiden WebRTC protokolü ile çalışan peer-to-peer uygulamalar geliştirmek için yazılmış wasp-peer adında bir kütüphane yapmışlar bile.

Blockchain çok bildiğim bir dünya değil aslında ancak yukarıda bahsettiğim yapıları düşündüşümde ilk aklıma gelen blockchain dünyası oldu. Çünkü sanki tam orası için yazılmış gibi duruyor WebAssembly.

Aşağıdaki resimde görülen Ethereum Virtual Machine benzeri yapı bütün blockchain sistemlerde var. Geliştiriceilerin dApp (decentralized application) geliştirmek için kod yazdıkları yerde tam olarak burası.

vm.pngkaynak

Bildiğiniz üzere dApp geliştirmek için en çok tercih edilen yapılardan birisi Ethereum. EVM ise ethereumun temel bileşenlerinden birisi. EVM nedir sorusunu doğrudan koinsaati.com adresinden alıntı yaparak ekliyorum.

Akıllı sözleşmeler, merkeziyetsiz uygulamaların (DApp’ler) kullanımı da dahil olmak üzere birçok amaç için kullanılır. Akıllı sözleşmeler, Ethereum blok zincirinde çalışan algoritmalardır. Sözleşme, bir Ethereum adresinde depolanan bir veri ve kod koleksiyonudur. Akıllı sözleşmeler önceden belirlenmiş kuralları uygulamak için kullanılırlar. Ethereum ağında (EVM) akıllı bir sözleşme oluşturmak için Ethereum Virtual Machine ifadesinin kullanılması gerekiyor. Virtual Machine temelde, yürüten kod ile yürüten makine arasında bir soyutlama katmanı oluşturur. Bu katman, uygulamaların birbirinden ve ana bilgisayarlarından ayrılmalarını gerçekleştirmek için gereklidir.

"Yürütülen kod ile yürüten makine arasında bir soyutlama oluşturur" cümlesi çok manidar :) Sanki WebAssembly burası için yazılmış gibi duruyor.

Daha başka sistemlerde var eltte ancak en çok bilinene blockchain uygula geliştirme sistemlerinde WebAssembly'nin sanıl kullanıldığını bimiş olmaz herhalde geleceği hakkındaq bize yeteri kadar fikir vermiştir.

Evet benden bu kadar. Umarım faydalı olmuştur.

Diğer yazılarımızda görüşmek üzere.

err

nest...

batman iftar saati 2021 viranşehir kaç kilometre seferberlik ne demek namaz nasıl kılınır ve hangi dualar okunur özel jimer anlamlı bayram mesajı maxoak 50.000 mah powerbank cin tırnağı nedir