ページ 1 / 1
ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月18日(木) 19:44
by prai
[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などのキーワードがたくさんでてきて、動作させる上で必要最低限何が必要かわからなくなったので今回質問しました。繰り返しになりますが漠然とした質問をしてしまい申し訳ありません。
追記
Posted: 2019年7月18日(木) 22:58
by prai
サーバー側にコンパイラをインストール?する方法を教えていただけると幸いです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月19日(金) 19:46
by beet
localhostで動作させる前提で記載します。
prai さんが書きました: ↑6年前
[1.2] 今何がわからないのか、知りたいのか
上記のシステムを作るためには何が必要か。(最低限動作するように)
Webアプリが作成したい、というように見えますので、最低限以下が必要と思います。
- サーバサイドの処理を書く言語の知識(ruby, perl, php, java, python等々)
必須ではないですが、以下も必要になると思います。
- javascriptの知識(Webページに動きを付けます)
- フレームワークの知識(開発が楽になります)
MVCやMVVMといったものです。
rubyならruby on rails、phpならlaravelみたいな感じのものです。検索すればたくさんでてきます。
フロントでやりたい場合はReact、AngularJS、Vue.js等があります。
- Webアプリの概要的な知識
困ったときに色々調べることになると思いますが、Webアプリはいろいろな概念が合わさって動作しているので、何が原因かの切り分けが難しいです。
リクエスト-レスポンスで動作していることくらいは知らないと厳しいです。
prai さんが書きました: ↑6年前
[1.3]今の私のイメージ
HTMLでテキストボックス(コードを書く用),submitボタンを作る。
Webサーバーはapacheを使う。
submitボタンを押すとテキストボックス内の文字をサーバーに送信する。
サーバー側は受け取ったデータを.cファイルに書き込んでコンパイルする。
コンパイルの処理結果を返す。
返ってきた処理結果をブラウザ上で表示する。
動きとしてはあっていると思います。
prai さんが書きました: ↑6年前
サーバー側にコンパイラをインストール?する方法を教えていただけると幸いです。
サーバ側のコンパイラは、通常と同じインストール方法です。
gccを使いたいならgccをインストールしますが、OSによって方法が異なると思います。
「gcc インストール方法 OS名」等で検索すれば出てくると思います。
ひとまず、localhostで動作するものを作成してみてはいかがでしょうか?
テキストボックスの設置方法がわからない、くらいから始まると思いますが、そこは誰もが通る道なので、地道に行きましょう!
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月19日(金) 20:34
by prai
回答ありがとうございます。
とても参考になります!まずはlocalhostで作ってみたいと思います。
localhostでのコンパイラ(gcc)は私が現在利用しているMacに入れたものを使うと思います。
そこで1つ質問があります。
仮にレンタルサーバーを利用するとしたらコンパイラはどのようにインストール?するのでしょうか?それともレンタルサーバー側でコンパイラは用意されているものなのでしょうか?
回答いただけると幸いです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 00:08
by beet
prai さんが書きました: ↑6年前
仮にレンタルサーバーを利用するとしたらコンパイラはどのようにインストール?するのでしょうか?それともレンタルサーバー側でコンパイラは用意されているものなのでしょうか?
レンタルサーバの場合、ソフトウェアのインストールやバージョンアップが制限されていて自分が使いたいソフトを後から追加するのが難しいのが一般的だと思います。(必要な機能があるサーバを契約します。)
そのため、最初からインストールされている機能を使うのですが、XSERER/さくらレンタルサーバ/ロリポップのサイトにはgccの記述がなく、使えるのかわかりませんね。
個人のブログによっては機能比較でgccのバージョンが書かれているものもありましたが、本当かがわかりません。
これだとつまらないので、個人的に契約しているXSERVERにSSHでログインして確認してみました。
gccのバージョンを表示してみたところ、以下の通り実行できました。
コード:
gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
また、以下のコードをコンパイルして実行してみたところ、hello worldが表示されたので、gccは使えると思います。
コード:
#include <stdio.h>
int main(void)
{
printf("hello world");
return 0;
}
特殊なことをやりたい時は、レンタルサーバはお勧めしません。
好きにカスタマイズできるVPS(GMOクラウドとか、ConoHaとか)やクラウドのVirtualMachine(GCP, AWS, Azureとか)を利用したほうが良いと思います。
コンパイラやApache、その他のソフトウェアをインストール/アップデートしたい時に自分の好きなように構築可能です。
ConoHaやクラウドのVMは時間単位で借りられるというのが売りですので、短時間借りるのもいいかもしれません。(課金されないようにサービス消したり作ったりは面倒ですが)
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 00:18
by prai
何から何までありがとうございます。
ここまでのアドバイスを参考にしながらゆっくり少しずつ作っていきます。
ありがとうございました!
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 07:50
by PonPon
C言語をCGIで動かしたくてレンタルサーバーで以前同じようなことをしたことがあります。
HTMLからPHPにコードを渡し
PHPでコードを.cファイルに保存
PHPのsystem関数からgccを呼び出しコンパイル
コンパイル後のファイル拡張子は.cgi
ブラウザからファイル名.cgiにアクセス
こんな手順でした。
ちなみに僕が使用したレンタルサーバーはxreaです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 12:21
by prai
アドバイスありがとうございます。
参考にさせていただきます。
1つ質問があります。
formからソースコードをtype="text"で渡した時に$_POST[]で参照して表示すると#include<stdio.h>の<stdio.h>の部分が表示されません。
これは$_POST[]では<>は参照できないのか、それともtype="text"では<>は渡せないのかどちらでしょうか?
回答いただけると幸いです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 12:29
by PonPon
それは実際のファイル内で確認しましたか?
それともechoでのブラウザ確認ですか?
たぶんブラウザで確認してるんだと思いますけど
<>はHTMLタグ扱いされて見えなくなってるだけです。
実際に作成されたファイルを直接エディタで確認してみてください。
もしブラウザ内で表示させたいのであればstr_replaceなどで
>と<を置き換えてみてください。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 12:51
by prai
echoでの確認でした。
なるほど、ありがとうございます。解決しました。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 14:35
by prai
phpで外部コマンドを呼び出しています。
コメントアウトしている部分でErrorの確認をしたところ次のようなErrorがでました。
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)
a.outの実行ファイルの権限がない?のかなと思うのでchmodで権限を変更しようと思ったのですが、lsで確認したところそもそも実行ファイル(a.out)が作られていないのでどうしていいのかわからなくなってしまいました。
根本的な間違いがあるかもしれません、アドバイスいただけると幸いです。
コード:
$cmd1 = 'gcc sample.c'; //こっちができていません
// $output = system("{$cmd1} 2>&1");
exec($cmd1);
$cmd2='./a.out';
system($cmd2);
追記
Posted: 2019年7月20日(土) 18:04
by prai
C言語ではなくPythonを動かすことにシフトしたところ動作しました。(インタプリタだからできたのかな?)
コード:
$command="python sample.py ";
exec($command,$output);
print "$output[0]\n";
print "$output[1]\n";
<動作検証>
iPhoneのブラウザからMacのlocalhostにアクセスして、そのホームページのformにソースコードを入力したところちゃんと処理結果を返してくれました。
謝辞
PonPonさん、beetさん、ありがとうございました。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 18:28
by PonPon
一応サンプル作ったので試してみてください。
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関数に突っ込むのは絶対にあってはならないです。
ただのサンプルなのであしからず。。。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 18:40
by PonPon
追記です。
phpのsystem関数以外にもCのコードでも色々出来ちゃうので個人だけで使うか、サービスとして提供するのであれば、送られてきたCのソースコードをしっかりチェックして使える関数と使えない関数を切り分けて下さい。
ユーザーが自由にCのソースをアップロードしてコンパイル、アクセスできるようなサービスだと本当にサーバーを滅茶苦茶にされかねません。
本当に危険なのでおすすめは個人の運用のみにした方がいいです。
Re: ブラウザ上で書いたコードをサーバー側でコンパイルさせる方法
Posted: 2019年7月20日(土) 18:50
by prai
ありがとうございます!
セキュリティの方まで考えてみます。