Fortran 서버에서 WebAssembly
18469 단어 FortranWebAssembly
사전 쓰기
fortran66 블로그에 Fortran으로 작성한 웹 서버가 있으므로 Fortran에서 출력 한 WebAssembly 프로그램을 Fortran에서 작성한 웹 서버에서 실행하기로 결정합니다.
【메모장】ZMQ Fortran OO HTTP server
Fortran의 WebAssembly 2018년
이하, 다소 문제가 있습니다만, 일단 어떻게든 움직일 수 있었습니다.
Fortran Web Server 준비
ZMQ 설치
ZMQ라는 네트워크 라이브러리를 준비해야 합니다. 다음 페이지를 참고로 했습니다.
【메모장】WSL Ubuntu18.04 재구축
wget https://github.com/zeromq/libzmq/releases/download/v4.3.1/zeromq-4.3.1.tar.gz
tar zxvf zeromq-4.3.1.tar.gz
cd zeromq-4.3.1
./configure
make -j 8
sudo make install
Fortran http server 수정
ZMQ의 Fortran 바인딩도 필요합니다. f66blog/testZMQ 에서 빌려옵니다.
원래 서버 프로그램은 HTML 파일의 내용을 직접 쓰고 있기 때문에 외부 파일 (HTTP.html)에서 읽을 수 있도록 수정했습니다. 이때 프로그램중에, 읽어들인 HTML 파일의 각 행말에 LF 문자를 덧붙일 필요가 있었습니다. 또한 flang에서는 컴파일 할 수 없었기 때문에 gfortran을 사용했습니다.
sudo apt install gfortran
wget https://raw.githubusercontent.com/f66blog/testZMQ/master/F08_ZMQ.f90
gfortran F08_ZMQ.f90 HTTPserver.f90 -lzmq
program test
use, intrinsic :: iso_c_binding
use f08_zmq
implicit none
integer :: id_size, iraw_size, ilen
character(1025), target :: id, raw
type(context_t), allocatable :: ctx
type(socket_t) , allocatable :: socket
character(len = 1024) :: buff
character(len = :), allocatable :: http_response
character(*), parameter :: fn = 'HTTP.html'
! READ HTTP file ; add LF
http_response = 'HTTP/1.0 200 OK' // achar(10) // &
'Content-Type: text/html' // achar(10) // achar(10)
open(10, file = fn)
do
read(10, '(a)', end = 99) buff
http_response = http_response // trim(buff) // achar(10)
end do
99 continue
! ZMQ HTTP server
allocate(ctx, socket)
call ctx%new()
call socket%new(ctx, ZMQ_STREAM)
call socket%bind('tcp://*:8080')
print *, 'ZMQ http server:: http://localhost:8080'
do
call socket%recv(id, len(id), 0, id_size)
print *, 'Received::', id(:id_size)
do
call socket%recv(raw, len(raw), 0, iraw_size)
if (iraw_size <= 1024) exit
end do
call socket%send(id, id_size, ZMQ_SNDMORE, ilen)
call socket%send(http_response, len(http_response), 0, ilen)
call socket%send(id, id_size, ZMQ_SNDMORE, ilen)
call socket%send('', 0, 0, ilen)
end do
deallocate(socket)
deallocate(ctx)
end program test
WebAssembly 용 HTML 파일
잘 이해할 수 없는 이유로, 이전에 만든 HTML 파일에서는 동작하지 않았기 때문에 수정했습니다.
참고 기사:
TypeError: Incorrect response MIME type. Expected 'application/wasm'
richlum commented on 19 Dec 2018
similar issue using 'web server for chrome' on linux. Adapted timmyjose solution while trying to follow along htps : //에서 ゔぇぺぺr. 모잖아. rg / an-u S / cs / uebase mbly / xt_furma t_ 및 _ sm
<!-- public/index.html -->
<!DOCTYPE html>
<html lang="en">
<body>
<script>
fetch('./pai.wasm').then(response => response.arrayBuffer()
).then(bytes => {
return WebAssembly.instantiate(bytes, {})
}).then( r => {
const ex = r.instance.exports
const n = 64
const result = ex.pai(n + 1)
const theory = ex.pai2()
console.log(result)
console.log(theory)
document.querySelector("#n_div" ).innerHTML = n
document.querySelector("#result").innerHTML = result
document.querySelector("#theory").innerHTML = theory
})
</script>
Division of Interval
<div id="n_div"> </div>
Result
<div id="result"></div>
Theoretical value
<div id="theory"></div>
</body>
</html>
실행
./a.out에서 서버가 시작되고 브라우저에서 localhost:8080을 치면 다른 기사에서 생성한 WebAssembly에서 계산이 수행됩니다.
브라우저 출력
콘솔 출력
pc@VM10:~$ ./a.out
ZMQ http server:: http://localhost:8080
Received:: kEg
Received:: kEh
Received:: kEi
그러나 때로는 WebAssembly의 해석을 잘 수행하지 못할 수 있습니다. 이 때 Python 서버를 시작하고 페이지를 표시하면 종료 후 문제가 해결됩니다. Fortran 서버 프로그램은 어떠한 초기화나 종료 처리가 되어 있지 않을 가능성이 있습니다. 향후의 과제로 하겠습니다.
Fortran의 WebAssembly 2018년
파이썬 서버
python -m SimpleHTTPServer 8080
Reference
이 문제에 관하여(Fortran 서버에서 WebAssembly), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cure_honey/items/1192f4f4a372e0fe1add
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ZMQ 설치
ZMQ라는 네트워크 라이브러리를 준비해야 합니다. 다음 페이지를 참고로 했습니다.
【메모장】WSL Ubuntu18.04 재구축
wget https://github.com/zeromq/libzmq/releases/download/v4.3.1/zeromq-4.3.1.tar.gz
tar zxvf zeromq-4.3.1.tar.gz
cd zeromq-4.3.1
./configure
make -j 8
sudo make install
Fortran http server 수정
ZMQ의 Fortran 바인딩도 필요합니다. f66blog/testZMQ 에서 빌려옵니다.
원래 서버 프로그램은 HTML 파일의 내용을 직접 쓰고 있기 때문에 외부 파일 (HTTP.html)에서 읽을 수 있도록 수정했습니다. 이때 프로그램중에, 읽어들인 HTML 파일의 각 행말에 LF 문자를 덧붙일 필요가 있었습니다. 또한 flang에서는 컴파일 할 수 없었기 때문에 gfortran을 사용했습니다.
sudo apt install gfortran
wget https://raw.githubusercontent.com/f66blog/testZMQ/master/F08_ZMQ.f90
gfortran F08_ZMQ.f90 HTTPserver.f90 -lzmq
program test
use, intrinsic :: iso_c_binding
use f08_zmq
implicit none
integer :: id_size, iraw_size, ilen
character(1025), target :: id, raw
type(context_t), allocatable :: ctx
type(socket_t) , allocatable :: socket
character(len = 1024) :: buff
character(len = :), allocatable :: http_response
character(*), parameter :: fn = 'HTTP.html'
! READ HTTP file ; add LF
http_response = 'HTTP/1.0 200 OK' // achar(10) // &
'Content-Type: text/html' // achar(10) // achar(10)
open(10, file = fn)
do
read(10, '(a)', end = 99) buff
http_response = http_response // trim(buff) // achar(10)
end do
99 continue
! ZMQ HTTP server
allocate(ctx, socket)
call ctx%new()
call socket%new(ctx, ZMQ_STREAM)
call socket%bind('tcp://*:8080')
print *, 'ZMQ http server:: http://localhost:8080'
do
call socket%recv(id, len(id), 0, id_size)
print *, 'Received::', id(:id_size)
do
call socket%recv(raw, len(raw), 0, iraw_size)
if (iraw_size <= 1024) exit
end do
call socket%send(id, id_size, ZMQ_SNDMORE, ilen)
call socket%send(http_response, len(http_response), 0, ilen)
call socket%send(id, id_size, ZMQ_SNDMORE, ilen)
call socket%send('', 0, 0, ilen)
end do
deallocate(socket)
deallocate(ctx)
end program test
WebAssembly 용 HTML 파일
잘 이해할 수 없는 이유로, 이전에 만든 HTML 파일에서는 동작하지 않았기 때문에 수정했습니다.
참고 기사:
TypeError: Incorrect response MIME type. Expected 'application/wasm'
richlum commented on 19 Dec 2018
similar issue using 'web server for chrome' on linux. Adapted timmyjose solution while trying to follow along htps : //에서 ゔぇぺぺr. 모잖아. rg / an-u S / cs / uebase mbly / xt_furma t_ 및 _ sm
<!-- public/index.html -->
<!DOCTYPE html>
<html lang="en">
<body>
<script>
fetch('./pai.wasm').then(response => response.arrayBuffer()
).then(bytes => {
return WebAssembly.instantiate(bytes, {})
}).then( r => {
const ex = r.instance.exports
const n = 64
const result = ex.pai(n + 1)
const theory = ex.pai2()
console.log(result)
console.log(theory)
document.querySelector("#n_div" ).innerHTML = n
document.querySelector("#result").innerHTML = result
document.querySelector("#theory").innerHTML = theory
})
</script>
Division of Interval
<div id="n_div"> </div>
Result
<div id="result"></div>
Theoretical value
<div id="theory"></div>
</body>
</html>
실행
./a.out에서 서버가 시작되고 브라우저에서 localhost:8080을 치면 다른 기사에서 생성한 WebAssembly에서 계산이 수행됩니다.
브라우저 출력
콘솔 출력
pc@VM10:~$ ./a.out
ZMQ http server:: http://localhost:8080
Received:: kEg
Received:: kEh
Received:: kEi
그러나 때로는 WebAssembly의 해석을 잘 수행하지 못할 수 있습니다. 이 때 Python 서버를 시작하고 페이지를 표시하면 종료 후 문제가 해결됩니다. Fortran 서버 프로그램은 어떠한 초기화나 종료 처리가 되어 있지 않을 가능성이 있습니다. 향후의 과제로 하겠습니다.
Fortran의 WebAssembly 2018년
파이썬 서버
python -m SimpleHTTPServer 8080
Reference
이 문제에 관하여(Fortran 서버에서 WebAssembly), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cure_honey/items/1192f4f4a372e0fe1add
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
pc@VM10:~$ ./a.out
ZMQ http server:: http://localhost:8080
Received:: kEg
Received:: kEh
Received:: kEi
python -m SimpleHTTPServer 8080
Reference
이 문제에 관하여(Fortran 서버에서 WebAssembly), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cure_honey/items/1192f4f4a372e0fe1add텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)