Ke hana ʻana i kahi ʻōnaehana hōʻoia maʻamau mai ka wā kahiko. Mahele 1: ʻO ka Mīkini Virtual Character ma PHP a me Python

ʻO ka hōʻoia maʻamau ka hōʻoia ʻana o kahi papahana a i ʻole algorithm e hoʻohana ana i kekahi.

ʻO kēia kekahi o nā ala ikaika loa e hiki ai iā ʻoe ke ʻike i nā nāwaliwali āpau i kahi papahana a hōʻoia paha ʻaʻole lākou.

Hiki ke ʻike ʻia kahi wehewehe kikoʻī o ka hōʻoia kūhelu ma ka laʻana o ka hoʻoponopono ʻana i ka pilikia o Wolf, Kao, a me Kāpena ma kaʻu ʻatikala mua.

Ma kēia ʻatikala e neʻe au mai ka hōʻoia ʻokoʻa o nā pilikia i nā papahana a wehewehe pehea
pehea e hiki ai ke hoʻololi ʻia i mau ʻōnaehana kānāwai maʻamau.

No ka hana ʻana i kēia, ua kākau wau i kaʻu analogue ponoʻī o kahi mīkini virtual, me ka hoʻohana ʻana i nā loina hōʻailona.

Hoʻokaʻawale ia i ka code program a unuhi i loko o kahi ʻōnaehana hoʻohālikelike (SMT), hiki ke hoʻoponopono ʻia ma ka papahana.

No ka mea, hōʻike ʻia ka ʻike e pili ana i nā helu hōʻailona ma ka Pūnaewele ma kahi ʻāpana,
E wehewehe pōkole au i ia mea.

ʻO ka helu hōʻailona kahi ala e hoʻokō ai i kahi papahana ma kahi ākea o ka ʻikepili a ʻo ia ka mea hana nui no ka hōʻoia ʻana o ka papahana.

No ka laʻana, hiki iā mākou ke hoʻonohonoho i nā kūlana hoʻokomo kahi e hiki ai i ka hoʻopaʻapaʻa mua ke lawe i nā waiwai maikaʻi, ʻo ka lua ʻino, ke kolu ʻole, a me ka hoʻopaʻapaʻa hoʻopuka, no ka laʻana, 42.

ʻO nā helu hōʻailona ma ka holo hoʻokahi e hāʻawi iā mākou i ka pane inā hiki iā mākou ke loaʻa ka hopena i makemake ʻia a me kahi laʻana o kahi hoʻonohonoho o ia mau ʻāpana hoʻokomo. A i ʻole ka hōʻoia ʻana ʻaʻohe mau ʻāpana like.

Eia kekahi, hiki iā mākou ke hoʻonohonoho i nā manaʻo hoʻokomo i nā mea hiki, a koho wale i nā mea hoʻopuka, no ka laʻana, ka ʻōlelo huna luna.

I kēia hihia, e ʻike mākou i nā nāwaliwali a pau o ka papahana a i ʻole e loaʻa ka hōʻoia i ka palekana o ka ʻōlelo huna a ka luna.

Hiki ke hoʻomaopopo ʻia ʻo ka hoʻokō maʻamau o kahi papahana me ka ʻikepili hoʻokomo kikoʻī he hihia kūikawā o ka hoʻokō hōʻailona.

No laila, hiki i koʻu ʻano VM ke hana ma ke ʻano emulation o kahi mīkini virtual maʻamau.

Ma nā ʻōlelo i ka ʻatikala ma mua hiki ke loaʻa i ka hoʻohewa kūpono o ka hōʻoia maʻamau me ke kūkākūkā o kona mau nāwaliwali.

ʻO nā pilikia nui:

  1. Pahū huipuʻu, ʻoiai ʻo ka hōʻoia maʻamau e iho mai i ka P=NP
  2. ʻOi aku ka paʻakikī o ka hōʻoia ʻana i nā kelepona i ka ʻōnaehana faila, nā pūnaewele a me nā waihona waho ʻē aʻe
  3. Bugs i loko o ka kikoʻī, i ka mea kūʻai a programmer manaʻo hoʻokahi mea, akā, ʻaʻole i wehewehe pono ia i loko o ka ʻenehana kikoʻī.

ʻO ka hopena, e hōʻoia ʻia ka papahana a hoʻokō i nā kikoʻī, akā e hana i kahi mea ʻokoʻa loa mai ka mea i manaʻo ʻia e nā mea hana.

No ka mea ma kēia ʻatikala ke noʻonoʻo nui nei au i ka hoʻohana ʻana i ka hōʻoia maʻamau i ka hoʻomaʻamaʻa ʻana, ʻaʻole wau e kuʻi i koʻu poʻo i ka pā i kēia manawa, a e koho i kahi ʻōnaehana kahi liʻiliʻi o ka paʻakikī algorithmic a me ka helu o nā kelepona waho.

No ka mea ua kūpono nā ʻaelike akamai i kēia mau koi, ua hāʻule ka koho i nā ʻaelike RIDE mai ka platform Waves: ʻaʻole lākou Turing piha, a ua kaupalena ʻia ko lākou paʻakikī kiʻekiʻe.

Akā e noʻonoʻo mākou iā lākou mai ka ʻaoʻao ʻenehana.

Ma waho aʻe o nā mea a pau, e koi nui ʻia ka hōʻoia maʻamau no nā ʻaelike: ʻaʻole hiki ke hoʻoponopono i kahi hewa ʻaelike ma hope o ka hoʻomaka ʻana.
A hiki ke kiʻekiʻe loa ke kumukūʻai o ia mau hewa, no ka mea, mālama pinepine ʻia nā kālā nui ma nā ʻaelike akamai.

Ua kākau ʻia kaʻu mīkini virtual hōʻailona ma PHP a me Python, a hoʻohana iā Z3Prover mai Microsoft Research e hoʻoponopono i nā kumu SMT hopena.

Ma kāna kumu he hulina multi-transactional ikaika, ʻo ia
hiki iā ʻoe ke ʻimi i nā hoʻonā a i ʻole nā ​​nāwaliwali, ʻoiai inā makemake ia i nā kālepa he nui.
Naau Mythril, ʻO kekahi o nā papa hana hōʻailona ikaika loa no ka ʻike ʻana i nā nāwaliwali o Ethereum, ua hoʻohui wale i kēia hiki i kekahi mau mahina i hala.

Akā he mea pono e hoʻomaopopo he ʻoi aku ka paʻakikī o nā ʻaelike ether a ua hoʻopau ʻo Turing.

Ua unuhi ʻo PHP i ka code kumu o ka RIDE smart contract i loko o kahi palapala python, kahi i hōʻike ʻia ai ka papahana ma ke ʻano he Z3 SMT-kūpono ʻōnaehana o nā mokuʻāina a me nā kūlana no kā lākou hoʻololi.

Ke hana ʻana i kahi ʻōnaehana hōʻoia maʻamau mai ka wā kahiko. Mahele 1: ʻO ka Mīkini Virtual Character ma PHP a me Python

I kēia manawa e wehewehe au i nā mea e hana nei i loko i nā kikoʻī hou aku.

Akā ʻo ka mea mua, he mau huaʻōlelo e pili ana i ka ʻōlelo aelike akamai RIDE.

He ʻōlelo hoʻolālā hana a me ka hōʻike ʻana i palaualelo ma ka hoʻolālā ʻana.
Holo kaʻawale ʻo RIDE i loko o ka blockchain a hiki ke kiʻi a kākau i ka ʻike mai kahi waihona i hoʻopili ʻia i ka ʻeke kālā o ka mea hoʻohana.

Hiki iā ʻoe ke hoʻopili i kahi ʻaelike RIDE i kēlā me kēia ʻeke, a ʻo ka hopena o ka hoʻokō ʻana he TRUE a FALSE wale nō.

ʻO TRUE ʻo ia ka ʻae ʻana o ka ʻaelike akamai i ke kālepa, a ʻo FALSE ʻo ia ka pāpā ʻana.
ʻO kahi laʻana maʻalahi: hiki i kahi palapala ke pāpā i ka hoʻololi ʻana inā ʻoi aku ka liʻiliʻi o ke koena o ka ʻeke ma mua o 100.

Ma keʻano he laʻana, e lawe wau i ka Wolf, Goat, a me Cabbage, akā ua hōʻike mua ʻia ma ke ʻano o kahi ʻaelike akamai.

ʻAʻole hiki i ka mea hoʻohana ke hoʻokuʻu i ke kālā mai ka ʻeke kālā kahi i kau ʻia ai ka ʻaelike a hiki i kona hoʻouna ʻana i nā mea āpau i kēlā ʻaoʻao.

#Извлекаем положение всех объектов из блокчейна
let contract = tx.sender
let human= extract(getInteger(contract,"human"))
let wolf= extract(getInteger(contract,"wolf"))
let goat= extract(getInteger(contract,"goat"))
let cabbage= extract(getInteger(contract,"cabbage"))

#Это так называемая дата-транзакция, в которой пользователь присылает новые 4 переменные.
#Контракт разрешит её только в случае если все объекты останутся в сохранности.
match tx {
case t:DataTransaction =>
   #Извлекаем будущее положение всех объектов из транзакции
   let newHuman= extract(getInteger(t.data,"human")) 
   let newWolf= extract(getInteger(t.data,"wolf"))
   let newGoat= extract(getInteger(t.data,"goat"))
   let newCabbage= extract(getInteger(t.data,"cabbage"))
   
   #0 обозначает, что объект на левом берегу, а 1 что на правом
   let humanSide= human == 0 || human == 1
   let wolfSide= wolf == 0 || wolf == 1
   let goatSide= goat == 0 || goat == 1
   let cabbageSide= cabbage == 0 || cabbage == 1
   let side= humanSide && wolfSide && goatSide && cabbageSide

   #Будут разрешены только те транзакции, где с козой никого нет в отсутствии фермера.
   let safeAlone= newGoat != newWolf && newGoat != newCabbage
   let safe= safeAlone || newGoat == newHuman
   let humanTravel= human != newHuman 

   #Способы путешествия фермера туда и обратно, с кем-то либо в одиночку.
   let t1= humanTravel && newWolf == wolf + 1 && newGoat == goat && newCabbage == cabbage 
   let t2= humanTravel && newWolf == wolf && newGoat == goat + 1 && newCabbage == cabbage
   let t3= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage + 1
   let t4= humanTravel && newWolf == wolf - 1 && newGoat == goat && newCabbage == cabbage
   let t5= humanTravel && newWolf == wolf && newGoat == goat - 1 && newCabbage == cabbage
   let t6= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage - 1
   let t7= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage
   let objectTravel = t1 || t2 || t3 || t4 || t5 || t6 || t7
   
   #Последняя строка в разделе транзакции описывает разрешающее транзакцию условие.
   #Переменные транзакции должны иметь значения 1 или 0, все объекты должны
   #быть в безопасности, а фермер должен переплывать реку в одиночку 
   #или с кем-то на каждом шагу
   side && safe && humanTravel && objectTravel
case s:TransferTransaction =>
   #Транзакция вывода средств разрешена только в случае если все переплыли на другой берег
   human == 1 && wolf == 1 && goat == 1 && cabbage == 1

#Все прочие типы транзакций запрещены
case _ => false

}

Hoʻokaʻawale mua ʻo PHP i nā ʻano like ʻole mai ka ʻaelike akamai ma ke ʻano o kā lākou mau kī a me ka hoʻololi ʻōlelo Boolean e pili ana.

cabbage: extract ( getInteger ( contract , "cabbage" ) )
goat: extract ( getInteger ( contract , "goat" ) )
human: extract ( getInteger ( contract , "human" ) )
wolf: extract ( getInteger ( contract , "wolf" ) )
fState: human== 1 && wolf== 1 && goat== 1 && cabbage== 1
fState: 
wolf: 
goat: 
cabbage: 
cabbageSide: cabbage== 0 || cabbage== 1
human: extract ( getInteger ( contract , "human" ) )
newGoat: extract ( getInteger ( t.data , "goat" ) )
newHuman: extract ( getInteger ( t.data , "human" ) )
goatSide: goat== 0 || goat== 1
humanSide: human== 0 || human== 1
t7: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage
t3: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage + 1
t6: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage - 1
t2: humanTravel && newWolf== wolf && newGoat== goat + 1 && newCabbage== cabbage
t5: humanTravel && newWolf== wolf && newGoat== goat - 1 && newCabbage== cabbage
t1: humanTravel && newWolf== wolf + 1 && newGoat== goat && newCabbage== cabbage
t4: humanTravel && newWolf== wolf - 1 && newGoat== goat && newCabbage== cabbage
safeAlone: newGoat != newWolf && newGoat != newCabbage
wolfSide: wolf== 0 || wolf== 1
humanTravel: human != newHuman
side: humanSide && wolfSide && goatSide && cabbageSide
safe: safeAlone || newGoat== newHuman
objectTravel: t1 || t2 || t3 || t4 || t5 || t6 || t7

A laila hoʻololi ʻo PHP iā lākou i kahi wehewehe ʻōnaehana Z3Prover SMT-kūpono ma Python.
Hoʻopili ʻia ka ʻikepili i loko o kahi loop, kahi e loaʻa ai i nā mea hoʻololi waihona i ka index i, nā mea hoʻololi kālepa index i + 1, a me nā mea hoʻololi me nā hōʻike e hoʻonohonoho i nā lula no ka hoʻololi ʻana mai ka mokuʻāina ma mua a i kahi aʻe.

ʻO kēia ka puʻuwai o kā mākou mīkini uila, e hāʻawi ana i kahi ʻenekini hulina multi-transactional.

fState:  And( And( And( human[Steps]  ==  1 , wolf[Steps]  ==  1 )  , goat[Steps]  ==  1 )  , cabbage[Steps]  ==  1 )  
final:  fState[Steps] 
fState:   
wolf:   
goat:   
cabbage:   
cabbageSide:  Or( cabbage[i]  ==  0 , cabbage[i]  ==  1 )  
goatSide:  Or( goat[i]  ==  0 , goat[i]  ==  1 )  
humanSide:  Or( human[i]  ==  0 , human[i]  ==  1 )  
t7:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
t3:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] + 1 )  
t6:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] - 1 )  
t2:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] + 1 )  , cabbage  ==  cabbage[i] )  
t5:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] - 1 )  , cabbage  ==  cabbage[i] )  
t1:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] + 1 )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
t4:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] - 1 )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
safeAlone:  And( goat[i+1] != wolf , goat[i+1] != cabbage )  
wolfSide:  Or( wolf[i]  ==  0 , wolf[i]  ==  1 )  
humanTravel:  human[i] != human[i+1] 
side:  And( And( And( humanSide[i] , wolfSide[i] )  , goatSide[i] )  , cabbageSide[i] )  
safe:  Or( safeAlone[i] , goat[i+1]  ==  human[i+1] )  
objectTravel:  Or( Or( Or( Or( Or( Or( t1[i] , t2[i] )  , t3[i] )  , t4[i] )  , t5[i] )  , t6[i] )  , t7[i] )  
data:  And( And( And( side[i] , safe[i] )  , humanTravel[i] )  , objectTravel[i] )  

Hoʻopili ʻia nā kūlana a hoʻokomo ʻia i loko o kahi hōʻailona hōʻailona i hoʻolālā ʻia e wehewehe i ka ʻōnaehana SMT ma Python.

Lakoʻo hakahaka


import json

from z3 import *

s = Solver()

  
  
    
Steps=7
Num= Steps+1

$code$



#template, only start rest
s.add(data + start)

#template
s.add(final)




ind = 0

f = open("/var/www/html/all/bin/python/log.txt", "a")



while s.check() == sat:
  ind = ind +1
  

  print ind
  m = s.model()
  print m

  print "traversing model..." 
  #for d in m.decls():
	#print "%s = %s" % (d.name(), m[d])

  
 
  f.write(str(m))
  f.write("nn")
  exit()
  #s.add(Or(goat[0] != s.model()[data[0]] )) # prevent next model from using the same assignment as a previous model



print "Total solution number: "
print ind  

f.close()
 


No ka moku'āina hope loa i ke kaulahao holoʻokoʻa, ua hoʻohana ʻia nā lula i kuhikuhi ʻia ma ka ʻāpana kālepa hoʻoili.

ʻO ia ke ʻano e ʻimi ʻo Z3Prover i nā ʻano o nā kūlana e hiki ai ke hoʻokuʻu ʻia ke kālā mai ka ʻaelike.

ʻO ka hopena, loaʻa iā mākou kahi hiʻohiʻona SMT holoʻokoʻa o kā mākou ʻaelike.
Hiki iā ʻoe ke ʻike ua like loa ia me ke kumu hoʻohālike mai kaʻu ʻatikala mua, aʻu i hōʻuluʻulu lima ai.

Hoʻopiha ʻia ka laʻana


import json

from z3 import *

s = Solver()

  
  
    
Steps=7
Num= Steps+1

human = [ Int('human_%i' % (i + 1)) for i in range(Num) ]
wolf = [ Int('wolf_%i' % (i + 1)) for i in range(Num) ]
goat = [ Int('goat_%i' % (i + 1)) for i in range(Num) ]
cabbage = [ Int('cabbage_%i' % (i + 1)) for i in range(Num) ]
nothing= [  And( human[i] == human[i+1], wolf[i] == wolf[i+1], goat[i] == goat[i+1], cabbage[i] == cabbage[i+1] )   for i in range(Num-1) ]


start= [ human[0] == 1, wolf[0] == 0, goat[0] == 1, cabbage[0] == 0 ]

safeAlone= [  And( goat[i+1] != wolf[i+1] , goat[i+1] != cabbage[i+1] )   for i in range(Num-1) ]
safe= [  Or( safeAlone[i] , goat[i+1]  ==  human[i+1] )   for i in range(Num-1) ]
humanTravel= [  human[i] != human[i+1]  for i in range(Num-1) ]
cabbageSide= [  Or( cabbage[i]  ==  0 , cabbage[i]  ==  1 )   for i in range(Num-1) ]
goatSide= [  Or( goat[i]  ==  0 , goat[i]  ==  1 )   for i in range(Num-1) ]
humanSide= [  Or( human[i]  ==  0 , human[i]  ==  1 )   for i in range(Num-1) ]
t7= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t3= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] + 1 )   for i in range(Num-1) ]
t6= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] - 1 )   for i in range(Num-1) ]
t2= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] + 1 )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t5= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] - 1 )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t1= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] + 1 )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t4= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] - 1 )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
wolfSide= [  Or( wolf[i]  ==  0 , wolf[i]  ==  1 )   for i in range(Num-1) ]
side= [  And( And( And( humanSide[i] , wolfSide[i] )  , goatSide[i] )  , cabbageSide[i] )   for i in range(Num-1) ]
objectTravel= [  Or( Or( Or( Or( Or( Or( t1[i] , t2[i] )  , t3[i] )  , t4[i] )  , t5[i] )  , t6[i] )  , t7[i] )   for i in range(Num-1) ]
data= [ Or(  And( And( And( side[i] , safe[i] )  , humanTravel[i] )  , objectTravel[i] )   , nothing[i]) for i in range(Num-1) ]


fState=  And( And( And( human[Steps]  ==  1 , wolf[Steps]  ==  1 )  , goat[Steps]  ==  1 )  , cabbage[Steps]  ==  1 )  
final=  fState 




#template, only start rest
s.add(data + start)

#template
s.add(final)




ind = 0

f = open("/var/www/html/all/bin/python/log.txt", "a")



while s.check() == sat:
  ind = ind +1
  

  print ind
  m = s.model()
  print m

  print "traversing model..." 
  #for d in m.decls():
	#print "%s = %s" % (d.name(), m[d])

  
 
  f.write(str(m))
  f.write("nn")
  exit()
  #s.add(Or(goat[0] != s.model()[data[0]] )) # prevent next model from using the same assignment as a previous model



print "Total solution number: "
print ind  

f.close()
 


Ma hope o ka hoʻomaka ʻana, hoʻoponopono ʻo Z3Prover i ka ʻaelike akamai a hāʻawi iā mākou i kahi kaulahao o nā kālepa e hiki ai iā mākou ke hoʻihoʻi i ke kālā:

Winning transaction chain found:
Data transaction: human= 0, wolf= 0, goat= 1, cabbage= 0
Data transaction: human= 1, wolf= 0, goat= 1, cabbage= 1
Data transaction: human= 0, wolf= 0, goat= 0, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 0, cabbage= 1
Data transaction: human= 0, wolf= 1, goat= 0, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 1, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 1, cabbage= 1
Transfer transaction

Ma kahi o ka ʻaelike ferry, hiki iā ʻoe ke hoʻokolohua me kāu mau ʻaelike ponoʻī a hoʻāʻo paha i kēia hiʻohiʻona maʻalahi, i hoʻoholo ʻia i 2 mau hana.

let contract = tx.sender
let a= extract(getInteger(contract,"a"))
let b= extract(getInteger(contract,"b"))
let c= extract(getInteger(contract,"c"))
let d= extract(getInteger(contract,"d"))

match tx {
case t:DataTransaction =>
let na= extract(getInteger(t.data,"a")) 
let nb= extract(getInteger(t.data,"b"))
let nc= extract(getInteger(t.data,"c"))
let nd= extract(getInteger(t.data,"d"))
   
   nd == 0 || a == 100 - 5
case s:TransferTransaction =>
   ( a + b - c ) * d == 12

case _ => true

}

No ka mea ʻo kēia ka mana mua loa, ua kaupalena ʻia ka syntax a aia paha nā pōpoki.
Ma nā ʻatikala aʻe, hoʻolālā wau e uhi i ka hoʻomohala hou ʻana o ka VM, a hōʻike i ke ʻano e hiki ai iā ʻoe ke hana i nā ʻaelike akamai i hōʻoia ʻia me kāna kōkua, ʻaʻole hoʻoponopono wale iā lākou.

Loaʻa ka mīkini virtual character ma http://2.59.42.98/hyperbox/
Ma hope o ke kau ʻana i ke code kumu o ka VM hōʻailona i ka hoʻonohonoho ʻana a me ka hoʻohui ʻana i nā manaʻo ma laila, manaʻo wau e kau iā ia ma GitHub no ke komo manuahi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka