質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

940閲覧

PC上にWebサーバを構築してブラウザ上でボタンを押してGoファイル実行

aaaa____

総合スコア29

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2024/05/23 01:50

編集2024/06/01 11:12

実現したいこと

https://github.com/snym-yt/testLanguageSettings
PC上でWebサーバを構築することで,
このリポジトリのindex.htmlで見れるブラウザページ上のボタンから,write.goを実行し,output.txtに文字列を出力したい.(サーバー側でGoプログラムを実行する方針で問題ないでしょうか)

公開範囲としましては,ひとまず,自分のPC上でだけ実行できれば問題ございません.

最終的に

上記の目標は,前段階としてひとまずボタンを押した時にGoプログラムを実行させたいというもので,最終的には,
HTML上のテキストエリアで記述した文字列を送信し,その文字列をGoプログラムによって字句解析,構文解析,評価をし,その結果で,あるテキストファイルを更新させ,そのテキストファイルの内容をブラウザページ上に表示させたいと考えております.

環境

  • MacBook Air M2
  • Ventura 13.5
  • Google Chrome

現状・疑問点

https://teratail.com/questions/jjz5cv5lnvw7uj
こちらでいただいた回答から,自分で探してみて,
リポジトリのREADMEに書いてある通り,

npm install -g http-server http-server

というようにしてローカルサーバを使用しています.
ただ,どのようなアプローチでこの先Goファイルを実行させていくのかわからない,というのが現状です.
疑問点は二つありまして.

  • まず,ローカルサーバの建て方はこれで問題ないのでしょうか.
  • ローカルサーバを建てた後はどのようにしてブラウザ上でGoファイルを実行させられるのでしょうか

追記

調べること

  • Go言語で作られた簡単なWebアプリ
  • execSyncのようなかたちで外部プロセスとしてコマンドを実行させるやつ
  • python3 のhttp.serverモジュールでCGI (GoでWebサーバを作成するなら不要)

教えていただいた情報

ブラウザでGo書いて実行できる公式のサイト
上のソースコード

GoによるWebサーバを試してみる

https://github.com/snym-yt/TestGoWebServer
参考にしてる記事
表示がNode.jsのものと異なってしまった.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/05/23 05:24

Goに詳しい訳ではないのでコメントのみですが、 > ローカルサーバを建てた後はどのようにしてブラウザ上でGoファイルを実行させられるのでしょうか 実現したい機能を持つGoのプログラムを、あくまでWebブラウザー上のクライアントサイドで実行させたいのか(WebAssemblyで??)、 それともhtmlのボタンを押したら、フォームなりJavaScriptなりでサーバーにリクエストを送り、サーバーサイドでGoのプログラムを 実行させたいのかで全然違ってくるはずですよ。 具体的にボタンを押してどんな出力を得たいのかも含め、その辺りをはっきりさせると詳しい方の回答をいただけるかもしれません。 > npm install -g http-server > http-server Node.jsのhttp-serverではhtmlファイルや画像ファイルなど静的(static)なファイルしかホスティングできないようなので、少なくともこれではダメでしょうね。 https://www.npmjs.com/package/http-server 簡単に実行するにはサーバーサイドでCGIでしょうが、apacheやnginxでそれなりの設定をしてからになると思います。テスト目的程度で簡単に立ち上げるのであれば、python3 のhttp.serverモジュールがCGIも使えて便利ですので、調べてみると良いです。
aaaa____

2024/05/24 00:53

dodox86様,コメントありがとうございます. 私の考えが間違っていなければ,Goプログラムを実行させたいのはサーバーサイドですね. 最終的には,JavaScriptでサーバーに文字列を送信し,その文字列をGoのプログラムによって字句解析,構文解析,評価をして結果を返すようにしたいと考えています. その前段階として,本質問のリポジトリでは,Goファイルの実行ができることを目標にしてます. 質問本文にも追記させていただきます. サーバーにつきましてもご助言ありがとうございます. 現状のものでは足りていないようですので,おっしゃっていただいたpython3のサーバーモジュールを調べてみることにいたします.
dodox86

2024/05/24 04:14

コメントした後、ご提示のgithubリポジトリの内容を追って気になったのですが、プロジェクトのWEBアプリ本体はNode.jsで実行することが前提で、更にNode.jsのフレームワークであるExpressを利用して作られていたりするのでしょうか。そうであるならWEBアプリ本体から直接、Goのプログラムを外部プロセスとして実行してしまった方が自然・スムーズな気がしました。反対に、そうでないとややこしいことになるのではないかなと。 https://nodejs.org/api/child_process.html ※githubリポジトリの直近のコミットを読むと「goファイル実行用のボタン,ファイルを準備」とあり、質問の内容に沿っている気がしましたが、関係者の方でしたでしょうか。 githubのリポジトリ含め、こちらで何か誤解していてコメントが的外れであったらごめんなさい。
aaaa____

2024/05/25 01:13

@Lhankor_Mhy 様 チュートリアルのご提示ありがとうございます. RESTAPIとはどんなものかを含め,理解がまだ及んでおりませんので,読んだり調べたりしてみまして,何かそこから進展があれば質問本文に追記させていただきます.
aaaa____

2024/05/25 01:27

@dodox86様 Node.jsで実行することを前提として設計しようとは考えていなかったのですが,Node.js以外だと使えない設計になってしまっていますでしょうか.require("express")をした覚えはないのですが,Goプログラムを外部プロセスとして実行するとなると,どのような手法を用いるとよいなどあったりしますでしょうか.実例の記事など参照させていただけるとイメージしやすいので,何かありましたらよろしくお願いいたします. リポジトリに関しては,おっしゃるように,質問をしている私自身が質問用に作成しているものです. 実際に制作しているもの全体をあげると,要素が多すぎるので,重要,聞きたい部分のみを抽出してまとめているものになっています. 何卒よろしくお願いいたします.
Lhankor_Mhy

2024/05/25 02:15

> RESTAPIとはどんなものかを含め,理解がまだ及んでおりません APIを作る必要はないのですが、私が言いたかったのは、URLとHTTPリクエストメソッドに対し応答が返せるということですから、webアプリが作れるということです。 ちら見した感じGinというフレームワークがあるみたいですね。「golang webアプリ」でググってみると、低レベルなモジュールも存在するようです。もう少し検索をしてみて情報を集めてはどうでしょうか。
aaaa____

2024/05/25 11:29

@Lhankor_Mhy様 具体的にものを見てみると理解が進むと思いますので,おっしゃる通りGo言語のWebアプリの簡単な具体例をいくつか見てみることにいたします.
dodox86

2024/05/27 13:50

@aaaa____さん 2つ既に回答をいただいている状態でまだ質問が閉じていないところからみると、まだ解決できていないかんじでしょうか。 話を少し戻しますが、aaaa____さんのgithubリポジトリ「testLanguageSettings」の内容を見てみると、ファイルとしてserver.js, package.json があり、またREADMEには「expressをインストール」する旨記載されています。 package.json を見ると "scripts": {"start": "node server.js"} の記載があり、server.jsはexpressを使うコードになっています。未完成な状態だったので、これを少し修正して利用すればhttp-serverをインストールせずともローカルのWEBサーバーとして使えましたし、その中からビルド済みのGoの実行ファイルも実行できました。とりあえず、WEBブラウザと言いますかHTTPリクエスト経由でGoでビルドの実行ファイルを呼び出すことは確認できました。 githubリポジトリの履歴を見ると「first commit」のコメントでコミットしただけで、利用されていない・破棄する予定だったのでしょうか。 あるいは何か流用元のプロダクトがあって、最初に造った方の意図が伝わっていなかった、とか。 成り行きに関してちょっと謎に思ってのコメントです。
aaaa____

2024/05/28 12:10

@dodox 様 回答をいただきつつも,質問を閉じていない理由は二つありまして, 一つは,他の作業もありまして少しずつしか時間を作業することができておらず,いただいた回答に対して実装を行って追加で質問を行う,という段階まで進められていないこと 二つ目は,作業が進んでいないことでどちらをベストアンサーにするべきなのか決められない というものになっております. サーバー側におきまして,あまり理解できていないままとりあえずとして,調べた記事などから急繕いで作成してしまったので色々と不揃いなものになってしまい申し訳ございません. 追記部分のリポジトリに関しましては,少しずつ作業をしておりますので,今見ていただけますと本当に多少ではありますが進めてあるのが確認いただけると思います. お時間をいただいてしまって申し訳ございません.
guest

回答2

0

おっしゃる通りのことをしたければ、入力されたテキストをファイルに書き出しそれを (Goの場合はまずコンパイルして) 実行するような仕組みを、ウェブサーバに組み込めばいいです。そのような仕組みを組み込んだウェブサーバを立てる手段は無数にあります。例えばApache HTTP Serverを使った方法も他のものを使った方法も無数にありますので、一般論としてどうすればいいのかはちょっと説明のしようがないです。

そういった無数のやりかたのひとつとして、ウェブサーバ自体もGoで作成することができます。個人的には、物事が単純になるのでこれはいい方法ではないかと思いますね。標準ライブラリ net/httpを使えば、ウェブサーバの機能を持ったプログラムを簡単に書けます。そのプログラムの中に、おっしゃっているようなことをするコードを書けばいいです。詳しいことは、検索したりGoの参考書を読んだりして調べてください。

ところで、入力したコードを実行するのだとすると、サーバの上で、サーバを動作させているユーザの権限で好き勝手なプログラムを動作させられるということになりますね。場合によってはサーバ上の非公開の情報が見れてしまったり、サーバ上のデータを破壊してしまったりする可能性もあります。ですので安全を期するために、実行したコードの影響がサーバ自身に及ばないようにサンドボックス上で実行することも必要かもしれません。
そのようなものとしては公式サイトにあるThe Go Playgroundがあります。コードを入力すると実行して結果を表示してくれるので、まさに質問者さんが望んでいるものではないでしょうか。もちろんこれもGoで書かれていて、ソースコードから自分用のGo Playgroundを立ち上げることもできます。


あと、これはまったくの余談で、質問とほぼ関係ないのですが、

Unix系OSでは伝統的にwell-knownポートをbindするのにroot権限が必要です。が、ご存知の方もあると思いますが、macOSでは10.14 Mojaveからはこれが必要なくなっています (参照)。通常のユーザの権限で80番ポートをlistenするHTTPサーバなどを実行できます。なのでmacOSはローカルサーバを立てるのに向いていると言えるかもしれません。

投稿2024/05/25 11:30

編集2024/05/25 11:53
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaa____

2024/05/25 11:47

現状として,Goによる字句解析器,構文解析器,評価器は完成しておりますので, 標準ライブラリnet/http などを用いてWebサーバの機能を持ったプログラムを作成できるように調べてみることにいたします. セキュリティ上の問題に関しましては,字句解析〜評価器にいたるまでを自分で設計,開発しておりまして,できる範囲も非常に限られてはおりますが,開発の手に余裕が生まれましたらご指摘なされた部分も考慮してみようと思います.https://go.dev/play/ に関してましてはおっしゃる通り,私が求めている機能を持ったサイトになっております.オープンソースなのは知りませんでしたのでとても助かります.とても規模の大きなものだと思いますので,実際にこれをいじって自分用にするというのは難しいかもしれませんが,開発の参考にできるかもしれませんので非常に助かります.ありがとうございます.
ikedas

2024/05/25 12:12

> 現状として,Goによる字句解析器,構文解析器,評価器は完成しておりますので, なるほど。そこまでできているのならGoのエミュレータが作れますね。ソースコードをファイルに落として実際にコンパイルする必要もないのかもしれませんね。 Go Playgroundでもウェブサーバ機能の実現にはnet/httpを使っていますから、そこは参考になるかもしれません。
aaaa____

2024/05/29 12:59

https://zenn.dev/satumahayato010/articles/b4a6cccbb3bb09 このサイトを参考にしつつ,GoでWebサーバーを立ててこれまでのindex.htmlを表示させてみたところ,http-serverで行なったものと表示が異なってしまいました.どのように修正すればいいかなどの方向性をご助言いただくことはできますでしょうか. 何卒よろしくお願いいたします.
ikedas_no_omake

2024/05/29 13:25

運営にブロックを受け、コメントに書き込めないため別アカウントを作成して書き込みます。これは利用規約に違反した行為ですが、そもそものブロックの理由が「利用規約第7条への違反」とされていますので今さらです。 それはおいておいて、 net/httpは一般的なウェブサーバの機能を持ったアプリケーションを作成するに十分なライブラリです。特定の応用例を見るのではなく、まずはHTTPというプロトコルについて学ばれ、その上でかのライブラリが何をしているのかを理解してください。 HTTPについては、ちょっと古くなりつつありますが、 https://www.shoeisha.co.jp/book/detail/9784798126258 上野宣『HTTPの教科書』翔泳社 などはよいと思います。こういうことを実行するためのライブラリがnet/httpです。 今後は返答できないと思います。これ以上質問があれば他のかたに聞いてください。
aaaa____

2024/05/30 01:00

そのような状況の中ご返信いただきありがとうございます. 土台を作るところから学ぶべきということですね.参考図書もご提示いただきありがとうございます. 基礎の部分をもう少し学んでみることにいたします. 今後返答は難しいということで,ここまでご丁寧に回答いただきありがとうございました.
guest

0

ベストアンサー

質問欄、ちょっと混乱しているようですが、質問が

HTML上のテキストエリアで記述した文字列を送信し,その文字列をGoプログラムによって字句解析,構文解析,評価をし,その結果で,あるテキストファイルを更新させ,そのテキストファイルの内容をブラウザページ上に表示させたい
どのようなアプローチでこの先Goファイルを実行させていくのかわからない

だとして回答します。

※ 以下の記述が混乱を呼んでいると思います。ブラウザでGoファイルを動かすのであれば、以下の回答はまったく的外れになります。
「ブラウザ上でGoファイルを実行させられる」

構成としては、Webアプリケーションを作って、バックエンド側で、目的のGoプログラムを動かすことになります。

まず、Webアプリのバックエンドを何で作るか決める必要があります。Go言語以外で作るのであれば、コンパイル済みの目的のGoプログラムを外部コマンドとして実行する方法があります。 Node.jsであれば以下のサイトのような感じです。
https://www.wakuwakubank.com/posts/728-nodejs-child-process/

質問に出てくるpythonなどで作る場合でも同様に、外部コマンドの呼び出しで対応できます。

WebアプリをGo言語で作ることもできます。そうすれば、ソースコードを統合して必要な機能をWebアプリそのものに組み込んでしまうこともできるでしょう。

Apacheなどを使わなきゃいけないのでしょうか

どのような目的/状況でそのWebアプリを使うかによります。
Node.js単体でもWebアプリを作ることができますが、一般に公開して多くの人に使って貰うような場合、セキュリティやユーザ管理や、負荷分散のことなどを考えると、Apacheなどを使ったほうが構築/管理しやすくなります。

投稿2024/05/25 04:13

TakaiY

総合スコア13687

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaa____

2024/05/25 11:26

「ブラウザでGoファイルを動かす」≠「ブラウザ上でGoファイルを実行させられる」 なのですね.前者はサーバーサイド(バックエンド)で,後者がクライアントサイドでGoファイルを実行させるという認識で問題ないでしょうか. 勧めてくださった記事で言いますとと,execSyncの引数にGoを実行するコマンド”go run write.go"を入れるというようなかたちでしょうか. 質問に出てくるpython,と言いますのは,コメントにある「python3 のhttp.serverモジュール」のことで間違い無いでしょうか.Node.jsで問題ないのでしたらこのまま進めようとは考えております.公開範囲としては,ひとまず自分のPC端末で使えれば問題ないと考えております.
dodox86

2024/05/26 02:41

@aaaa____さん 回答主ではありませんが、コメントさせていただきます。 > 質問に出てくるpython,と言いますのは,コメントにある「python3 のhttp.serverモジュール」のことで間違い無いでしょうか. 質問のコメント欄でpython3のhttp.serverモジュールの話を挙げたのは、そのコメント当時、私がご質問の主旨を図りかねていた為です。 Node.js.のhttp-serverではサーバーは静的ファイルしか扱えない様子だったので、Goで作成した外部実行ファイルはブラウザーからのHTTPリクエストに応えるかたちで実行できません。 で、WEBサーバーやプログラミング言語にこだわりが無ければ"python3 -m http.server --cgi"とのように指定して実行すれば、cgi-bin/ディレクトリ以下に別途配置した実行ファイルを実行できるので、試すには簡単でいいですよ、程度の意味の私のコメントでした。 https://docs.python.org/3/library/http.server.html python3だけでもWEBサーバーでのホスティングとサーバー側WEBアプリを作成できますし、DjangoやFlask, Bottleなどのフレームワークを使って本格的なWEBアプリは造れますが、Node.jsとGoを主要に使うつもりなのであれば、python3の話は忘れて良いと思います。
TakaiY

2024/05/26 03:39

> execSyncの引数にGoを実行するコマンド”go run write.go"を入れるというようなかたちでしょうか はい、それでOKです。 毎回ビルドするでは時間がかかりますから、go buildでexeを作ってそれを実行するのでもいいでしょう。 どの言語を使ってWebサーバを構築するかについては、go言語以外であれば、上記のように外部コマンドとして動かすことに替りないので、慣れているものでやればいいと思います。
aaaa____

2024/06/01 12:30

教えていただいた方針で進めようとしたのですが,つまづいてしまった箇所がございまして,加えてご質問させていただければと思います. https://uraway.hatenablog.com/entry/2015/11/30/require_is_not_defined%E3%82%92%E8%A7%A3%E6%B6%88%E3%81%97%E3%81%A6require%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B この記事であるような形で,私の現状の実装では`require`を使用することができません. これを解消するために「browserify」を使おうと考えました. その理由としては,`const { execSync } = require('child_process')`とchild_processがファイルではなく,<script>タグを使うことができないというものがあります. しかし,browserifyを使って`browserify script.js -o bundle.js`のようにしてみたのですが, Uncaught TypeError: execSync is not a function at 1.child_process (bundle.js:185:16) at o (bundle.js:1:265) at r (bundle.js:1:431) at bundle.js:1:460 となりchild_processから適切に持ってこれていないようでした. 自分でも調べてはみますが,child_processのファイルでの取得や,他の方法での関数の読み込み方法などはありますでしょうか. 現状は質問本文の,冒頭のリポジトリに載せてあります. よろしくお願いいたします.
TakaiY

2024/06/01 12:59

やはり根本的のところの理解が間違えていると思います。 昨今のWebアプリは、バックエンド=サーバ側、とフロントエンド=ブラウザ側 でそれぞれのプログラムが動いています。そして、回答にも書きましたが、通常の方法ではフロントエンド側でGoプログラムを動かすことはできません。 動かすのであれば、バックエンド側です。 「冒頭のリポジトリ」を覗いてみると、script.js にrequireを入れているようですが、script.jsはフロントエンドで動くJavaScriptのファイルですので、動くようにすることはできません。 バックエンド側は、server.js です。 フロントエンドからformなどを使ってバックエンド側にデータを渡し、そのデータをバックエンド側でGoプログラムに渡して解析させ、結果を受け取り、フロントエンド側に渡すというような流れを作ります。 例が必要であれば、これは GoプログラムをDBに置き換えると普通のWebアプリになりますので、そのあたりの作りを理解してから取り組むのがいいと思います。
aaaa____

2024/06/02 01:41

おっしゃる通り理解ができていないままとなっていてしまっていました. 確かにサーバー側で動かすべきですし,であるならばbrowserifyは不要になりますね. ひとまず,フォームなどでデータを渡す前に,`ls`コマンドを叩いてみようとserver.jsに該当コードを移行させ,node server.jsによって,ブラウザ上でのいndex.htmlの閲覧とコマンドの実行を可能にすることができました.ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問