『なるほどUnixプロセス』付録D の「Spyglass」は触って学べるWebサーバー。同書で解説されているUnixプログラミングのテクニックを盛り込んでいる。
せっかくなので試そうと以下のコマンドにて起動を試みたが、起動しない。
# application's root dir $ spyglass
環境
- ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
- Bundler version 1.17.2
- 『なるほどUnixプロセス』 v1.1.4
- Spyglass code は公式サイト https://pragprog.com/titles/jsunix/source_code の
Download jsunix-code.zip
linkから zip ダウンロードしたもの
結論
以下のコマンドで実行可能になる。
$ bundle install $ bundle exec rake compile $ bundle exec bin/spyglass
dockerで起動する
docker container上で起動することもできる
$ docker run -it -v $PWD:/app -w /app ruby bash # bundle installの結果等を永続化しないやり方
で立ち上げたあとは同じく bundle install から行う。
ローカルマシンで http://localhost:4222
にアクセスすると動いていることが確認できる。
bundle install ~ spyglassを立ち上げるまでのfull log
root@62f15c7de4e3:/app# bundle install Fetching gem metadata from https://rubygems.org/. ....... Fetching rake 10.1.0 Installing rake 10.1.0 Fetching addressable 2.3.4 Installing addressable 2.3.4 Using bundler 1.17.2 Fetching excon 0.25.3 Installing excon 0.25.3 Fetching launchy 2.3.0 Installing launchy 2.3.0 Fetching minitest 5.0.6 Installing minitest 5.0.6 Fetching posix-spawn 0.3.6 Installing posix-spawn 0.3.6 with native extensions Fetching rack 1.3.10 Installing rack 1.3.10 Fetching rack-protection 1.5.0 Installing rack-protection 1.5.0 Fetching rake-compiler 0.8.3 Installing rake-compiler 0.8.3 Fetching tilt 1.4.1 Installing tilt 1.4.1 Fetching sinatra 1.3.3 Installing sinatra 1.3.3 Bundle complete! 7 Gemfile dependencies, 12 gems now installed. Bundled gems are installed into `/usr/local/bundle` root@62f15c7de4e3:/app# bundle exec rake compile mkdir -p tmp/x86_64-linux/spyglass_parser/2.6.3 cd tmp/x86_64-linux/spyglass_parser/2.6.3 /usr/local/bin/ruby -I. ../../../../ext/spyglass_parser/extconf.rb checking for main() in -lc... yes creating Makefile cd - cd tmp/x86_64-linux/spyglass_parser/2.6.3 make compiling ../../../../ext/spyglass_parser/parser.c In file included from parser.rl:7:0: parser.rl: In function 'spyglass_http_parser_execute': parser.rl:112:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] parser.rl: In function 'spyglass_http_parser_finish': parser.rl:142:7: warning: implicit declaration of function 'spyglass_http_parser_has_error' [-Wimplicit-function-declaration] parser.rl:144:14: warning: implicit declaration of function 'spyglass_http_parser_is_finished' [-Wimplicit-function-declaration] parser.rl: At top level: cc1: warning: unrecognized command line option '-Wno-self-assign' cc1: warning: unrecognized command line option '-Wno-parentheses-equality' cc1: warning: unrecognized command line option '-Wno-constant-logical-operand' cc1: warning: unrecognized command line option '-Wno-cast-function-type' compiling ../../../../ext/spyglass_parser/spyglass.c ../../../../ext/spyglass_parser/spyglass.c: In function 'Spyglass_HttpParser_alloc': ../../../../ext/spyglass_parser/spyglass.c:251:3: warning: implicit declaration of function 'spyglass_http_parser_init' [-Wimplicit-function-declaration] spyglass_http_parser_init(hp); ^~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../ext/spyglass_parser/spyglass.c: In function 'Spyglass_HttpParser_finish': ../../../../ext/spyglass_parser/spyglass.c:303:3: warning: implicit declaration of function 'spyglass_http_parser_finish' [-Wimplicit-function-declaration] spyglass_http_parser_finish(http); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../ext/spyglass_parser/spyglass.c:305:10: warning: implicit declaration of function 'spyglass_http_parser_is_finished' [-Wimplicit-function-declaration] return spyglass_http_parser_is_finished(http) ? Qtrue : Qfalse; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../ext/spyglass_parser/spyglass.c: In function 'Spyglass_HttpParser_execute': ../../../../ext/spyglass_parser/spyglass.c:343:5: warning: implicit declaration of function 'spyglass_http_parser_execute' [-Wimplicit-function-declaration] spyglass_http_parser_execute(http, dptr, dlen, from); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../ext/spyglass_parser/spyglass.c:347:8: warning: implicit declaration of function 'spyglass_http_parser_has_error' [-Wimplicit-function-declaration] if(spyglass_http_parser_has_error(http)) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../ext/spyglass_parser/spyglass.c: At top level: cc1: warning: unrecognized command line option '-Wno-self-assign' cc1: warning: unrecognized command line option '-Wno-parentheses-equality' cc1: warning: unrecognized command line option '-Wno-constant-logical-operand' cc1: warning: unrecognized command line option '-Wno-cast-function-type' linking shared-object spyglass_parser.so cd - install -c tmp/x86_64-linux/spyglass_parser/2.6.3/spyglass_parser.so lib/spyglass_parser.so root@62f15c7de4e3:/app# bundle exec bin/spyglass [96] [Spyglass::Server] Listening on port 0.0.0.0:4222 [96] [Spyglass::Lookout] Received incoming connection [97] [Spyglass::Master] Loaded the app [97] [Spyglass::Master] Spawned 2 workers. Babysitting now...
(warningが出ているが…動く)
参考
『なるほどUnixプロセス』付録のSpyglassを起動する - Qiitaを参考にさせてもらったが、このやり方ではうまくいかなかった。