8. インターネットのプログラミング
SFCのScrapbox
本日のトピック
Webのしくみ
サーバのプログラミング
ブラウザのプログラミング
IoT次代のプログラミング
インターネット = Web?
現状ではほぼインターネット ≈ Web
ネットプログラミング ≈ Webプログラミング
Webのプログラミング
Webサービスで提供
サーバ上のプログラミング
ブラウザ上のプログラミング
ユーザが作成
サーバ上のユーザプログラミング
ブラウザ上のユーザプログラミング
Webを支える技術
http://www.amazon.co.jp/dp/4774142042/ http://gyazo.com/458ebc9b45cd38cfe36a3dc16380b033.png
Webアクセスの基本
http://gyazo.com/4fe5e73511ea1909e61e437e06a50056.png
ブラウザの基本動作
RFC2616
code:brouserloop.txt
while true do
1. ユーザがブラウザを操作
2. GET, POSTリクエストをブラウザがサーバに送る
3. サーバからの返事を待つ
4. サーバから返されたHTMLを表示する
end
基本動作の場合
プログラミングは不要
Webサーバ(Apache, nginx, etc.)とブラウザ(Chrom, Firefox, etc.)が勝手にやってくれる
初期のWebはこれだけ
プログラムを動かすことができない
CGIプログラムの利用
ユーザがブラウザを操作
ブラウザがサーバにCGIのURL+引数(データ)を送る
GET, POST
サーバが送られたデータを解釈
サーバがCGIプログラムを起動
CGIプログラムが何かの計算を実行
計算結果をサーバがブラウザに送る
ブラウザの表示を更新する
GET の例
http://localhost/~masui/calc.html https://gyazo.com/64366bc955d84addbf4fb68290af1ab5
code:calc.html
<form action="./calc.cgi" method="get">
<input type="text" name="exp">
<input type="submit">
</form>
サーバに送られる文字列
code:get.txt
GET /calc.cgi?exp=3%2B4 HTTP/1.1
Host: pitecan.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.8) Gecko/2009032608 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 300
Connection: keep-alive
Webの通信
http://gyazo.com/4fe5e73511ea1909e61e437e06a50056.png
POST の例
code:post.html
<form action="./calc.cgi" method="post">
<input type="text" name="exp">
<input type="submit">
</form>
サーバに送られる文字列
code:post.txt
POST /calc.cgi HTTP/1.1
Host: pitecan.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.8) Gecko/2009032608 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
color=yellow>exp=3%2B4
CGIプログラムに渡される情報
環境変数のリスト
code:envvars.txt
HTTP_USER_AGENT Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.8) Gecko/2009032608 Firefox/3.0.8 HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 PATH /sbin:/usr/sbin:/bin:/usr/bin SERVER_SIGNATURE <address>Apache/2.2.9 (Fedora) Server at pitecan.com Port 80</address> Webの通信
http://gyazo.com/4fe5e73511ea1909e61e437e06a50056.png
CGIプログラム
データベースにアクセスして情報を取得/変更
e.g. Amazon, Google, ...
あらゆる計算
Webサーバが返す形式の例
code:http;txt
Http/1.1 200 OK
Date: Sun, 11 Jan 2004 16:06:23 GMT
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT
ETag: "1dba6-131b-3fd31e4a"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
579
Webの通信
http://gyazo.com/4fe5e73511ea1909e61e437e06a50056.png
Webサーバの仕事
クライアントからの要求を解析
必要があればCGIプログラムを呼び出し、その出力をクライアントに返す
またはJavaサーブレットなどを動かし、その出力をクライアントに返す
CGIプログラムがやるべきこと
1. ユーザからの要求を解釈
2. 何らかの計算
3. 結果をHTMLなどの形式に変換してサーバに返す
CGIプログラムの作り方
自力で全部作る
ライブラリを活用しまくる
フレームワークを使う
全部自分で書く場合
code:calc.rb
# Get request string
if method == 'GET' then
elsif method == 'POST' then
end
# Calculation
data =~ /exp=(.*)$/
exp = $1.sub(/%(..)/){ $1.pack('H*') } result = eval(exp)
# Output
print "Content-type: text/plain\r\n\r\n"
print "#{result}\r\n"
ライブラリを使う場合
code:cgi.rb
require 'cgi'
cgi = CGI.new('html3')
result = eval(exp)
cgi.out { result.to_s }
Angular (Javascript)
React.js (Javascript)
Vue.js (Javascript)
面倒なプログラミングを簡単化する
Webサーバプログラミングの面倒なところ
パラメタの解釈
HTMLの出力
状態の保持
ログイン情報の保持、etc.
データベースの扱い
フレームワークでこれらを解決
WebObjects
https://gyazo.com/27487c266e35c7abbfc72858080f6b2e
1996 世界初のアプリケーションサーバとしてNeXTが開発
アップルがNeXT買収 WebObjectsは5万ドル
2000 699ドル(!)に値下げ
2001 OSX Server販売により実質無料に
2006 開発ツール終焉
2007 Rails環境がMacに標準装備
2008 Appleが提供中止
WebObjects
https://www.youtube.com/watch?v=DmCu97u35Ek
フレームワークがやってくれること
DBアクセス
O/Rマッピング
HTMLテンプレート
URLマッピング
その他
認証、セキュリティ
セッションの保持
Ajax対応
キャッシュ処理
Sinatraの利用例
code:sinatra.rb
require 'sinatra'
get '/' do
'Hello world!'
end
Sinatraの利用例
code:sinatra.rb
require 'sinatra'
get '/' do
'Hello world!'
end
get '/hello/:name' do
end
PaaS
Platform as a Service
SinatraやRailsを動かす場所を提供
フレームワークの問題点
重厚長大
様々なシステムが必要
Ruby, SQL, ...
本質的でない沢山のことを覚える必要がある
特殊な記法、コンベンション
遅い場合もある
いろんな処理をするので直書きよりは遅い
でも泣きながら使うことになる
e.g. LaTeX
単純なフレームワークに人気が出てきている
e.g. Sinatra, Express
最近のWebサービス開発
✖ 自前サーバ
✖ レンタルサーバ
GitHub + heroku
Twelve-factor App
最近のWebサービス開発のオキテ
https://gyazo.com/3c4c514d780d3c35674cb460e34c4aa7 https://12factor.net/ja/
どういう運用が良いか?
Apache + mod_passenger + Sinatra
簡単に立ち上げ
Apache + mod_passenger + Rails
ユーザが多い
重厚長大
Nginx
Nginx + Express (Node.js)
Puma
単純にWebサーバを立ち上げる
Firebase
Heroku
最近のトレンド
Node.js
Deno
ブラウザのプログラミング
見栄えを奇麗に
反応をよくする = なめらかなインタフェース
高速動作
ページ遷移をなくす
普通のアプリケーションのようなものをブラウザ上で動かす
反応をよくするにはローカルにプログラムを動かすしか方法はない
クライアントのプログラミングシステム
ブラウザ表示データを操作するもの
JavaScript
ブラウザと無関係にプログラムを動かすもの
プラグイン
Flash
Java
サーバと通信する機能がある
JavaScriptの歴史
1995 Introduced on Netscape 2.0
1996 Used on IE
1997 Standardized as EcmaScript
2005 Ajax
2015 ES2015 (ES6)
Flash / ActionScriptの歴史
MacroMediaが開発
1999 Flash4
2000 ActionScript1 ECMAScriptベース
2003 ActionScript2
2005 Adobeが買収
2006 ActionScript3
2020 終了予定
Javaの歴史
1992 OAK by James Gosling
1994 Sunから公開 Gosling, Joy, etc.
1998 Java2
2004 J2SE 5.0
2006 Java SE 6
サーバとブラウザの役割分担
サーバ
データベースアクセス
データ共有
ブラウザ
なめらかなUI
簡単な計算
サーバに送りたくない情報計算
なめらかなインタフェースを実現するプログラミング
Ajaxのようなテクニックを利用
サーバとクライアントのプログラミングの融合
サーバとクライアントの分担例
検索データはサーバ上にある
ズーミングはローカルに実行
サーバ側の処理
データベースのフィルタリング
マッチした結果を返す
クライアント側の処理
ズーミング操作に追従
必要に応じてサーバにデータ要求
Webプログラミングの難しいところ
サーバとブラウザの両方のプログラミングが必要
並列計算が必要
同期/非同期
バッドノウハウの勉強が必要
Scrapbox上でのプログラミング
https://gyazo.com/25d2b66b69505b6764ad86729f8d3455 https://scrapbox.io/prog-exercises/
Web上のユーザプログラミング
ブラウザ上のJavaScriptプログラミング
ブックマークレット
Greasemonkey
Chickenfoot
ブラウザ上の例示プログラミング
iMacros
CoScripter
サーバ上のプログラミング
Yahoo! Pipes
ブックマークレット
JavaScriptプログラムをブックマークに登録
必要なときユーザが呼び出す
Demo: Bookmarklet
https://gyazo.com/589bd38d7bb7140a81967460f70443c2
Greasemonkey
Firefoxのアドオン
ページ表示のたびにJavaScriptを実行
ブラウザ拡張機能
ページの機能を追加
以前は作るのが大変だったが最近は楽になった
https://gyazo.com/ae2a5c9aa39a00a1235802c065f1ba29
ブラウザ拡張機能の例
Gyazo
Gyaon
Chaim
Javascriptプログラミング
ほぼ何でもできる
かなりのプログラミング知識が必要
エンドユーザプログラミング
JavaScript
オブジェクト思考
関数型プログラム
MITで開発
JavaScriptを拡張した言語でFirefoxを操作
HTMLを意識しないプログラミングが可能
JavaScriptプログラミングの敷居を下げる
開発者の主張
PC環境にはExcelのような優れたエンドユーザプログラミング環境があるのに、ブラウザ上には存在しない
JavaScriptを使うにはHTMLの中身をよく知る必要がある
ページの見栄えをベースにプログラミングしたい
JavaScriptで扱う対象
http://gyazo.com/875f5c57f5918afadead901f4e257155.png
Chickenfootで扱う対象
http://gyazo.com/6471c331aa6672042664913f5cba60ab.png
Chickenfootプログラミングの例
不動産サイトで家を捜し、自宅からの距離をGoogleMapsで調べる
ダンキンドーナツやマクドナルドに近いことを確認
Video: Chickenfoot
insert(after('Chickenfoot'),"!!!")
https://www.youtube.com/watch?v=5wXWMuYM37s
Web上での例示プログラミング
iMacros
CoScripter
Sikuli
ユーザ操作を記録
再生が可能
Video: iMacros
http://www.youtube.com/watch?v=OHedT2hRL4Y
IBM Researchで開発
Eager, StagecastのAllen Cyper氏
Firefox上の記録と再生
記録したスクリプトを柔軟に編集可能
Video: CoScripter
http://www.youtube.com/watch?v=TyQPwPgbRZQ
ビットマップパタンマッチであらゆるGUI操作を実行
Video: Sikuli
http://www.youtube.com/watch?v=FxDOlhysFcM
Web上の例示プログラミングの現状
インストールも利用も面倒
手間に見合うかどうかは微妙
Dynamic Macroぐらい楽に使えるものが望まれる
Yahoo! Pipes
サーバ上でマッシュアッププログラミング
ビジュアルプログラミングを利用
http://gyazo.com/fc4471a1378102c027ed7de43fac4e16.png
LindaによるWebプログラミング
Webサーバ上でデータ共有/同期
様々なWeb情報と実世界デバイスが通信
Linda
タプル(データ組)をタプル空間(共有空間)でやりとりする
4種類のプリミティブで同期とデータ交換を実現
out -- タプルをタプル空間に書き出す。
in -- タプルをタプル空間から読む。タプルは消去する。
rd -- タプルをタプル空間から読む。タプルは消去しない。
eval -- プロセスを生成する。
http://gyazo.com/5c79a78e3de1dcec20999cedfc5ddfad.png
Web-Linda
https://www.slideshare.net/shokai/prosym-node-linda https://gyazo.com/716da53b338a9c47e40bf79176fb78a2
センサ情報取得
LindaによるWeb上の通信
"say", "hello" というタプル
"door", "open" というタプル
Lindaを使うプログラミング
エンドユーザプログラミングは流行りつつある?
まとめ
様々なWebプログラミングが可能
様々な工夫が可能
プログラマにとって面白い時代
将来は標準品に収束するかも
Linda servers
Conclusions
Various Web programming possible
Various systems appearing everyday
Interesting for programmers
Standardization expected