世界を動かす技術を、日本語で。

HNに表示: Cでウェブフレームワークを作りました

概要

Lavandulaは、 軽量 かつ 高速 なC言語製Webフレームワーク。 シンプルさ生産性パフォーマンス に重点。 CLIによる 迅速なプロジェクト作成組み込み機能 が特徴。 SQLiteやJSON、ユニットテストなど 主要機能を内蔵。 今後は 拡張機能他DB対応 も予定。

Lavandula概要

  • Lavandula は、 軽量・直感的 なC言語Webフレームワーク
  • モダンなWebアプリ を迅速に構築可能
  • シンプルさパフォーマンス を重視
  • 無駄な依存を排除 し、必要十分な機能のみ搭載
  • CLIツール によるプロジェクト作成・運用

主な機能

  • コントローラー・ルーティングシステム
  • HTTPエンドポイント (GET, POST等)対応
  • ミドルウェアパイプライン (ローカル/グローバル)
  • 純粋なC言語のみ で最小限の依存関係
  • CLIによるプロジェクトスキャフォールディング
  • 組み込みユニットテストフレームワーク
  • 環境変数 サポート
  • 組み込みロギング 機能
  • SQLite統合
  • 組み込みJSONライブラリ

開発中機能

  • HTTP JSONボディパース
  • セッションクッキー
  • CORSポリシー設定
  • Lavender ORM
  • Embedded Lavandula (ELA)
  • HTMLテンプレートエンジン

今後の予定

  • レートリミット
  • 静的ファイル配信
  • PostgreSQL/MySQL対応
  • DI(依存性注入)フレームワーク
  • ルート/エンドポイント一覧表示
  • JSONモデル・関数自動生成
    • 例: lavu model User name:string age:int
      • User構造体・JSONシリアライズ・CRUDエンドポイント自動生成

インストール手順

  • リポジトリクローン
    • git clone https://github.com/ashtonjamesd/lavandula.git
    • cd lavandula
  • インストールスクリプト実行
    • ./install.sh
    • [SUCCESS] 🎉 Lavandula installation completed! 表示で完了

クイックスタート

  • 新規プロジェクト作成
    • lavu new my-project
    • cd my-project
    • lavu run で起動
  • デフォルトで http://localhost:3000/ でアプリが稼働

サンプルコード

  • ルート定義例
    • #include "lavandula.h"
    • appRoute(home) { return ok("Hello, World"); }
    • main関数でルート登録・アプリ起動

プロジェクト作成時の出力例

  • lavu new myProject 実行時
    • myProject/lavandula.yml 作成
    • app/app.c, app/controllers/home.c など自動生成
    • 🎉 Lavandula project 'myProject' setup finished successfully! 表示

ドキュメント・サポート

  • GitHubリポジトリ
    • https://github.com/ashtonjamesd/lavandula
  • APIドキュメント
    • api.md参照

コントリビューション

  • プルリク・Issue歓迎
  • 改良点
    • メモリリーク
    • ドキュメント更新
    • JSONライブラリのネストリスト未対応
    • テストの追加

ライセンス

  • MIT License で公開

Hackerたちの意見

みんなの意見は分からないけど、俺はこれクールだと思う。もしセットアップが超読みやすくて、Cのパフォーマンスが得られるなら、なんでやらないの?特に今は、クラウドにフレームワークの一部を書いてもらえるしね。必要なものを必要な時に追加すれば、サイズも必要な分だけで、パフォーマンスもそこそこ良いプラットフォーム独立のウェブフレームワークが自動的に手に入るよ。

メンテナの悪夢チェックリスト:- ウェブフレームワーク:進化する標準に対するコミュニケーションが難しいから、維持が大変。チェック。- 誰もどうやって書いたのか分からないAI生成のコード!?チェック。- Cで書かれてる。チェック。バハハハ!編集:半分冗談だよ。実際、純粋なCのシンプルさは好きなんだ。でも、AIが書いたネットワーク向けのCはちょっとゾッとするね。

わお、すごいバッシングだね。すごく整理されたプロジェクトで、素晴らしいアイデアがあるのに。アシュトン、素晴らしい仕事だよ。君は誰にも奪われないスキルを築いたね。

ありがとう、それはすごく嬉しい! :)

いくつかのコメントでこのプロジェクトの意義を疑う声があっても、気を落とさないでほしいな。これはクールなプロジェクトだし、明らかに考えを込めてるよ。おめでとう!

それに、OPは自分を「熱狂的なC開発者」ってはっきり言ってるから、俺的にはそれだけで十分な理由だよ! :)

もちろん、そうじゃないよ。正直、彼らの言いたいことはわかるよ。ありがとう、すごく嬉しい!

オフトピック(ごめん)だけど、このスレッドは反対意見のダイナミクスのいい例だから、つい言いたくなっちゃう!「反対意見のダイナミクス」っていうのは、投稿に対して浅い/一般的な反論が早い段階で出てきて、その後に反論に対して異議を唱えたり投稿を擁護するコメントが続く傾向のこと。後者は上がることが多いんだよね—それが正当な理由で、よりポジティブで通常は内容も充実してるから。このせいで、スレッドがパラドックス的だけどよくある状態になっちゃうんだ。つまり、上位のコメントが下位のコメントの目立ち方に異議を唱えてるっていうね!(あるいは、そうだった。)これって変だけど、少なくともネガティブなコメントが上にあるよりはマシだよね。今回のケースでは、これらの5つのコメントがスレッドの上の方にあるよ:https://news.ycombinator.com/item?id=45528218 https://news.ycombinator.com/item?id=45527967 https://news.ycombinator.com/item?id=45527886 https://news.ycombinator.com/item?id=45527879 https://news.ycombinator.com/item?id=45527728 ... それに対して、早くに投稿されたネガティブ(っぽい)コメントよりも上にある:https://news.ycombinator.com/item?id=45527887 https://news.ycombinator.com/item?id=45527480 https://news.ycombinator.com/item?id=45527387 https://news.ycombinator.com/item?id=45527278 https://news.ycombinator.com/item?id=45527259 その中にはちょっとネガティブなだけで、そんなつもりじゃなかったのもあるけど、やっぱり最初にこういうのにぶつかるとWTFって感じになるよね。結局、これは反射的/反映的な違いに関係してると思う:https://hn.algolia.com/?dateRange=all&page=0&prefix=true&sor.... これが、ここで求めてるコメントと求めてないコメントの違いを説明する一番わかりやすい方法かも。

すごいね。マクロを使えば、かなりのことができるし、ほとんどの現代のウェブフレームワークは、その言語が許す複雑なツールを使ってる(Railsのメタプログラミングみたいに)。これを作ったのは素晴らしいことだよ。難しいけど楽しい!スレッドの他のコメントで「なぜ?」って言ってるけど、なんでやらないの?この技術を愛してるからさ。

ありがとう!感謝してるよ :) それに、全く同感だね。

こんにちは、これ素晴らしいと思うよ。Jetzigでの作業がすごく楽しかったし、似たような感じだね。BSD C CGI Postgresスタックも大好き。俺は主にPythonのスキルを持つCRUDモンキーだから、低レベルの言語やメモリの概念を探るのがすごく楽しい。人々はこれが実用的じゃないって文句を言うけど、埋め込みデバイスがもっと普及してくると、明確な価値が出てくるかもしれないと思う。pico calcで遊んでるけど、もしそれの「モバイルアプリ」を作るなら、フレームワークコードにはCを使いたいな。素晴らしい仕事だね!

これは最近見た中で一番クリーンで、現代的で、美しいCコードだね。カーネルじゃないのは分かってるし、大きなプロジェクトにはたくさんの#ifdef条件やランダムなアンダースコア付きの型がある理由もあるだろうけど、これはCの美しさを教えるための素晴らしい学習教材だよ。Cでこんな風にテストが書かれてるのは見たことがない。素晴らしい仕事だね。Cは中高生の時に最初に学んだプログラミング言語で、家族のPCを復活させるためにフリーソフトをインストールしてたら、ほとんどがCで作られてるって知ったんだ。大学に入るまでコンピュータサイエンスの授業の選択肢はあまりなかったけど、大学ではC++でデータ構造やアルゴリズムをやったから、ポインタを理解してたおかげでちょっと有利だった。:-) Cがそのまま評価されるのを見るのは嬉しいよ。Cはとてもクリーンでシンプルな言語だし、ちょっとした細かいところを避ければね。もちろん、Cを使う理由の一つはその細かい部分にアクセスできることだから、バランスが大事だね。

わー!それは本当に嬉しい。いつも自分のコードがそうなるように頑張ってるから :) そう言ってくれてありがとう!

俺はもうポインタのことは理解してた。これ、よく聞くんだけど、ポインタってそんなに多くの人にとって難しいの?自慢するつもりはないけど、最初に学んだときは15分くらいで理解できたと思う。プロフェッショナルになるのにはもっと時間がかかったけど、ポインタにまつわる伝説的な難しさはよくわからないな。あと、いいプロジェクトだね。仕事の応募は完了、予定通りアーカイブされて放置されるのが3...2...1... :) そうならないことを願ってるよ。

短命のバッファをローカルに割り当てるなら、mallocじゃなくてallocaを使った方がいいよ。そっちの方がずっとクリーンだし。http.cの398行目あたり、ちょっとおかしいね。

現代のコンパイラはallocaをあまり好まないって聞いたんだけど、これって間違ってるの?

みんな、そんなに真剣になってこのプロジェクトを細かく突っ込むのはやめようよ。これは実際にHNにふさわしいシェアの素晴らしい例だよ。誰かがクールなプロジェクトを作って、Cでの可能性を探求したんだから。「PHPの代わりになるのか」とか分析する必要はないよ。OP、いい仕事してるね。もしHTMLテンプレートを追加できたら、完全なフレームワークになるかもね :)

ありがとう、そう言ってくれてめっちゃ嬉しい!そう、バックログに入ってるから、実装するのが楽しみだよ :)

コードはとても読みやすくて整理されてるね。唯一の大きな批判は、エラーチェックがほとんどないことかな。例えば、snprintfやmallocを呼び出しても結果をチェックしてないのが多いよ。それに、ここに使われていないループもあるね[1]。ちなみに、並列処理のサポートが見当たらないね。初期実装としてはそれでもいいけど、ウェブサーバーはリクエストをスレッドで処理することでメリットがあるよ。もしその方向に行くなら(言葉遊びだけど)、libuvみたいなものを使うことを考えてみてもいいかもね[2]。 [1] https://github.com/ashtonjamesd/lavandula/blob/51d86a284dc7d... [2] https://github.com/libuv/libuv

フィードバックありがとう、感謝してるよ!並列処理を後で実装するつもりだったから、指摘してくれてよかった。

CでHTTPパーサーをゼロから書くのはめっちゃ危険だよ。厳密なテストなしだとすごく脆弱になっちゃうから。Cで実用的なウェブフレームワークを作るなら、libmicrohttpd、libevent_http、あるいはfastcgiみたいな、実績のあるものから始めるのがいいと思うよ。