
クイック、セットアップなしWebサーブエル
QuickServは、どのプログラミング言語を使用していても、Webアプリケーションの作成を危険なほど簡単にします。
QuickServは、依存関係のない、静的にリンクされた、シングルファイルWebサーバーです。
read writeプログラミング言語で動作しますQuickservは、1990年代のインターネットの厄介な楽しみを2020年代にもたらします。 Common Gateway Interface(CGI)に触発されていますが、セットアップと使用がはるかに簡単です。 CGIとは異なり、あいまいなログファイルを検索せず、HTTPヘッダーがどのように機能するか、許可ビットをいじることも、CORSについて心配せず、スクリプトを置く場所も不思議に思うことも、Apache mod_cgi構成に苦労していないことを学ぶことなく、箱から出して動作します。
CGIとは異なり、前の段落からQuickServを使用することが何を意味するのかを知る必要はありません。
それは完璧です:
QuickServは、パブリックインターネットで使用しないでください。プライベートネットワークでのみ使用する必要があります。
QuickServの使用は、プログラムをダウンロードしたり、プロジェクトフォルダーにドラッグしたり、クリックして実行したりするのと同じくらい簡単です。実行するファイルを自動的に検出し、ユーザーに直接サービスを提供します。
Windows用のダウンロード。
プロジェクトフォルダーを作成し、ファイルを追加します。たとえば、Pythonがインストールされている場合、次のプロジェクトフォルダーにtest.pyというファイルを作成します。
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
test.py #!somethingで始まるので、 something test.pyはそれを実行することを知っています。 QuickServがファイルを実行していない場合は、これを最初に追加してください。
Windowsでは、QuickServは.exeおよび.batで終了するファイルを自動的に実行することも知っています。他のファイルタイプは、実行する必要がある場合は#!somethingから始める必要があります。
ダウンロードしたquickserv_windows_x64.exeファイルをプロジェクトフォルダーに移動します。

プロジェクトフォルダーでquickserv_windows_x64.exeダブルクリックして、QuickServを開始します。プロンプトが表示されれば、Windows Defenderを介してアクセスを許可します。


http://127.0.0.1:42069(またはQuickServが示すアドレス)にアクセスして、Webアプリケーションに接続します。この例では、 test.pyを実行するには、http://127.0.0.1:42069/test.pyにアクセスしてください。

コンピューターに適したバージョンをダウンロードしてください。必要に応じて、Macが持っているプロセッサの種類を確認してください。ファイルをダウンロードした後、ファイルを解凍する必要があります。
プロジェクトフォルダーを作成し、ファイルを追加します。たとえば、Pythonがインストールされている場合、次のプロジェクトフォルダーにtest.pyというファイルを作成します。
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
TextEditを使用してファイルを作成している場合は、正しい形式でファイルを保存するには、 Format > Make Plain Text必要があります。

test.py #!somethingで始まるので、 something test.pyはそれを実行することを知っています。 QuickServがファイルを実行していない場合は、これを最初に追加してください。
Macでは、Quickservはコンパイルされたファイルを自動的に実行することも知っています。他のファイルタイプは、実行する必要がある場合は#!somethingから始める必要があります。
ダウンロードしたquickserv_macos_x64またはquickserv_macos_arm64ファイルをプロジェクトフォルダーに移動します。
quickserv_macos_x64またはquickserv_macos_arm64を右クリックして、プロジェクトフォルダーで[開く]を選択します。次に、[確認]ダイアログボックスで「開く」を押します。この方法で1回実行した後、ファイルをダブルクリックするだけでQuickServを開始できます。



http://127.0.0.1:42069(またはQuickServが示すアドレス)にアクセスして、Webアプリケーションに接続します。この例では、 test.pyを実行するには、http://127.0.0.1:42069/test.pyにアクセスしてください。

コマンドラインを介してインストールして実行するのが最も簡単です。ターミナルを開きます。
次のコマンドを入力します。最初のコマンドにはパスワードが必要になる場合があります。
# Download
sudo curl
--location
--output /usr/local/bin/quickserv
https://github.com/jstrieb/quickserv/releases/latest/download/quickserv_raspi_arm
# Make executable
sudo chmod +x /usr/local/bin/quickserv
# Make a project folder
mkdir -p my/project/folder
# Go to project folder
cd my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickserv http://127.0.0.1:42069(またはQuickServが示すアドレス)にアクセスして、Webアプリケーションに接続します。たとえば、 test.pyを実行するには、http://127.0.0.1:42069/test.pyにアクセスしてください。
クリックして実行可能ファイルを実行しても、Linuxディストリビューション全体で一貫した動作がないため、コマンドラインを介してインストールして実行するのが最も簡単です。コンピューターのアーキテクチャに応じて、以下のcurl HTTPリクエストURLの最後にあるファイル名を変更する必要がある場合があります。
リリースページのすべてのダウンロードオプションを参照してください。
# Download
sudo curl
--location
--output /usr/local/bin/quickserv
https://github.com/jstrieb/quickserv/releases/latest/download/quickserv_linux_x64
# Make executable
sudo chmod +x /usr/local/bin/quickserv
# Make a project folder
mkdir -p /my/project/folder
# Go to project folder
cd /my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickserv http://127.0.0.1:42069(またはQuickServが示すアドレス)にアクセスして、Webアプリケーションに接続します。たとえば、 test.pyを実行するには、http://127.0.0.1:42069/test.pyにアクセスしてください。
または、以下の指示を使用して、ソースからコンパイルします。
次のコマンドを使用して、ソースからコンパイルしてインストールします。埋め込まれたファイルシステムに依存するため、GOのバージョンが1.16を超える必要があります。
go install github.com/jstrieb/quickserv@latest次に、プロジェクトフォルダーを作成し、それを入力し、QuickServを実行します。
# Make a project folder
mkdir -p /my/project/folder
# Go to project folder
cd /my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickservQuickServの重要な機能を示すために、追加の追加を実行するための簡単なWebアプリケーションを構築します。コードはベストプラクティスに従いませんが、QuickServで構築を開始するのに必要なものがほとんどないことを示します。
まず、プロジェクトフォルダーを作成し、QuickServ実行可能ファイルを開始ステップのようにフォルダーにドラッグします。
次に、フォルダー内で、次のテキストをindex.htmlとして保存します。
< form action =" /calculate " >
< input name =" first " type =" number " > + < input name =" second " type =" number " > = ???
< br >
< button > Calculate </ button >
</ form >このコードは/calculateページに2つの変数を送信します。ブラウザでは、次のように見えます。

次に、プロジェクトフォルダー内のcalculateというフォルダーを作成します。 calculateフォルダー内で、次のコードをindex.pyとして保存します。名前index.whatever 、ユーザーがhttp://website/calculate http://website/calculate/index.py :// webサイト/計算にアクセスしたときにこのファイルを実行するようQuickServに指示するものはありますか。
コードコメントに特に注意してください。多くの重要なQuickServ機能を強調しています。
#!python3
# Each QuickServ script must begin with a line like the one above so that
# QuickServ knows how to run the file. This line tells QuickServ that I would
# type `python3 this_file.py` to run this file at the command prompt. For
# example, if you wanted to do `julia this_file.py` instead, then you would
# make the first line of `this_file.py` be `#!julia`.
#
# Since we just want QuickServ to show the HTML code to the user and not run
# it, index.html does not begin with this. The first line is only required when
# QuickServ has to run the code.
import argparse
# All HTML form values get turned into command line arguments. The names are
# formatted like "--name" and the value comes right after the name.
parser = argparse . ArgumentParser ()
parser . add_argument ( "--first" , type = int , required = True )
parser . add_argument ( "--second" , type = int , required = True )
args = parser . parse_args ()
# Print the result -- anything printed out goes right to the user. In this
# case, the output is text. But you can print anything and QuickServ will guess
# the file type. Even printing the contents of image and video files works.
print ( args . first + args . second )ここで、プロジェクトフォルダーのQuickServをダブルクリックして、ブラウザで試してみます。それでおしまい!
より多くのQuickServデモンストレーションについては、次のセクションにリンクした例を参照してください。詳細については、How It Worksセクションとコード自体をご覧ください。高度なセクションには、実行される実行可能ファイル用の環境QuickServセットアップに関する追加情報があります。
すべての例は、JSTRIEB/QuickServ-Examplesリポジトリに接続されたGITサブモジュールであるexamplesフォルダーにあります。例の実行方法の詳細については、そのリポジトリにアクセスしてください。
いくつかのハイライト:
| まとめ | 言語 | Windows | マック | Linux |
|---|---|---|---|---|
| youtubeからgif | シェル | |||
| ブルームフィルターを作成します | c | |||
| 同期された映画リスト | タイプスクリプト | |||
| Brainfuck通訳 | X86-64アセンブリ | |||
| マンデルブロットズーム | シェル | |||
| 暗号通貨ダッシュボード | 行く | |||
| PDFツール | Python | |||
| PDFとしてタイプセットマークダウン | 標準ML |
すべてのQuickServコードはquickserv.goに住んでいます。この適切に収容されたファイルの長さは約700行で、読みやすい1時間でGolangの親しみやすさのない経験豊富なプログラマーを採用する必要があります。
QuickServには2つの主要な部品があります。 1つ目は初期化手順で、起動時に1回実行されます。 2番目は、ユーザーがサーバーにHTTP要求を行うたびに呼び出されるハンドラー関数です。
QuickServが起動すると、コマンドライン構成フラグをチェックし、 --logfile (それ以外の場合は標準出力にログにログ)して渡された場合にログファイルが開き、ワーキングディレクトリが--dirで渡された場合にディレクトリを変更します。ログファイルパスは、現在の作業ディレクトリに関連しており、 --dirで渡されたものとは相対的ではないことに注意してください。
次に、QuickServは、実行されるファイルの作業ディレクトリをスキャンします。実行されるすべてのファイルを印刷します。この動作は、QuickServがスクリプトを実行可能として認識しているかどうかを判断するのに役立ちます。また、サーバーにアクセスするためにアクセスするためにWebアドレスなど、ユーザーにとって有用な情報、サーバーが実行されているフォルダー、および停止方法も印刷します。
初期化の一部が失敗した場合、エラーが報告されます。致命的なエラーが発生した場合、QuickServは停止する前にユーザーの入力を待ちます。このようにして、(コマンドラインから起動するのではなく)実行可能ファイルをダブルクリックするユーザーはウィンドウが表示されず、すぐに消え、エラーが読み取られるには速すぎます。
エラーメッセージは、できるだけ少ない技術用語で意図的に記述されますが、いくつかは避けられません。エラーの原因もエラーメッセージに含まれているため、ユーザーが識別して修正しやすくなります。
初期化手順の最後のステップとして、QuickServはすべてのリクエストに対して単一のハンドラー関数を備えたWebサーバーを起動します。サーバーは、 42069のデフォルトポート、またはユーザーが--random-portコマンドラインフラグを指定した場合にランダムなポートに耳を傾けます。たとえば、ユーモアのない人にQuickServを使用して構築されたプロジェクトをユーザーに表示する必要がある場合、ランダムポートが望ましいでしょう。
ユーザーがWebページにアクセスすると、QuickServはLone Handler関数を呼び出すことでリクエストを処理します。
まず、この関数は、ユーザーが要求したファイルを開こうとします。ファイルを見つけたり開けたりできない場合は、ファイルのデフォルトバージョンを提供しようとします。たとえば、提供されるデフォルトのデフォルトのfavicon.icoが埋め込まれています。パスに一致するデフォルトのファイルがない場合、組み込みのGo Fileserverがエラーを処理し、404エラーコードで応答することができます。
ユーザーが要求したファイルが存在する場合、それがディレクトリであるかどうかをチェックします。ディレクトリの場合、QuickServはxxxがファイル拡張子であるindex.xxxという名前のファイルを参照します。インデックスファイルが見つかった場合、インデックスは要求された元のページであるかのように提供されます(そしておそらく実行されます)。それ以外の場合、ユーザーはデフォルトのインデックスなしでディレクトリを要求している必要があるため、QuickServはディレクトリ内の他のファイルのリストで応答します。
ユーザーが要求したファイルが存在し、ディレクトリ(つまり、通常のファイル)ではない場合、QuickServは実行可能かどうかをチェックします。もしそうなら、それは見つけたファイルを実行します。そうでない場合は、生ファイルの内容をユーザーに返します。どちらの場合も、QuickServは、応答に使用するFiletype(したがってどのmimetype )を推測します。
ファイルが実行可能かどうかを判断するための手法は、ランタイムオペレーティングシステムによって異なります。 Windowsでは、 .batまたは.exe拡張機能を備えたファイルは実行可能と見なされます。非ワインドシステムでは、実行可能な許可ビットセットを備えたファイルは実行可能と見なされます。すべてのシステムで、最初に有効な擬似シェバンがある場合、ファイルは実行可能です。シバンは最初の行にある必要があり、 #! 、そして有効なコマンドでなければなりません。たとえば、 python3がインストールPATHれていると仮定して、以下の両方が許容されます。
#!/usr/bin/python3#!python3ファイルを実行するには、QuickServはファイル自体を実行します( .exeであるか、実行可能ビットが設定されている場合)、またはShebangにリストされている実行可能ファイルの最初の引数としてファイルのパスを渡します。リクエスト本体は標準入力のプログラムに渡され、標準出力に関するプログラムによって印刷されたものはすべて、応答本体として使用されます。実行されたプログラムは、http応答ヘッダーを作成することはできません。
すべての解析されたHTTPフォーム変数( Content-Typeがx-www-form-urlencodedの場合)も、プログラムが実行されたときにコマンドラインの引数として渡されます。これにより、ユーザーは変数自体を解析する必要はありません。
実行されたプログラムが標準エラーで印刷されていても、QuickServによってログが記録されます。つまり、デフォルトでコンソールウィンドウに印刷されます。これはデバッグに便利です。プログラムがゼロ以外の出口コードで終了した場合、QuickServは500の内部サーバーエラーで応答します。それ以外の場合は、200で戻ります。
リクエストがフォームデータを使用したURLエンコードの投稿リクエストである場合、QuickServ URL-Decodeは、3つのシンボルを除くすべての文字をデコードします: % 、 & 、および= 。ユーザーはこれらの代わりに責任を負います。フォームデータを処理するプログラムでは、常にURL-Decode %が持続することが重要であることに注意してください。
パブリックインターネットでQuickServを実行しないでください。プライベートネットワークでのみ実行します。
QuickServは、生産用に設計されていません。速いまたは安全であるように作成されたものではありません。 QuickServを使用すると、ユーザーと自分自身が危険にさらされます。しないでください。
QuickServは、人々が危険なほど不安定なものを構築できるようにします。入力や出力を消毒しません。要求ごとに1つのプロセスを使用し、サービス攻撃の拒否の影響を受けやすいです。そのセキュリティモデルは、Webユーザーが信頼できると仮定しています。これらの特性はプロトタイピングを容易にしますが、パブリックインターネットでは安全ではありません。
生産でQuickServの使用を阻止するために、ポート42069で実行されます。うまくいけば、それは誰もが逆プロキシまたはポートフォワードの構成に入力する前によく考えさせるようにします。よりプロフェッショナルなデモのために、コマンドラインフラグ--random-port代わりに実行時に決定されるランダムポートを使用します。
QuickServは、古代のCGIプロトコルに似ています。 CGIが生産が悪く、それらはすべてQuickservに生産に適用されるという、よく明白で確立された多くの理由があります。
QuickServには、コマンドラインフラグを介して構成された高度なオプションがあります。これらは、QuickServの実行方法と場所、およびその出力を節約する場所を変更します。
Usage:
quickserv [options]
Options:
--dir string
Folder to serve files from. (default ".")
--logfile string
Log file path. Stdout if unspecified. (default "-")
--no-pause
Don't pause before exiting after fatal error.
--random-port
Use a random port instead of 42069.
CGIの模倣では、HTTPヘッダーが環境変数として実行されたプログラムに渡されます。 Header-Nameと呼ばれるヘッダーは、環境変数HTTP_HEADER_NAMEとして設定されます。
リクエストがGET 、 POSTなどを指定するREQUEST_TYPE変数もあります。
HTTPは、ボディを使用して標準入力で実行されたプログラムにボディを渡します。ほとんどの場合、リクエスト本体は逐語的に渡されます。これは、HTMLフォームには当てはまりません。
HTMLフォームデータは、チュートリアルのように、コマンドライン引数から読み取るか、標準入力から解析できます。変数が形式を取ります
name=value&othername=othervalue
チュートリアルの簡単な追加例を書き直して、コマンドライン引数ではなく標準入力からHTTPフォーム値を解析できます。
#!python3
import sys
# In the form input, "=" and "&" determine where variables start and end. So if
# they are literally included in the variable name or value, they must be
# specially decoded. This code replaces every instance of the text on the left
# with the text on the right to do the decoding:
# %3D -> =
# %26 -> &
# %25 -> %
#
# NOTE: Order matters! "%" must be decoded last. If not, it can mess with
# decoding the others, since their encoded version uses "%"
def decode_characters ( text ):
text = text . replace ( "%3D" , "=" )
text = text . replace ( "%26" , "&" )
text = text . replace ( "%25" , "%" )
return text
first = second = 0
# Read all of the input into a variable. We are expecting the raw data to look
# like:
# first=123&second=456
data = sys . stdin . read ()
# The raw data looks like the above, so split it into pairs at each "&"
pairs = data . split ( "&" )
for pair in pairs :
# Each pair looks like the following, so split at each "=":
# name=value
name , value = pair . split ( "=" )
# Decode any special characters (=, &, %) now that we have split the
# variables up. This isn't necessary here since we're expecting numbers and
# not expecting any of those characters. But it matters a lot when a user
# could submit text with those characters
name = decode_characters ( name )
value = decode_characters ( value )
# If the name is what we're looking for, store the value for adding
if name == "first" :
first = int ( value )
elif name == "second" :
second = int ( value )
# Print the result -- anything printed out goes right to the user. In this
# case, the output is text. But you can print anything and QuickServ will try and
# guess the file type.
print ( first + second )このプロジェクトは積極的に開発され、維持されています。最近のコミットがない場合、それはすべてがスムーズに実行されていることを意味します!
バグ、提案、または質問の問題を開いてください。これには、特に、エラーメッセージを可能な限り明確にする方法、およびデフォルトの設定をできるだけ多くのユーザーに適用する方法についての議論が含まれます。
事前の議論なしのリクエストは無視されます - それが統合されることを確認する前にコードを書く時間を無駄にしないでください。忙しく孤独な開発者として、すべてのコード貢献がコンテキストを持っているときに応答する方が簡単です。
ブログ投稿、ビデオ、チュートリアル、ハッカソンプロジェクト、またはQuickServを使用して他の何かを作成する場合は、問題を開いたり、連絡先フォームにメッセージを送ってください。
プロジェクトをサポートする方法はいくつかあります。
これらのことは、私が構築したものを共有し続けるように動機付け、私の仕事が高く評価されていることを検証します!また、プロジェクトの改善にも役立ちます。前もって感謝します!
あなたがあなたのサポートを示すためにお金を使うことに固執しているなら、私はあなたが代わりに以下の組織のいずれかに寛大な寄付をすることをお勧めします。インターネットの自由を擁護することにより、これらのような組織は、私がウェブ上で公に仕事を公開するのに快適なリリースを感じるのに役立ちます。
このプロジェクトは、次のように助けなしでは不可能です。