SlideShare a Scribd company logo
1 of 31
Shelly
株式会社はてな
id:nitro_idiot




                 2012/05/12 Kyoto.lisp #1
深町英太郎
id:nitro_idiot
作ったもの

• Clack          • CL-Markup

• Caveman        • CL-Project

• ningle         • Shelly

• CL-TEST-MORE

• CL-DBI


                       See github.com/fukamachi
作ったもの

• Clack          • CL-Markup

• Caveman        • CL-Project

• ningle         • Shelly   ←
• CL-TEST-MORE

• CL-DBI


                       See github.com/fukamachi
Shelly


•   普段Common Lisp書いてる

•   スクリプトはPerlで書いてる

•   「Common Lispでもスクリプト!」

    •   ワンライナー?
Perlの場合



• plackup   app.psgi --server Starman --port 3000
Common Lispの場合

$ ccl --eval ‘(ql:quickload :clack)’

$ ccl --eval ‘(ql:quickload ‘(:clack :ningle))’

                                       シングルクォートで
                                   シェルスクリプトエラー!!!


$ ccl --eval ‘(ql:quickload (quote (:clack :ningle)))’
Common Lispの場合
$ ccl --eval ‘(ql:quickload :clack)’ 
      --eval ‘(clack:clackup #p”app.lisp” :server :fcgi :port 3000)’

$ clisp -x ‘(ql:quickload :clack)’ 
        -x ‘(clack:clackup #p”app.lisp” :server :fcgi :port 3000)’

$ cmucl -eval ‘(ql:quickload :clack)’ 
        -eval ‘(clack:clackup #p”app.lisp” :server :fcgi :port 3000)’
Shellyの場合
Shellyの場合


• shly   -Lclack clackup --server fcgi --port 3000
Shellyの場合

     ライブラリのロード



• shly   -Lclack clackup --server fcgi --port 3000
Shellyの場合

     ライブラリのロード



• shly   -Lclack clackup --server fcgi --port 3000

            呼び出す関数
Shellyの場合

                         キーワード引数
     ライブラリのロード



• shly   -Lclack clackup --server fcgi --port 3000

            呼び出す関数
Shellyの場合

                            キーワード引数
     ライブラリのロード



• shly   -Lclack clackup --server fcgi --port 3000

            呼び出す関数


              (clackup :server :fcgi :port 3000)
Shellyとは

• Common    Lispの関数をシェルコマンドのよ
 うに呼び出すラッパースクリプト

• 処理系の差異を吸収


• いろいろ良きに計らってくれる


• (Perl製)
Shellyまとめ

• Common
     Lispの関数をシェルコマンドのように
 実行するラッパー
 •   ルールを覚えれば簡単

 •   shly ql:quickload :clack → (ql:quickload :clack)

 •   -L すると、同名のパッケージのシンボルはパッケージ名不要

 •   cl, cl-user, shellyパッケージはパッケージ指定不要


• CL処理系のオプション差異を吸収
Shellyのインストール

(ql:quickload :shelly)
(shelly:install)

                           or

curl -L http://xrl.us/shly | LISP_IMPL=ccl perl - install


     ※Kyoto.lispにQuicklispのアップデートが間に合いませんでした
      明日以降またお試しください
    ※インストール前に(ql:update-all-dists)でQuicklispを最新にしてください
使用例
使用例1 : Quicklisp & ASDF

$ shly ql:update-all-dists --prompt nil
$ shly ql:system-apropos clack
$ shly asdf:test-system :clack
使用例2 : Drakma


$ shly -Ldrakma http-request http://www.hatena.ne.jp/
使用例3 : CL-Project


$ shly -Lcl-project make-project ~/src/sampleapp
使用例4 : Clack


$ shly -Lclack clackup app.lisp --port 3000
$ shly -Lclack clack.app.directory:start-server
ライブラリを作るだけで
関数がシェルコマンドに
ライブラリを作らなくても
関数がシェルコマンドに
自分のコマンドを追加



• shly   hogehoge で何か実行させたい

• cl-userに関数を追加するだけ!!!!
自分のコマンドを追加
 • .ccl-init.lisp   に install-from-github を追加

(defun install-from-github (username repos)
  (zerop
   (asdf:run-shell-command
    "git clone https://github.com/~A/~A.git ~~/quicklisp/local-projects/~:*~A"
    username repos)))




 • shly   install-from-github fukamachi clack
Enjoy Scripting
with Common Lisp!!
おわり
おわり
• ご清聴ありがとうございました。




          id:nitro_idiot
      fukamachi.github.com

More Related Content

What's hot

20140930 anything as_code
20140930 anything as_code20140930 anything as_code
20140930 anything as_codeSugawara Genki
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能mametter
 
serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Pythonserverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Pythonmasahitojp
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Sugawara Genki
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
わかってるフレームワーク Laravel
わかってるフレームワーク Laravelわかってるフレームワーク Laravel
わかってるフレームワーク LaravelMasashi Shinbara
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Nobuhiro Nakashima
 
Heroku で作る
スケーラブルな 
PHP アプリケーション
Heroku で作る
スケーラブルな 
PHP アプリケーションHeroku で作る
スケーラブルな 
PHP アプリケーション
Heroku で作る
スケーラブルな 
PHP アプリケーションMasashi Shinbara
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
Azure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーションAzure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーションMasashi Shinbara
 
Lightweight C#
Lightweight C#Lightweight C#
Lightweight C#将 高野
 

What's hot (20)

20140930 anything as_code
20140930 anything as_code20140930 anything as_code
20140930 anything as_code
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
 
serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Pythonserverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Python
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
いまどきのPHP
いまどきのPHPいまどきのPHP
いまどきのPHP
 
わかってるフレームワーク Laravel
わかってるフレームワーク Laravelわかってるフレームワーク Laravel
わかってるフレームワーク Laravel
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話
 
Akka stream
Akka streamAkka stream
Akka stream
 
Ppl
PplPpl
Ppl
 
Heroku で作る
スケーラブルな 
PHP アプリケーション
Heroku で作る
スケーラブルな 
PHP アプリケーションHeroku で作る
スケーラブルな 
PHP アプリケーション
Heroku で作る
スケーラブルな 
PHP アプリケーション
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
Azure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーションAzure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーション
 
Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集
 
Akka HTTP
Akka HTTPAkka HTTP
Akka HTTP
 
Lightweight C#
Lightweight C#Lightweight C#
Lightweight C#
 

Viewers also liked

Mito, a successor of Integral
Mito, a successor of IntegralMito, a successor of Integral
Mito, a successor of Integralfukamachi
 
Woo: Writing a fast web server
Woo: Writing a fast web serverWoo: Writing a fast web server
Woo: Writing a fast web serverfukamachi
 
Woo: Writing a fast web server @ ELS2015
Woo: Writing a fast web server @ ELS2015Woo: Writing a fast web server @ ELS2015
Woo: Writing a fast web server @ ELS2015fukamachi
 
Clack: glue for web apps
Clack: glue for web appsClack: glue for web apps
Clack: glue for web appsfukamachi
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parserfukamachi
 
Redesigning Common Lisp
Redesigning Common LispRedesigning Common Lisp
Redesigning Common Lispfukamachi
 
Dexador Rises
Dexador RisesDexador Rises
Dexador Risesfukamachi
 
Building GUI App with Electron and Lisp
Building GUI App with Electron and LispBuilding GUI App with Electron and Lisp
Building GUI App with Electron and Lispfukamachi
 
GaucheでCGIプログラミング
GaucheでCGIプログラミングGaucheでCGIプログラミング
GaucheでCGIプログラミングKazuhiro Hishinuma
 
Mongo dbのgridfsについて
Mongo dbのgridfsについてMongo dbのgridfsについて
Mongo dbのgridfsについてMasahiro Saito
 
自分をClojure化する方法
自分をClojure化する方法自分をClojure化する方法
自分をClojure化する方法fukamachi
 
JavaからClojure、そして夢の世界へ
JavaからClojure、そして夢の世界へJavaからClojure、そして夢の世界へ
JavaからClojure、そして夢の世界へfukamachi
 
第四回関西Emacs「ari.el」
第四回関西Emacs「ari.el」第四回関西Emacs「ari.el」
第四回関西Emacs「ari.el」fukamachi
 
Clack & Caveman
Clack & CavemanClack & Caveman
Clack & Cavemanfukamachi
 
Lisperの見る世界
Lisperの見る世界Lisperの見る世界
Lisperの見る世界fukamachi
 
Lispで仕事をするために
Lispで仕事をするためにLispで仕事をするために
Lispで仕事をするためにfukamachi
 
Gaucheで本を作る
Gaucheで本を作るGaucheで本を作る
Gaucheで本を作るguest7a66b8
 

Viewers also liked (20)

Mito, a successor of Integral
Mito, a successor of IntegralMito, a successor of Integral
Mito, a successor of Integral
 
Woo: Writing a fast web server
Woo: Writing a fast web serverWoo: Writing a fast web server
Woo: Writing a fast web server
 
Woo: Writing a fast web server @ ELS2015
Woo: Writing a fast web server @ ELS2015Woo: Writing a fast web server @ ELS2015
Woo: Writing a fast web server @ ELS2015
 
Clack: glue for web apps
Clack: glue for web appsClack: glue for web apps
Clack: glue for web apps
 
Lisp Poetry
Lisp PoetryLisp Poetry
Lisp Poetry
 
About Clack
About ClackAbout Clack
About Clack
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parser
 
SBLint
SBLintSBLint
SBLint
 
Redesigning Common Lisp
Redesigning Common LispRedesigning Common Lisp
Redesigning Common Lisp
 
Dexador Rises
Dexador RisesDexador Rises
Dexador Rises
 
Building GUI App with Electron and Lisp
Building GUI App with Electron and LispBuilding GUI App with Electron and Lisp
Building GUI App with Electron and Lisp
 
GaucheでCGIプログラミング
GaucheでCGIプログラミングGaucheでCGIプログラミング
GaucheでCGIプログラミング
 
Mongo dbのgridfsについて
Mongo dbのgridfsについてMongo dbのgridfsについて
Mongo dbのgridfsについて
 
自分をClojure化する方法
自分をClojure化する方法自分をClojure化する方法
自分をClojure化する方法
 
JavaからClojure、そして夢の世界へ
JavaからClojure、そして夢の世界へJavaからClojure、そして夢の世界へ
JavaからClojure、そして夢の世界へ
 
第四回関西Emacs「ari.el」
第四回関西Emacs「ari.el」第四回関西Emacs「ari.el」
第四回関西Emacs「ari.el」
 
Clack & Caveman
Clack & CavemanClack & Caveman
Clack & Caveman
 
Lisperの見る世界
Lisperの見る世界Lisperの見る世界
Lisperの見る世界
 
Lispで仕事をするために
Lispで仕事をするためにLispで仕事をするために
Lispで仕事をするために
 
Gaucheで本を作る
Gaucheで本を作るGaucheで本を作る
Gaucheで本を作る
 

Similar to Shelly

OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
Clojureの発表など
Clojureの発表などClojureの発表など
Clojureの発表などKikuta Go
 
cl-waffe2 実装
cl-waffe2 実装cl-waffe2 実装
cl-waffe2 実装hiketteinya
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テストTakahiro Moteki
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”Shinnosuke Asahara
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合hiboma
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたatk1234
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 

Similar to Shelly (16)

OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Clojureの発表など
Clojureの発表などClojureの発表など
Clojureの発表など
 
cl-waffe2 実装
cl-waffe2 実装cl-waffe2 実装
cl-waffe2 実装
 
Leiningen超速入門
Leiningen超速入門Leiningen超速入門
Leiningen超速入門
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Yomitanpm 6
Yomitanpm 6Yomitanpm 6
Yomitanpm 6
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
Packagist
PackagistPackagist
Packagist
 
ALPSチュートリアル(7) アプリケーションのALPS化
ALPSチュートリアル(7) アプリケーションのALPS化ALPSチュートリアル(7) アプリケーションのALPS化
ALPSチュートリアル(7) アプリケーションのALPS化
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみた
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 

Shelly

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. 京都のはてなという会社の、\n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n