ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
[1] 質問文
漠然とした質問になってしまうことをはじめに断っておきます。すみません。
[1.1] 自分が今行いたい事は何か
ブラウザ上でコードを入力すると、サーバーで.cファイルを作ってそれをコンパイルして処理結果を返してくれるシステムを作ってみたい。
[1.2] 今何がわからないのか、知りたいのか
上記のシステムを作るためには何が必要か。(最低限動作するように)
[1.3]今の私のイメージ
HTMLでテキストボックス(コードを書く用),submitボタンを作る。
Webサーバーはapacheを使う。
submitボタンを押すとテキストボックス内の文字をサーバーに送信する。
サーバー側は受け取ったデータを.cファイルに書き込んでコンパイルする。
コンパイルの処理結果を返す。
返ってきた処理結果をブラウザ上で表示する。
[2] 環境
[2.1] OS : Mac
[2.2] コンパイラ名 : gcc
[3] その他
・どの程度C言語を理解しているか
c言語は文法についてはある程度理解していますがバックエンドについては初心者です。
自分で調べたところcgi,apacheなどのキーワードがたくさんでてきて、動作させる上で必要最低限何が必要かわからなくなったので今回質問しました。繰り返しになりますが漠然とした質問をしてしまい申し訳ありません。
漠然とした質問になってしまうことをはじめに断っておきます。すみません。
[1.1] 自分が今行いたい事は何か
ブラウザ上でコードを入力すると、サーバーで.cファイルを作ってそれをコンパイルして処理結果を返してくれるシステムを作ってみたい。
[1.2] 今何がわからないのか、知りたいのか
上記のシステムを作るためには何が必要か。(最低限動作するように)
[1.3]今の私のイメージ
HTMLでテキストボックス(コードを書く用),submitボタンを作る。
Webサーバーはapacheを使う。
submitボタンを押すとテキストボックス内の文字をサーバーに送信する。
サーバー側は受け取ったデータを.cファイルに書き込んでコンパイルする。
コンパイルの処理結果を返す。
返ってきた処理結果をブラウザ上で表示する。
[2] 環境
[2.1] OS : Mac
[2.2] コンパイラ名 : gcc
[3] その他
・どの程度C言語を理解しているか
c言語は文法についてはある程度理解していますがバックエンドについては初心者です。
自分で調べたところcgi,apacheなどのキーワードがたくさんでてきて、動作させる上で必要最低限何が必要かわからなくなったので今回質問しました。繰り返しになりますが漠然とした質問をしてしまい申し訳ありません。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
localhostで動作させる前提で記載します。
gccを使いたいならgccをインストールしますが、OSによって方法が異なると思います。
「gcc インストール方法 OS名」等で検索すれば出てくると思います。
ひとまず、localhostで動作するものを作成してみてはいかがでしょうか?
テキストボックスの設置方法がわからない、くらいから始まると思いますが、そこは誰もが通る道なので、地道に行きましょう!
Webアプリが作成したい、というように見えますので、最低限以下が必要と思います。
- HTMLの知識(今ならHTML5)
- サーバサイドの処理を書く言語の知識(ruby, perl, php, java, python等々)
- CSSの知識(装飾するのに使います)
- javascriptの知識(Webページに動きを付けます)
- フレームワークの知識(開発が楽になります)
MVCやMVVMといったものです。
rubyならruby on rails、phpならlaravelみたいな感じのものです。検索すればたくさんでてきます。
フロントでやりたい場合はReact、AngularJS、Vue.js等があります。
- Webアプリの概要的な知識
困ったときに色々調べることになると思いますが、Webアプリはいろいろな概念が合わさって動作しているので、何が原因かの切り分けが難しいです。
リクエスト-レスポンスで動作していることくらいは知らないと厳しいです。
動きとしてはあっていると思います。prai さんが書きました: ↑4年前[1.3]今の私のイメージ
HTMLでテキストボックス(コードを書く用),submitボタンを作る。
Webサーバーはapacheを使う。
submitボタンを押すとテキストボックス内の文字をサーバーに送信する。
サーバー側は受け取ったデータを.cファイルに書き込んでコンパイルする。
コンパイルの処理結果を返す。
返ってきた処理結果をブラウザ上で表示する。
サーバ側のコンパイラは、通常と同じインストール方法です。
gccを使いたいならgccをインストールしますが、OSによって方法が異なると思います。
「gcc インストール方法 OS名」等で検索すれば出てくると思います。
ひとまず、localhostで動作するものを作成してみてはいかがでしょうか?
テキストボックスの設置方法がわからない、くらいから始まると思いますが、そこは誰もが通る道なので、地道に行きましょう!
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
回答ありがとうございます。
とても参考になります!まずはlocalhostで作ってみたいと思います。
localhostでのコンパイラ(gcc)は私が現在利用しているMacに入れたものを使うと思います。
そこで1つ質問があります。
仮にレンタルサーバーを利用するとしたらコンパイラはどのようにインストール?するのでしょうか?それともレンタルサーバー側でコンパイラは用意されているものなのでしょうか?
回答いただけると幸いです。
とても参考になります!まずはlocalhostで作ってみたいと思います。
localhostでのコンパイラ(gcc)は私が現在利用しているMacに入れたものを使うと思います。
そこで1つ質問があります。
仮にレンタルサーバーを利用するとしたらコンパイラはどのようにインストール?するのでしょうか?それともレンタルサーバー側でコンパイラは用意されているものなのでしょうか?
回答いただけると幸いです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
レンタルサーバの場合、ソフトウェアのインストールやバージョンアップが制限されていて自分が使いたいソフトを後から追加するのが難しいのが一般的だと思います。(必要な機能があるサーバを契約します。)prai さんが書きました: ↑4年前仮にレンタルサーバーを利用するとしたらコンパイラはどのようにインストール?するのでしょうか?それともレンタルサーバー側でコンパイラは用意されているものなのでしょうか?
そのため、最初からインストールされている機能を使うのですが、XSERER/さくらレンタルサーバ/ロリポップのサイトにはgccの記述がなく、使えるのかわかりませんね。
個人のブログによっては機能比較でgccのバージョンが書かれているものもありましたが、本当かがわかりません。
これだとつまらないので、個人的に契約しているXSERVERにSSHでログインして確認してみました。
gccのバージョンを表示してみたところ、以下の通り実行できました。 また、以下のコードをコンパイルして実行してみたところ、hello worldが表示されたので、gccは使えると思います。
特殊なことをやりたい時は、レンタルサーバはお勧めしません。
好きにカスタマイズできるVPS(GMOクラウドとか、ConoHaとか)やクラウドのVirtualMachine(GCP, AWS, Azureとか)を利用したほうが良いと思います。
コンパイラやApache、その他のソフトウェアをインストール/アップデートしたい時に自分の好きなように構築可能です。
ConoHaやクラウドのVMは時間単位で借りられるというのが売りですので、短時間借りるのもいいかもしれません。(課金されないようにサービス消したり作ったりは面倒ですが)
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
何から何までありがとうございます。
ここまでのアドバイスを参考にしながらゆっくり少しずつ作っていきます。
ありがとうございました!
ここまでのアドバイスを参考にしながらゆっくり少しずつ作っていきます。
ありがとうございました!
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
C言語をCGIで動かしたくてレンタルサーバーで以前同じようなことをしたことがあります。
HTMLからPHPにコードを渡し
PHPでコードを.cファイルに保存
PHPのsystem関数からgccを呼び出しコンパイル
コンパイル後のファイル拡張子は.cgi
ブラウザからファイル名.cgiにアクセス
こんな手順でした。
ちなみに僕が使用したレンタルサーバーはxreaです。
HTMLからPHPにコードを渡し
PHPでコードを.cファイルに保存
PHPのsystem関数からgccを呼び出しコンパイル
コンパイル後のファイル拡張子は.cgi
ブラウザからファイル名.cgiにアクセス
こんな手順でした。
ちなみに僕が使用したレンタルサーバーはxreaです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
アドバイスありがとうございます。
参考にさせていただきます。
1つ質問があります。
formからソースコードをtype="text"で渡した時に$_POST[]で参照して表示すると#include<stdio.h>の<stdio.h>の部分が表示されません。
これは$_POST[]では<>は参照できないのか、それともtype="text"では<>は渡せないのかどちらでしょうか?
回答いただけると幸いです。
参考にさせていただきます。
1つ質問があります。
formからソースコードをtype="text"で渡した時に$_POST[]で参照して表示すると#include<stdio.h>の<stdio.h>の部分が表示されません。
これは$_POST[]では<>は参照できないのか、それともtype="text"では<>は渡せないのかどちらでしょうか?
回答いただけると幸いです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
それは実際のファイル内で確認しましたか?
それともechoでのブラウザ確認ですか?
たぶんブラウザで確認してるんだと思いますけど
<>はHTMLタグ扱いされて見えなくなってるだけです。
実際に作成されたファイルを直接エディタで確認してみてください。
もしブラウザ内で表示させたいのであればstr_replaceなどで
>と<を置き換えてみてください。
それともechoでのブラウザ確認ですか?
たぶんブラウザで確認してるんだと思いますけど
<>はHTMLタグ扱いされて見えなくなってるだけです。
実際に作成されたファイルを直接エディタで確認してみてください。
もしブラウザ内で表示させたいのであればstr_replaceなどで
>と<を置き換えてみてください。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
phpで外部コマンドを呼び出しています。
コメントアウトしている部分でErrorの確認をしたところ次のようなErrorがでました。
根本的な間違いがあるかもしれません、アドバイスいただけると幸いです。
コメントアウトしている部分でErrorの確認をしたところ次のようなErrorがでました。
a.outの実行ファイルの権限がない?のかなと思うのでchmodで権限を変更しようと思ったのですが、lsで確認したところそもそも実行ファイル(a.out)が作られていないのでどうしていいのかわからなくなってしまいました。ld: can't open output file for writing: a.out, errno=13 for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
根本的な間違いがあるかもしれません、アドバイスいただけると幸いです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
一応サンプル作ったので試してみてください。
phpファイルをアップロードできなかったので拡張子がcになってますがphpに直してください。
//ブラウザ入力
ファイル名
test
//ブラウザ出力
C言語でCGI
コンパイルテスト
それとphp側でユーザー入力チェックを何もやってないので気を付けてください。
このまま運用すると不正なファイルをアップロードできてしまいますし、
もっと酷いとsystem関数内でかなり悪質なこともできてしまいます。
本来であれば入力チェックもせずに受け取った値をそのままsystem関数に突っ込むのは絶対にあってはならないです。
ただのサンプルなのであしからず。。。
phpファイルをアップロードできなかったので拡張子がcになってますがphpに直してください。
//ブラウザ入力
ファイル名
test
#include <stdio.h>
int main()
{
printf("Content-type: text/html\n\n");
printf("<html><head><title>test</title></head>\n");
printf("<body>\n");
printf("<font color=\"#ff0000\">C言語でCGI<br>コンパイルテスト</font>\n");
printf("</body></html>");
}
//ブラウザ出力
C言語でCGI
コンパイルテスト
それとphp側でユーザー入力チェックを何もやってないので気を付けてください。
このまま運用すると不正なファイルをアップロードできてしまいますし、
もっと酷いとsystem関数内でかなり悪質なこともできてしまいます。
本来であれば入力チェックもせずに受け取った値をそのままsystem関数に突っ込むのは絶対にあってはならないです。
ただのサンプルなのであしからず。。。
- 添付ファイル
-
- cmp.c
- (726 バイト) ダウンロード数: 108 回
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
追記です。
phpのsystem関数以外にもCのコードでも色々出来ちゃうので個人だけで使うか、サービスとして提供するのであれば、送られてきたCのソースコードをしっかりチェックして使える関数と使えない関数を切り分けて下さい。
ユーザーが自由にCのソースをアップロードしてコンパイル、アクセスできるようなサービスだと本当にサーバーを滅茶苦茶にされかねません。
本当に危険なのでおすすめは個人の運用のみにした方がいいです。
phpのsystem関数以外にもCのコードでも色々出来ちゃうので個人だけで使うか、サービスとして提供するのであれば、送られてきたCのソースコードをしっかりチェックして使える関数と使えない関数を切り分けて下さい。
ユーザーが自由にCのソースをアップロードしてコンパイル、アクセスできるようなサービスだと本当にサーバーを滅茶苦茶にされかねません。
本当に危険なのでおすすめは個人の運用のみにした方がいいです。