9ステップの真のCommon Lispウェブサイト

はじめに









この入門記事は、WebプログラミングタスクでCommon Lispを使用してみたい人を対象としています。 私はこの言語の利点については語りませんが、 ababoは入門記事「 Common LispでのWebアプリケーションの開発(パート1)」でそれを行いました。



私はCommon LispでのWebアプリケーションの開発に1年以上取り組んでおり、Common Lispで大規模なオンラインストアを作成しました。これにより、Lispが商用利用に役に立たないと考える人々の反対を防ぐことができます。



今日の私の仕事は、必要なすべてのインフラストラクチャを展開するために使用する方法について詳しく説明することです。 この記事を段階的なガイドとして使用すると、注意深い読者はLispに自分のWebサイトを展開できるようになります。



おそらく私のアプローチは理想的ではありません-この場合、建設的な批判に喜んでいます-あなたが何かを好きではないなら恥ずかしがらないでください-この記事の目標の1つはあなた自身の間違いを修正することでした。



退屈なインストール手順をスキップしたい人のために-記事の終わりに、これまでにLispを扱ったことのない人なら、おそらくWebプログラミングの見方を広げる少しの良さがあります。 キーワードSLIMEおよびSWANKで検索:)





SBCLの最新バージョンをインストールします





私はSBCLをCommon Lispの最も便利で一般的な無料の実装として使用し、便利で快適な作業を提供するEmacs環境と密接に統合しています。 通常、リポジトリにはSBCLの最新バージョンがないため、ソースからコンパイルしたり、アーキテクチャ用のバイナリをインストールしたりできます。 後者は簡単なので、この記事ではソースからのコンパイルについて説明します。



新しいSBCLをコンパイルするには、古いものを使用できます。パッケージマネージャーを使用してすぐにインストールします。



$ apt-get install sbcl
      
      







SBCLソースは、sbcl.sourceforge.net / platform-table.htmlから入手できます。



 #  $ wget http://downloads.sourceforge.net/project/sbcl/sbcl/1.0.45/sbcl-1.0.45-source.tar.bz2 #  : $ bzip2 -cd sbcl-1.0.45.tar.bz2 | tar xvf - #      $ cd sbcl-1.0.45/ $ sh make.sh #   SBCL    $ apt-get remove sbcl #   sbcl $ sh install.sh # ,    : $ sbcl This is SBCL 1.0.45, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>. SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. *
      
      







おめでとうございます。これでsbclの新しいバージョンができました。 現時点では、可能性のある不正確さを回避するために、サーバーに展開しています。記事の最後で、少なくともすべてが機能することを確認できます。 さて、そうなることを期待しましょう:)



クイックリスを入れます





ライブラリを管理するには、2つのパッケージマネージャー-ASDFとQuickLispが最もよく使用されます。 後者は非常に使いやすく、前者はすでにSBCLがプリインストールされているので、QuickLispを自分用にインストールします。 Quicklisp.orgにはすべての背景情報が含まれているので、繰り返しません。インストールに進みます。



 $ wget http://beta.quicklisp.org/quicklisp.lisp $ sbcl --load quicklisp.lisp * (quicklisp-quickstart:install) * (ql:add-to-init-file)
      
      







フンチェントートを入れる





ライブラリマネージャーができたので、インストールします

hunchentoot Webサーバーとそのすべての依存関係を1つのコマンドで:



 * (ql:quickload 'hunchentoot)
      
      







サーバーに白鳥とスライムを置きます





「リモートデバッグのさらに印象的な例は、1998年のNASAのDeep Space 1ミッションで発生しました。 宇宙船の打ち上げから6ヶ月後、小さなLispコードが一連の実験を行うために2日間宇宙船を操作することになっていた。 ただし、コード内のとらえどころのない競合状態は、地上でのテスト中に検出されず、すでに宇宙で発見されました。 宇宙(地球から1億マイル)でエラーが検出されたとき、チームは作業コードを診断および修正することができ、実験を完了することができました。 プログラマーの1人は、これについて次のように述べています。



-1億マイル離れた1億ドル相当の機器で実行されているプログラムのデバッグは興味深い体験です。 「宇宙船で動作するREPLは、問題を見つけて解決する上で非常に貴重な機会を提供します。」





私は自分でLispに対処し始めるずっと前にこの事件について聞いたことがありますが、正直なところ、マルチメガバイトの実行可能ファイルやそれほど大きくない動的にリンクされたライブラリという現代の世界で繰り返されることはもはやありませんでした。 しかし、Lispイメージのリモートコントロール機能に慣れると、自分のマシンでコードを操作することほど難しくないと確信しました。 また、インクリメンタルビルド、長いコンパイル、またはFTPを介したスクリプトのダウンロードはありません。スライムを使用すると、稼働中のシステムに接続して、ホットスワップコードの実装、強力なイントロスペクションツールを使用したオブジェクト、関数、マクロの検査など、ほぼすべてを表示および変更できます。



どのように機能しますか? -お願いします。 リモートサーバー上のLispイメージ内では、SWANKが動作します。これは、Lispイメージを制御するすべてのレバーへのアクセスを提供するバックエンドを提供する特別なライブラリです。 SWANKはCommon Lispで書かれており、かなり単純なテキストプロトコルを使用してSLIMEと通信します。



Emacs-eはEmacs Lispで書かれたSLIMEを実行します。これにより、コードファイルの編集時に、コマンド、コード、オブジェクトの定義、および構造をリモートCommon Lispイメージに送信できます。 そのため、リモートサーバーにソースコードのコピーさえまったくない場合があります。その場合、たとえばバックドアを保護するために攻撃者がソースコードを変更することはできません。



そして、Lispを区別するコード生成の開発された手段を考えると、あなたはほとんどコードをまったく持たないことができます-それはデータ自体によって生成されます-戦わないサムライ、おそらくコードを書かないプログラマだけよりも優れています...うーん、私は何かここに夢中になって、インストールに戻ります:)



そのため、私のようなリモートサーバーがある場合は、SWANKをその上に、SLIMEを作業中のマシンに置くことができます。 または

あちこちにあるものとあちこちにあるもの-混乱しないようにするための主なこと。 SWANKをインストールします。



 $ sbcl * (ql:quickload 'swank)
      
      







...およびSLIME



 $ wget http://common-lisp.net/project/slime/snapshots/slime-current.tgz $ tar xvzf slime-current.tgz $ cd slime-2011-01-06/
      
      







このディレクトリのREADMEを注意深く読んで、

〜/ .emacs / init.el以下のコード、正しいパスに従う



 ;; SBCL (setq inferior-lisp-program "/opt/sbcl/bin/sbcl") ; your Lisp system (setq slime-lisp-implementations '((sbcl ("sbcl")))) (setq slime-startup-animation nil) ;; SLIME (add-to-list 'load-path "~/.emacs.d/slime") ;;   slime (require 'slime) (setq slime-net-coding-system 'utf-8-unix) (slime-setup '(slime-fancy)) (setq slime-enable-evaluate-in-emacs t)
      
      







画面を置く





私のサーバーは決してクラッシュしないので(そう、はい:)-私はスクリーンを使用してSBCLの常時コピーを保持しますが、私が知る限りではより良い方法があります(有能な読者は間違いなくコメントで思い出すでしょう)



まだお持ちでない場合は、次のように入力してください:



 $ apt-get install screen
      
      







サーバーで画面でsbclを実行し、ポート4005でswankサーバーを起動します





 $ screen -S sbcl $ sbcl * (require 'asdf) * (asdf:oos 'asdf:load-op 'swank) * (setq swank:*use-dedicated-output-stream* nil) * (swank:create-server :coding-system "utf-8-unix" :dont-close t :port 4005)
      
      







マシンで実行中のEmacs-aからサーバー上のLispイメージに接続します





ターミナルで、sshトンネルをホストに転送します



 ssh -2 -N -f -L 4005:localhost:4005 user@host.tld
      
      







Emacsでは、このトンネルを介して接続します



 Mx slime-connect 127.0.0.1 4005
      
      







または、サーバーがホームマシンである場合-何も投げてSWANKを上げる必要はありません-Emacs-eを入力するだけです:



 Mx slime
      
      







ポート4242でWebサーバーhunchentootを起動します





これで、hunchentoot Webサーバーを持ち上げる準備ができました。 ポート4242まで持ち上げて、nginxをプロキシとして使用します。 また、Nginxは静電荷を与え、最適に設計された多くのことを行います。



テストのためのnginxの設定は非常に簡単です:



サーバー{
    80を聞きます。
    server_name localhost;
    場所/ {
       proxy_pass http:// localhost:4242;
       proxy_redirect off;
    }
 }




archimag -aの作成者向けの次のコードは、適切な対処が可能なリモートサーバーでエラーが発生したときに、このエラーをスタックトレースと共に居心地の良いemacsにすぐに転送できる特別なクラスを作成します。 したがって、サイトが実行されているサーバーに接続している場合、Webプログラミングで使用される他の多くの言語とは異なり、エラーは発生時に常に発生します。



たとえば、エラーが多すぎる場合、訪問者は常に間違ったページにアクセスします。値* catch-errors-p *を変更するだけで、すでにエラーが到着しているため、干渉することなく理解できます。



 (defparameter *catch-errors-p* nil) (defclass debuggable-acceptor (hunchentoot:acceptor) ()) (defmethod hunchentoot:acceptor-request-dispatcher ((acceptor debuggable-acceptor)) (if *catch-errors-p* (call-next-method) (let ((dispatcher (handler-bind ((error #'invoke-debugger)) (call-next-method)))) (lambda (request) (handler-bind ((error #'invoke-debugger)) (funcall dispatcher request)))))) (defun request-dispatcher (request) "Hello!") (defparameter *debuggable-acceptor* (make-instance 'debuggable-acceptor :request-dispatcher 'request-dispatcher :port 4242)) (hunchentoot:start *debuggable-acceptor*) (setf hunchentoot:*handle-http-errors-p* nil)
      
      







request-dispatcher関数は、各着信要求で呼び出され、この場合は単に「Hello!」を返します。その拡張については、次の記事で説明します。



この場所を読む場合は、ボトルを置く必要があります

ビール 、さらにはLispでテストサイトを作成しました。

うらやましい! Lispと知り合いになって1年半近く経ちました

この素晴らしい言語を楽しんでいます-そして、あなたはこの点ですべてを持っています

前に。 ハッピーハッキング!



All Articles